WIN32 SDK - 捕获鼠标离开和滞留等事件 (转)

WIN32 SDK - 捕获鼠标离开和滞留等事件 (转)[@more@]

文章难易程度:初级

首先要了解 TrackMouseEvent  函数

此函数当鼠标指针离开或在特定时间内盘旋(滞留)在窗体时投递消息。参数指向 TRACKMOUSEEVENT 结构体。(详细定义及解释请查阅MSDN文档)

typedef struct tagTRACKMOUSEEVENT { Dword cbSize; //TRACKMOUSEEVENT size. DWORD dwFlags; //Specifies the services requested. HWND hWndtrack; //Specifies a handle to the window to track. DWORD dwHovertime; //hover time-out. } TRACKMOUSEEVENT, *LPTRACKMOUSEEVENT;

 
 

以下是原码:(注意要在属性页中链接器的导入库中加入 comctl32.lib )

 
 

//FileName: MouseLevel.c

 
 

#include <windows.h>
#include //必须导入此头文件

 
 


#ifndef APP_NAME
#define APP_NAME TEXT("My MouseHover test")
#endif

 
 


const int SUCCEED =0;

 
 

ATOM RegisterFormClass(HINSTANCE);
BOOL InitInstance(HINSTANCE,int);
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

 
 


int apiENTRY WinMain(HINSTANCE hInstance,
  HINSTANCE hPrevInstance,
  LPSTR lpCmdLine,
    int iCmdShow)
{
 MSG msg; 
 
 
 RegisterFormClass(hInstance);
 if(!InitInstance(hInstance,iCmdShow))
 return FALSE;
 
 while(GetMessage(&msg,NULL,0,0))
 {
 TranslateMessage(&msg);
 DispatchMessage(&msg);
 }
 
 return SUCCEED;
}

 
 

ATOM RegisterFormClass(HINSTANCE hInstance)
{
 WNDCLASSEX wcex;
 
 wcex.cbSize = sizeof(WNDCLASSEX);
 wcex.cbClsExtra = 0;
 wcex.cbWndExtra = 0;
 wcex.hbrBackground = (HBRUSH) GetStockobject(WHITE_BRUSH);
 wcex.hCursor = LoadCursor(NULL,IDC_ARROW);
 wcex.hIcon = LoadIcon(hInstance,IDI_APPLICATION);
 wcex.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
 wcex.hInstance = hInstance;
 wcex.lpfnWndProc = WndProc;
 wcex.lpszClassName = APP_NAME;
 wcex.lpszMenuName = NULL;
 wcex.style = CS_HREDRAW | CS_VREDRAW;
 
 return RegisterClassEx(&wcex);
}

 
 

BOOL InitInstance(HINSTANCE hInstance,int iCmdShow)
{
 HWND hWnd;
 
 hWnd = CreateWindowEx(WS_EX_APPWINDOW,
 APP_NAME,
 APP_NAME,
 WS_OVERLAPPEDWINDOW,
 CW_USEDEFAULT,
 CW_USEDEFAULT,
 CW_USEDEFAULT,
 CW_USEDEFAULT,
 NULL,
 NULL,
 hInstance,
 NULL);
 if (!hWnd)
 return FALSE;
 
 ShowWindow(hWnd,iCmdShow);
 UpdateWindow(hWnd);
 
 
 return TRUE;
}

 
 

LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
 switch(uMsg)
 {
 case WM_MOUSELEAVE:
 MessageBox(hWnd,TEXT("MouseLeave!"),TEXT("MouseLeave"),0);
 break;
 case WM_MOUSEHOVER:
 MessageBox(hWnd,TEXT("MouseHover"),TEXT("MouseHover"),0);
 break;
 case WM_NCMOUSELEAVE:
 MessageBox(hWnd,TEXT("MouseNClient!"),TEXT("MouseNClient!"),0);
 break;
 case WM_MOUSEMOVE: //因为 TRACKMOUSEEVENT 只发送一次消息,且随着其它消息产生而失效,所以在此消息中调用函数。

 
 

 TRACKMOUSEEVENT trmouse;
 trmouse.cbSize = sizeof(TRACKMOUSEEVENT);
 trmouse.dwFlags = TME_LEAVE | TME_HOVER | TME_NONCLIENT;
 trmouse.dwHoverTime = 2000;
 trmouse.hwndTrack = hWnd;
 
 if(!_TrackMouseEvent(&trmouse))
 return FALSE;
 
 break;
 
 case WM_DESTROY:
 PostQuitMessage(0);
 break;
 default:
 return DefWindowProc(hWnd,uMsg,wParam,lParam);
 break;
 }
 return SUCCEED;
}

 
 

//此文件是纯 win32 SDK 编写,不需要MFC等支持。可在DOS模式下编译。在WINDOWS98,2000下,VC6,VC7 BETA2中均编译通过且正确执行

 
 

 

 
 

 

 
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-990191/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-990191/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值