【问题标题】:C++: Trying to hook a message box and change its positionC++:试图钩住一个消息框并改变它的位置
【发布时间】:2014-02-25 05:44:02
【问题描述】:

我最近开始使用 C++ 进行编码,我对它非常陌生。 (我更经常使用 Javascript、PHP、Java 和 Obj-C 编写代码)

我正在练习如何钩住一个消息框并改变它的位置。这就是我的 .cpp 文件中的内容(在阅读 this SO post 之后)。

#include <iostream>
#pragma comment(lib,"User32.lib")
#include <windows.h>

HHOOK hhookCBTProc = 0;

LRESULT CALLBACK pfnCBTMsgBoxHook(int nCode, WPARAM wParam, LPARAM lParam){
  if (nCode == HCBT_CREATEWND)
  {
    CREATESTRUCT *pcs = ((CBT_CREATEWND *)lParam)->lpcs;
    if ((pcs->style & WS_DLGFRAME) || (pcs->style & WS_POPUP))
    {
      HWND hwnd = (HWND)wParam;
      SetWindowPos(hwnd, HWND_TOP,130,122, 0, 0,SWP_NOSIZE); 
    }
  }
  return (CallNextHookEx(hhookCBTProc, nCode, wParam, lParam));
}

int main(void)
{
  hhookCBTProc = SetWindowsHookEx(WH_CBT,pfnCBTMsgBoxHook, 
                                0, GetCurrentThreadId());
  int sResult = MessageBox ( NULL, "Hooked!", "oh my", MB_OK );
  UnhookWindowsHookEx(hhookCBTProc);
  return 0;

}

由于某种原因,消息框的位置没有改变。哪里出错了?

(我知道我可以创建自定义窗口或对话框。但我这样做是因为我想学习如何挂钩消息框以及我做错了什么。)

【问题讨论】:

    标签: c++ windows winapi hook


    【解决方案1】:

    首先你应该在调试器中检查你的钩子实际上被调用了,如果你还没有调用的话。

    其次,在HCBT_CREATEWND钩子事件被触发时,窗口才刚刚被创建——系统还没有调整它的大小和位置。它将使用CREATESTRUCT after 钩子返回的值执行此操作 - 覆盖您的 SetWindowPos 调用。

    请参阅 MSDN 中的 docs,了解此特定挂钩事件的 lParam 值:

    指定一个指向 CBT_CREATEWND 结构的长指针,该结构包含 窗口的初始化参数。参数包括 窗口的坐标和尺寸。通过改变这些 参数,CBTProc 挂钩程序可以设置初始大小和 窗口的位置。

    因此,使用这个钩子改变窗口位置的正确方法是直接修改CREATESTRUCT中的值。

    另请注意,对话框管理器很有可能会在创建之后调整窗口大小和位置,因此如果您发现这仍然不适合您,您可能需要尝试观察HCBT_MOVESIZE 事件。

    【讨论】:

    • 谢谢!我现在明白了!但是我太笨了,不知道如何直接修改它。你能详细说明一下吗?非常感谢!
    • 例如((LPCBT_CREATEWND)lParam)-&gt;lpcs-&gt;x = 130;
    • 哦,非常感谢!!所以它可以通过这种方式访问​​:) 太棒了!非常感谢!但似乎以这种方式重新定位窗口会影响其中内容(文本)的位置。我应该如何将内容对齐到中心/它曾经的位置?
    【解决方案2】:

    来自docs

    在 HCBT_CREATEWND 通知时,窗口已经 已创建,但其最终大小和位置可能尚未确定 并且它的父窗口可能还没有建立。

    也许尝试连接到 CBT_ACTIVATE。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      • 1970-01-01
      • 2014-10-02
      • 1970-01-01
      相关资源
      最近更新 更多