自定义控件和Windows消息

ste*_*nix 0 c windows hook winapi

我在纯Windows API中进行了自定义Splitter控件.它由4个控件组成:主容器,分离器和2个窗格.

现在我需要挂钩到windows程序,以便找出其中一个子控件正在移动或调整大小,所以我使用了SetWindowsHookEx.我在我的钩子程序中得到WM_SIZE消息就好了,但是没有从我的Splitter的子窗口中捕获WM_MOVE消息.

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

那我在这里错过了什么?我需要将什么添加到我的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 ("!");
}    
Run Code Online (Sandbox Code Playgroud)

在主窗口的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
Run Code Online (Sandbox Code Playgroud)

Ray*_*hen 5

  1. 窗户挂钩在这里有点过头了.子类化效率更高.
  2. 当窗口过程将WM_WINDOWPOSCHANGED消息传递给DefWindowProc时,才会生成WM_MOVE .如果您无法保证,那么您无法保证WM_MOVE消息.听WM_WINDOWPOSCHANGED.