【问题标题】:Notification when Windows Dialog is openedWindows 对话框打开时的通知
【发布时间】:2009-12-22 08:42:33
【问题描述】:

我想在打开特定对话框时进行一些处理,但我无法找到在打开该对话框时获取通知的任何方法。

有没有办法在应用程序中获得打开特定窗口对话框的通知?

关于对话框的唯一可用信息是它的标题和它的唯一性。

【问题讨论】:

  • 模态还是非模态?在你的过程中?为什么您不知道对话框在它打开之前被打开?
  • 它是一个模态对话框,不在我的进程中。我只想在它打开后收到通知。
  • 我很确定你也知道窗口类。启动 Spy++ 进行验证,看看它是否也是唯一的。使用窗口类可能会更加健壮。

标签: c++ winapi dialog


【解决方案1】:

一般的解决方案是使用 windows 钩子,过滤到 WH_CBT,过滤到 WM_CREATE 或类似的东西,获取窗口文本,看看它是否是您感兴趣的。

更重要的一点:在钩子中,您应该使用 SetWindowLongPtr() 将窗口进程设置为您自己的函数,该函数实际上将接收 WM_CREATE 事件。在所有调用中,此函数都应调用原始窗口过程。

【讨论】:

  • -1,WH_CALLWINDOWPROC 是解决这个问题的坏方法。您基本上必须在系统范围内收听每个窗口消息,因为您唯一的选择是本地挂钩(在这里不起作用)或全局挂钩。您不妨在 FindWindow 上创建一个线程和 SPIN,这比在系统范围内收听每个发送消息要便宜。
  • 是的。对不起,这绝对不是 WH_CALLWNDPROC。 WH_CBT 就是我想说的。
【解决方案2】:

您还可以使用CBT Hook 来查看窗口创建消息。您将可以访问用于创建实际窗口的 CREATSTRUCT,例如标题和类名。您可以阻止在您的钩子中创建窗口,修改大小等。

【讨论】:

  • 只有在创建窗口时设置了窗口标题时才有效。这不太可能。
  • 这取决于他在寻找什么。除了标题之外,还有更多方法来标识窗口,例如,通过 ID、类名和父级等...
【解决方案3】:

编辑:抱歉没有注意到您自己没有代码,只有标题。所以我认为其他帖子解决方案是您需要的

win32 应用程序中的事件处理是通过所谓的 windows 过程完成的,它是一个具有以下签名的回调函数:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

每当有使用此回调函数注册的窗口的消息时,窗口都会调用此回调。发送到新窗口的第一批消息之一是 WM_CREATE 消息。

如果您使用 win32 API“手动”创建窗口,那么应该有一个静态回调函数,如下所示,您可以在其中过滤 WM_CREATE 消息。

LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
  switch( message )
  {
    case WM_CREATE:
      // do what ever you want 
      return 0;

    case default:
      return DefWndProc( hwnd, message, wParam, lParam );

  }
}

如果您使用 MFC 对话框 (CDialog),那么您可以覆盖函数 CDialog::OnInitDialog()

【讨论】:

    【解决方案4】:

    好的,方法是使用SetWindowsHookEx(WH_SYSMSGFILTER,...) 你会得到比你真正需要的更多的回调。和全局钩子是系统性能的真正消耗(它们可以强制系统序列化通常独立运行的东西)

    请务必阅读备注,尤其是这部分:

    SetWindowsHookEx 可用于将 DLL 注入另一个进程。 32位DLL不能注入64位进程,64位DLL不能注入32位进程。如果应用程序需要在其他进程中使用钩子,则需要 32 位应用程序调用 SetWindowsHookEx 将 32 位 DLL 注入 32 位进程,64 位应用程序调用 SetWindowsHookEx 将 64 位DLL 转换为 64 位进程。 32 位和 64 位 DLL 必须具有不同的名称。

    你的钩子必须存在于一个 dll 中,并且 dll 最终会被加载到其他进程的地址空间中,所以你不会无法访问你的进程的地址空间,你必须设置某种你的钩子和你的应用程序之间的进程间通信。

    总的来说,我认为这听起来是个非常糟糕的主意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      • 2016-03-14
      • 2014-10-08
      相关资源
      最近更新 更多