Well, you can open popup blocker settings window of IE programmatically with the help of "DisplayPopupWindowManagementDialog
" function in the "C:\WINDOWS\system32\inetcpl.cpl".
But here, rather than just showing a mysterious function, I would like to explain the methods by which I found out the name of the function.
This question was asked by someone on Codeproject and at that time, I was also unaware of any function for this. However, I found it interesting, so just decided to have a try.
At first, I took this "Popup Blocker Settings " dialog in Internet Explorer. My first intention was to find out the DLL name which created the dialog. There is an application called WinID[^] with which we can find which DLL created a particular window. In one of my previous posts, I explained How to find which DLL / EXE created a window [^] using code. Below is a screenshot of what WinID
showed me for the "Popup Blocker Settings" dialog.
It told me that "USER32.dll" has created the dialog. Liar... I was very sure that user32.dll isn't the real DLL behind it. So this technique to find the DLL didn't really work. So I had to find another way...
Every window has a thread associated with it. If you have the window handle, you can easily retrieve the thread Id associated with it using the GetWindowThreadProcessId
function. Anyway, I am not going to code for this. Tools like spy++, WinID
display the thread id of the window if we select a window using it. So the Thread ID displayed in Spy++ was 0xB94
(2964
in decimal).
If we took the properties of a process in the process explorer, it will list all the threads in the process and each thread's call stack. So the thing next to do is to select the iexplorer process, select the thread with ID 2964
and take its call stack.
And in the call stack, there was only one unfamiliar DLL and function, the "inetcpl.cpl" and the DisplayPopupWindowManagementDialog
function in it. So I found out the "inetcpl.cpl" file in the system32 folder and when double clicked on it, huiii it shows the "internet options" dialog.
The control panel files (.cpl), are just a DLL with a some special export functions (If you want to know more about control panel files, I suggest you read Paul DiLascia's Q&A[^] article). With the dependency walker, I confirmed the presence of DisplayPopupWindowManagementDialog
in it. But to call this function, I need to find how it is declared, what are all the arguments, etc. Fortunately, someone else has already documented the function proto and with a Google search, I was able to find it out. Happy ending!!!!
And ho ya, here is the sample code:
typedef BOOL (WINAPI *DisplayPopupWindowP)( HANDLE hWnd, LPCTSTR lpCaption );
void CDialogBasedDlg::OnBnClickedButton1()
{
HMODULE hModule = LoadLibrary( _T("inetcpl.cpl") );
DisplayPopupWindowP DisplayPopupWindowManagementDialog =
( DisplayPopupWindowP)GetProcAddress(hModule,
"DisplayPopupWindowManagementDialog" );
if( !DisplayPopupWindowManagementDialog )
{
return; }
DisplayPopupWindowManagementDialog( m_hWnd,
_T("www.Sitetounblock.com"));
}