C++;:尝试挂起消息框并更改其位置 我最近开始用C++编写代码,对它很陌生。(我经常使用Javascript、PHP、Java和Obj-C编写代码)

C++;:尝试挂起消息框并更改其位置 我最近开始用C++编写代码,对它很陌生。(我经常使用Javascript、PHP、Java和Obj-C编写代码),c++,windows,winapi,hook,C++,Windows,Winapi,Hook,我正在练习如何钩住一个消息框并改变它的位置。这是我的.cpp文件中的内容(阅读后) #包括 #pragma注释(lib,“User32.lib”) #包括 HHOOK hhookCBTProc=0; LRESULT回调pfnCBTMsgBoxHook(int-nCode、WPARAM-WPARAM、LPARAM-LPARAM){ 如果(nCode==HCBT_CREATEWND) { CREATESTRUCT*pcs=((CBT_CREATEWND*)lParam)->lpcs; if((PC-

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

#包括
#pragma注释(lib,“User32.lib”)
#包括
HHOOK hhookCBTProc=0;
LRESULT回调pfnCBTMsgBoxHook(int-nCode、WPARAM-WPARAM、LPARAM-LPARAM){
如果(nCode==HCBT_CREATEWND)
{
CREATESTRUCT*pcs=((CBT_CREATEWND*)lParam)->lpcs;
if((PC->style&WS|DLGFRAME)| |(PC->style&WS|u弹出窗口))
{
HWND HWND=(HWND)wParam;
设置窗口位置(hwnd,hwnd_TOP,130122,0,0,SWP_NOSIZE);
}
}
返回(CallNextHookEx(hhookCBTProc、nCode、wParam、lParam));
}
内部主(空)
{
hhookCBTProc=setWindowshookx(WH_CBT,pfnCBTMsgBoxHook,
0,GetCurrentThreadId());
int sResult=MessageBox(NULL,“Hooked!”,“oh my”,MB_OK);
UnhookWindowsHookEx(hhookCBTProc);
返回0;
}
由于某种原因,消息框的位置没有改变。哪里出了问题

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

来自

在发出HCBT_CREATEWND通知时,窗口已关闭 已创建,但其最终大小和位置可能尚未确定 其父窗口可能尚未建立


也许可以尝试连接到CBT_激活

首先,如果还没有调用钩子,那么应该在调试器中检查钩子是否确实被调用

其次,在触发
HCBT_CREATEWND
hook事件时,窗口才刚刚创建-系统尚未对其进行大小和定位。钩子返回后,它将使用
CREATESTRUCT
中的值执行此操作-覆盖您的
SetWindowPos
调用

有关此特定钩子事件,请参阅
lParam
值上的from MSDN:

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

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


还请注意,对话框管理器很可能在创建后调整窗口的大小和位置,因此如果您发现这仍然不适用于您,您可能需要尝试查看
HCBT\u MOVESIZE
事件。

谢谢!我现在明白了!但我太笨了,不知道如何直接修改它。你能详细说明一下吗?非常感谢!例如,
((LPCBT_CREATEWND)lParam)->lpcs->x=130哦,非常感谢!!所以可以这样访问:)太棒了!非常感谢!但是,以这种方式重新定位窗口似乎会影响其中内容(文本)的位置。我应该如何将内容对齐到中心/以前的位置?
#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;

}