如何通过钩子挂接WM_MOUSEHOVER和WM_NCMOUSEHOVER?

XXKKFF 2007-05-01 12:33:43
我写的代码如下:
#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,最后一个回复讲了一下.
希望大家能再讲详细一点
...全文
460 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
XXKKFF 2007-05-02
  • 打赏
  • 举报
回复
我已经调用了TrackMouseEvent,看我的代码
mopyman 2007-05-02
  • 打赏
  • 举报
回复
WM_MOUSELEAVE也是如此

----------------
/********************************
*用linux上CSDN发帖也这么爽,哈哈
********************************/
mopyman 2007-05-02
  • 打赏
  • 举报
回复
WM_MOUSEHOVER消息并不会自动产生,系统默认是不产生这个消息的,你要在WM_MOUSEMOVE里自己产生,用TRACKMOUSEEVENT.

----------------
/********************************
*用linux上CSDN发帖也这么爽,哈哈
********************************/
XXKKFF 2007-05-01
  • 打赏
  • 举报
回复
解决了一个问题.通过WH_GETMESSAGE钩到了WM_MOUSEHOVER

但是为什么WH_MOUSE不行呢?

还有为什么TME_HOVER 和TME_NONCLIENT一起用会有问题?
XXKKFF 2007-05-01
  • 打赏
  • 举报
回复
XXKKFF 2007-05-01
  • 打赏
  • 举报
回复
挂接WM_MOUSEMOVE做什么?

没看明白
Y___Y 2007-05-01
  • 打赏
  • 举报
回复
挂接WM_MOUSEMOVE看看
WM_MOUSEHOVER实际上由WM_MOUSEMOVE产生

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧