使用定时器功能创建捕鼠器

【勇芳软件工作室】汉化HomePreviousNext

有时,当您在屏幕上有光标时,有必要防止更多的输入。完成此操作的一种方法是创建一个特殊的例程,捕获鼠标输入,直到特定事件发生。许多开发商将这个例程称为“建立捕鼠器”。

以下示例使用SetTimerKillTimer功能创建简单的捕鼠器。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;

}

}

}