65.9K
CodeProject 正在变化。 阅读更多。
Home

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

2009年4月8日

CPOL

2分钟阅读

viewsIcon

27304

如何程序化地打开 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"));
}
© . All rights reserved.