判断鼠标是否移到了窗口外

有两种方法了.

第一种就是用WM_TIMER,定时检查鼠标在什么地方.但效率比较低,不建议采用.

第二种就是用TrackMouseEvent.建议使用.具体用法参考MSDN

TRACKMOUSEEVENT event ;
  event.cbSize = sizeof( event );
  event.dwFlags = TME_LEAVE ;
  event.dwHoverTime = 0 ;
  event.hwndTrack = GetSafeHwnd() ;
  
  VERIFY (_TrackMouseEvent( &event )) ;

注意添加WM_MOUSELEAVE消息处理

LRESULT CStatList::OnMouseLeave( WPARAM wParam , LPARAM lParam )
{
rreturn 0 ;
}

ON_MESSAGE( WM_MOUSELEAVE , OnMouseLeave )

 

afx_msg LRESULT OnMouseLeave( WPARAM wParam , LPARAM lParam ) ;

 

在C语言中,我们可以使用Windows API来实现该功能。具体实现步骤如下: 1.包含Windows API的头文件`windows.h`。 ```c #include <windows.h> ``` 2.定义一个回调函数`PlaySoundCallback`,该函数用于播放音乐。 ```c void CALLBACK PlaySoundCallback( _In_ PVOID lpParameter, _In_ BOOLEAN TimerOrWaitFired ) { PlaySound("music.wav", NULL, SND_FILENAME | SND_ASYNC); } ``` 该函数使用`PlaySound`函数来播放音乐,其中第一个参数为音乐文件的路径,第二个参数为`NULL`表示使用默认的声音输出设备,第三个参数为`SND_FILENAME | SND_ASYNC`表示播放音乐文件并且异步播放。 3.定义一个回调函数`StopSoundCallback`,该函数用于停止播放音乐。 ```c void CALLBACK StopSoundCallback( _In_ PVOID lpParameter, _In_ BOOLEAN TimerOrWaitFired ) { PlaySound(NULL, NULL, NULL); } ``` 该函数使用`PlaySound`函数来停止播放音乐,其中第一个参数为`NULL`表示停止所有正在播放的声音。 4.在`WinMain`函数中创建一个定时器,用于定时检测鼠标的位置。 ```c SetTimer(NULL, 0, 10, MouseTimerCallback); ``` 其中第一个参数为窗口句柄,这里使用`NULL`表示不需要窗口,第二个参数为定时器ID,这里使用`0`表示不需要ID,第三个参数为定时器时间间隔,这里设置为10毫秒,第四个参数为回调函数,这里使用`MouseTimerCallback`函数。 5.定义一个回调函数`MouseTimerCallback`,该函数用于检测鼠标的位置,并根据鼠标的位置来播放或停止音乐。 ```c void CALLBACK MouseTimerCallback( _In_ HWND hwnd, _In_ UINT uMsg, _In_ UINT_PTR idEvent, _In_ DWORD dwTime ) { POINT p; GetCursorPos(&p); RECT r; GetWindowRect(GetDesktopWindow(), &r); if (PtInRect(&r, p)) { SetTimer(NULL, 0, 1000, PlaySoundCallback); } else { SetTimer(NULL, 0, 1000, StopSoundCallback); } } ``` 该函数使用`GetCursorPos`函数获取鼠标的位置,使用`GetWindowRect`函数获取桌面窗口的位置,然后使用`PtInRect`函数判断鼠标的位置是否在桌面窗口中。如果鼠标在桌面窗口中,则设置一个定时器来播放音乐,否则设置一个定时器来停止播放音乐。 完整代码如下: ```c #include <windows.h> void CALLBACK PlaySoundCallback( _In_ PVOID lpParameter, _In_ BOOLEAN TimerOrWaitFired ) { PlaySound("music.wav", NULL, SND_FILENAME | SND_ASYNC); } void CALLBACK StopSoundCallback( _In_ PVOID lpParameter, _In_ BOOLEAN TimerOrWaitFired ) { PlaySound(NULL, NULL, NULL); } void CALLBACK MouseTimerCallback( _In_ HWND hwnd, _In_ UINT uMsg, _In_ UINT_PTR idEvent, _In_ DWORD dwTime ) { POINT p; GetCursorPos(&p); RECT r; GetWindowRect(GetDesktopWindow(), &r); if (PtInRect(&r, p)) { SetTimer(NULL, 0, 1000, PlaySoundCallback); } else { SetTimer(NULL, 0, 1000, StopSoundCallback); } } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) { SetTimer(NULL, 0, 10, MouseTimerCallback); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值