如何通过钩子挂接WM_MOUSEHOVER和WM_NCMOUSEHOVER?
我写的代码如下:
#define WINVER 0X0500
#define _WIN32_WINNT 0X0500
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpszCmdLine,int nCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
TCHAR* szAppName = TEXT("MOUSEHOVER");
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wndclass.lpszClassName = szAppName;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.lpszMenuName = NULL;
wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS ;
wndclass.lpfnWndProc = WndProc;
wndclass.hInstance = hInstance;
if( !RegisterClass(&wndclass) )
return 0;
hwnd = CreateWindow(
szAppName,
szAppName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);
ShowWindow( hwnd,nCmdShow );
UpdateWindow( hwnd );
while( GetMessage(&msg,NULL,0,0) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK MouseProc( int nCode, WPARAM wParam, LPARAM lParam )
{
switch( wParam )
{
case WM_MOUSEHOVER:
MessageBox( ((PMOUSEHOOKSTRUCT)lParam)->hwnd, TEXT("mousehover hooked"), TEXT("mousehover"), MB_OK);
break;
case WM_NCMOUSEHOVER:
MessageBox( ((PMOUSEHOOKSTRUCT)lParam)->hwnd, TEXT("ncmousehover hooked"), TEXT("ncmousehover"), MB_OK);
case WM_LBUTTONDOWN:
MessageBox(((PMOUSEHOOKSTRUCT)lParam)->hwnd, TEXT("lbuttondown hooked"), TEXT("lbuttondown"), MB_OK);
break;
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
switch( message )
{
case WM_CREATE:
{
SetWindowsHookEx(WH_MOUSE,MouseProc,
((LPCREATESTRUCT)lParam)->hInstance,
GetCurrentThreadId());
return 0;
}
case WM_MOUSEMOVE:
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.dwFlags = TME_HOVER/* | TME_NONCLIENT*/;
tme.dwHoverTime = 500;
tme.hwndTrack = hwnd;
TrackMouseEvent(&tme);
return 0;
}
case WM_MOUSEHOVER:
MessageBox(hwnd, TEXT("mousehover"), TEXT("mouseHover"), MB_OK);
return 0;
case WM_NCMOUSEHOVER:
MessageBox(hwnd,TEXT("ncmouseHover"), TEXT("ncMouseHover"), MB_OK);
return 0;
case WM_LBUTTONDOWN:
MessageBox(hwnd,TEXT("lbuttondown"), TEXT("lbuttondown"), MB_OK);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc( hwnd, message, wParam, lParam );
}
只挂接到了WM_LBUTTONDOWN,没有挂接到WM_MOUSEHOVER.怎么才能挂接这两个消息?
还有,我把TME_HOVER和TME_NONCLIENT一起用时,连在窗口过程中的WM_MOUSEHOVER也没有了.在网上搜到这个帖子http://topic.csdn.net/t/20050304/16/3825225.html,最后一个回复讲了一下.
希望大家能再讲详细一点