自定义控件和窗口消息

标签 c windows winapi hook

我在纯 Windows API 中制作了自定义 Splitter 控件。它由 4 个控件组成:主容器、拆分器和 2 个 Pane 。

现在我需要挂接到 Windows 过程以查明其子控件之一何时移动或调整大小,因此我使用了 SetWindowsHookEx。我在我的 Hook 过程中收到了 WM_SIZE 消息,但没有 WM_MOVE 消息是从我的 Splitter 的子窗口中捕获的。

我尝试向 Groupbox 添加一个子窗口(我知道这不是它们应该使用的方式)只是为了查看 WM_MOVE 消息是否被 Hook 程序捕获,他们是。

那么我在这里缺少什么?我需要向我的 Splitter 窗口过程添加什么才能发送那些 WM_MOVE?还是我的错误在其他地方?

PS:SetWindowPos 确实在那些子窗口上起作用,它只是没有捕捉到 WM_MOVE

编辑:根据要求,这里是 Splitter 窗口类的完整代码:http://pastebin.com/Lgvb0Vfv

这是重要的代码部分:

LRESULT WINAPI AnchorProc(int nCode, WPARAM wParam, LPARAM lParam) {
    CWPRETSTRUCT* theMessage = (CWPRETSTRUCT*)lParam;

    if (theMessage->message == WM_MOVE) printf ("!");
}    

在主窗口的 WM_CREATE 之后的某个时间:

SetWindowsHookEx(WH_CALLWNDPROCRET,AnchorProc,NULL,GetCurrentThreadId());

// groupbox

HWND gb = CreateWindowEx(0,"button",NULL,BS_GROUPBOX|WS_CHILD,0,0,200,200,hwndMain,0,hInst,NULL);
HWND but = CreateWindowEx(0,"button",NULL,BS_PUSHBUTTON|WS_CHILD,0,0,40,40,gb,0,hInst,NULL);

// custom control

HWND split = CreateWindowEx(0,"FSplitterClass",NULL,WS_CHILD,200,0,200,200,hwndMain,0,hInst,NULL);
HWND pane1 = (HWND)SendMessage(split,WM_SPGETPANE,0,0);
HWND but1 = CreateWindowEx(0,"button",NULL,BS_PUSHBUTTON|WS_CHILD,0,0,40,40,pane1,0,hInst,NULL);

SetWindowPos(but, NULL, 1,1,0,0,SWP_NOSIZE|SWP_NOZORDER); // triggers WM_MOVE
SetWindowPos(but1, NULL, 1,1,0,0,SWP_NOSIZE|SWP_NOZORDER); // doesn't

最佳答案

  1. Windows Hook 在这里有点矫枉过正。子类化效率更高。
  2. WM_MOVE 仅生成 if the window procedure passes the WM_WINDOWPOSCHANGED message to DefWindowProc .如果你不能保证这一点,那么你就不能保证 WM_MOVE 消息。监听 WM_WINDOWPOSCHANGED。

关于自定义控件和窗口消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7126267/

相关文章:

c++ - 包含头文件时,路径是否区分大小写?

python - 控制台窗口失去焦点时如何检测按键

windows - 一旦被电源设置关闭,如何唤醒我的 Windows 显示器?

c - 将 malloc 与结构一起使用

c - 静态变量名称是否与 C 中允许的函数名称相同?

c++ - 在cpp中动态更改属性值

ruby - 如何从 ARGV 获取长文件名

c++ - 窗口最大化

c - "L"宏(?)是如何定义的?

c - 在 struct - C 中初始化数组?