程序化打开 Internet Explorer 弹出窗口阻止设置窗口的方法






4.71/5 (3投票s)
如何程序化地打开 IE 的弹出窗口阻止设置窗口?
好的,你可以通过在“C:\WINDOWS\system32\inetcpl.cpl”中使用“DisplayPopupWindowManagementDialog
”函数来程序化地打开 IE 的弹出窗口阻止设置窗口。
但是,在这里,我不想仅仅展示一个神秘的函数,而是想解释我找到函数名称的方法。
这个问题是有人在 Codeproject 上提出的,当时我也不知道有任何用于此目的的函数。然而,我觉得这很有趣,所以决定尝试一下。
首先,我打开了 Internet Explorer 中的“弹出窗口阻止设置”对话框。我的第一个想法是找到创建该对话框的 DLL 名称。有一个名为 WinID[^] 的应用程序,我们可以用它来找到哪个 DLL 创建了特定的窗口。在之前的文章中,我解释了 如何找到创建窗口的 DLL / EXE [^] 使用代码。以下是 WinID
为“弹出窗口阻止设置”对话框显示的内容的截图。
它告诉我“USER32.dll”创建了该对话框。谎言... 我很确定 user32.dll 不是其背后的真实 DLL。所以这种查找 DLL 的技术并没有真正起作用。因此,我不得不找到另一种方法...
每个窗口都有一个关联的线程。如果你有窗口句柄,你可以使用 GetWindowThreadProcessId
函数轻松检索与之关联的线程 ID。无论如何,我不会对此进行编码。像 spy++、WinID
这样的工具,如果我们使用它们选择一个窗口,会显示窗口的线程 ID。所以 Spy++ 中显示的线程 ID 是 0xB94
(十进制为 2964
)。
如果在进程资源管理器中获取一个进程的属性,它将列出进程中的所有线程以及每个线程的调用堆栈。所以下一步是选择 iexplorer 进程,选择 ID 为 2964
的线程并获取其调用堆栈。
在调用堆栈中,只有一个不熟悉的 DLL 和函数,即“inetcpl.cpl”及其中的 DisplayPopupWindowManagementDialog
函数。所以我找到了 system32 文件夹中的“inetcpl.cpl”文件,双击它,它会显示“Internet 选项”对话框。
控制面板文件(.cpl)只是一个带有某些特殊导出函数的 DLL(如果你想了解更多关于控制面板文件的信息,我建议你阅读 Paul DiLascia 的问答[^] 文章)。使用依赖性查看器,我确认了其中存在 DisplayPopupWindowManagementDialog
。但是要调用此函数,我需要找到它的声明方式、所有参数等。幸运的是,其他人已经记录了函数原型,我可以通过 Google 搜索找到它。大团圆结局!!!!
还有,这里是示例代码
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;//error
}
DisplayPopupWindowManagementDialog( m_hWnd,
_T("www.Sitetounblock.com"));
}