有时,当您在屏幕上有光标时,有必要防止更多的输入。完成此操作的一种方法是创建一个特殊的例程,捕获鼠标输入,直到特定事件发生。许多开发商将这个例程称为“建立捕鼠器”。
以下示例使用SetTimer和KillTimer功能创建简单的捕鼠器。SetTimer创建一个定时器,每10秒发送一个WM_TIMER消息。每次应用程序接收到WM_TIMER消息时,它记录光标位置。如果当前位置与上一个位置相同,并且应用程序的主窗口最小化,应用程序将光标移动到图标。当应用程序关闭时,KillTimer停止计时器。
HICON hIcon1; //图标句柄
POINT ptOld; //上一个光标位置
UINT uResult; // SetTimer的返回值
HINSTANCE hinstance; //当前实例的句柄
//
//在这里执行应用程序初始化。
//
wc.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(400));
wc.hCursor = LoadCursor(hinstance, MAKEINTRESOURCE(200));
//记录初始光标位置。
GetCursorPos(&ptOld);
//设置捕鼠器的计时器。
uResult = SetTimer(hwnd, //主窗口的句柄
IDT_MOUSETRAP, //计时器标识符
10000, // 10秒间隔
(TIMERPROC) NULL); //无定时器回调
if (uResult == 0)
{
ErrorHandler("No timer is available.");
}
龙APIENTRY MainWndProc(
HWND hwnd, //主窗口的句柄
UINT message, //消息类型
UINT wParam, // 附加信息
LONG lParam) // 附加信息
{
HDC hdc; //设备上下文的句柄
POINT pt; //当前光标位置
RECT rc; //最小化窗口的位置
开关(讯息)
{
//
//处理其他消息。
//
case WM_TIMER:
//如果窗口最小化,请比较当前值
//光标位置与10秒钟
//更早如果光标位置没有改变,
//将光标移动到图标。
if(IsIconic(hwnd))
{
GetCursorPos(&pt);
if ((pt.x == ptOld.x) && (pt.y == ptOld.y))
{
GetWindowRect(hwnd, &rc);
SetCursorPos(rc.left, rc.top);
}
其他
{
ptOld.x = pt.x;
ptOld.y = pt.y;
}
}
return 0;
case WM_DESTROY:
//销毁计时器
KillTimer(hwnd, IDT_MOUSETRAP);
PostQuitMessage(0);
break;
//
//处理其他消息。
//
}
虽然以下示例也创建了一个捕鼠器,它通过应用程序定义的回调函数MyTimerProc处理WM_TIMER消息,而不是通过应用程序的消息队列。
UINT uResult; // SetTimer的返回值
HICON hIcon1; //图标句柄
POINT ptOld; //上一个光标位置
HINSTANCE hinstance; //当前实例的句柄
//
//在这里执行应用程序初始化。
//
wc.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(400));
wc.hCursor = LoadCursor(hinstance, MAKEINTRESOURCE(200));
//记录当前的光标位置。
GetCursorPos(&ptOld);
//设置捕鼠器的计时器。
uResult = SetTimer(hwnd, //主窗口的句柄
IDT_MOUSETRAP, //计时器标识符
10000, // 10秒间隔
(TIMERPROC) MyTimerProc); //定时器回调
if (uResult == 0)
{
ErrorHandler("No timer is available.");
}
龙APIENTRY MainWndProc(
HWND hwnd, //主窗口的句柄
UINT message, //消息类型
UINT wParam, // 附加信息
LONG lParam) // 附加信息
{
HDC hdc; //设备上下文的句柄
开关(讯息)
{
//
//处理其他消息。
//
case WM_DESTROY:
//销毁计时器
KillTimer(hwnd, IDT_MOUSETRAP);
PostQuitMessage(0);
break;
//
//处理其他消息。
//
}
// MyTimerProc是一个应用程序定义的回调函数
//处理WM_TIMER消息。
VOID CALLBACK MyTimerProc(
HWND hwnd, //定时器消息的窗口句柄
UINT message, // WM_TIMER消息
UINT idTimer, //计时器标识符
DWORD dwTime) //当前系统时间
{
RECT rc;
POINT pt;
//如果窗口最小化,请比较当前值
//光标位置与之前的10秒钟。
//如果光标位置未更改,请移动
//光标到图标。
if(IsIconic(hwnd))
{
GetCursorPos(&pt);
if ((pt.x == ptOld.x) && (pt.y == ptOld.y))
{
GetWindowRect(hwnd, &rc);
SetCursorPos(rc.left, rc.top);
}
其他
{
ptOld.x = pt.x;
ptOld.y = pt.y;
}
}
}