vc实现锁住键盘鼠标
高手指教,老板逼的紧,写了几天都没有写出来,请高手给点提示,谢谢了 问题点数:20、回复次数:4Top
1 楼donghongtao(孤灯 青卷 长眠)回复于 2005-11-12 12:27:25 得分 0
高手指教一下啊Top
2 楼kernet(人生若只如初见,何事秋风悲画扇)回复于 2005-11-12 12:30:48 得分 0
锁定键盘要用全局钩子
必须写在外部dll中。
//lock.cpp
#define _WIN32_WINNT 0x0500 // 设置系统版本, 确保可以使用底层键盘钩子
#include "windows.h"
// 全局变量
LPDWORD g_lpdwVirtualKey = NULL; // Keycode 数组的指针
int g_nLength = 0; // Keycode 数组的大小
BOOL g_bDisableKeyboard = FALSE; // 是否屏蔽整个键盘
HINSTANCE g_hInstance = NULL; // 模块实例句柄
HHOOK g_hHook = NULL; // 钩子句柄
// DLL 入口函数
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
// 保存模块实例句柄
g_hInstance = (HINSTANCE)hModule;
// 在进程结束或线程结束时卸载钩子
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_PROCESS_DETACH:
case DLL_THREAD_DETACH:
delete g_lpdwVirtualKey;
if (g_hHook != NULL) UnhookWindowsHookEx(g_hHook);
break;
}
return TRUE;
}
// 底层键盘钩子函数
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
// 禁用键盘的某个按键, 如果 g_bDisableKeyboard 为 TRUE 则禁用整个键盘
if (nCode == HC_ACTION)
{
if (g_bDisableKeyboard) return TRUE;
KBDLLHOOKSTRUCT* pStruct = (KBDLLHOOKSTRUCT*)lParam;
LPDWORD tmpVirtualKey = g_lpdwVirtualKey;
for (int i = 0; i < g_nLength; i++)
{
if (pStruct->vkCode == *tmpVirtualKey++)
return TRUE;
}
}
// 传给系统中的下一个钩子
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
/********************************************************************/
/* 开始屏蔽键盘按键 */
/* */
/* 参数: */
/* lpdwVirtualKey Keycode 数组的指针 */
/* nLength Keycode 数组的大小 */
/* bDisableKeyboard 是否屏蔽整个键盘 */
/* */
/* 返回值: TRUE 成功, FALSE 失败 */
/********************************************************************/
BOOL WINAPI StartMaskKey(LPDWORD lpdwVirtualKey, int nLength, BOOL bDisableKeyboard = FALSE)
{
// 如果已经安装键盘钩子则返回 FALSE
if (g_hHook != NULL) return FALSE;
// 将用户传来的 keycode 数组保存在全局变量中
g_lpdwVirtualKey = (LPDWORD)malloc(sizeof(DWORD) * nLength);
LPDWORD tmpVirtualKey = g_lpdwVirtualKey;
for (int i = 0; i < nLength; i++)
{
*tmpVirtualKey++ = *lpdwVirtualKey++;
}
g_nLength = nLength;
g_bDisableKeyboard = bDisableKeyboard;
// 安装底层键盘钩子
g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, g_hInstance, NULL);
if (g_hHook == NULL) return FALSE;
return TRUE;
}
/********************************************************************/
/* 停止屏蔽键盘按键 */
/* */
/* 参数: (无) */
/* */
/* 返回值: TRUE 成功, FALSE 失败 */
/********************************************************************/
BOOL WINAPI StopMaskKey()
{
// 卸载钩子
if (UnhookWindowsHookEx(g_hHook) == 0) return FALSE;
g_hHook = NULL;
return TRUE;
}
Top
3 楼kernet(人生若只如初见,何事秋风悲画扇)回复于 2005-11-12 12:31:47 得分 0
//lock.h
DECLSPEC_IMPORT
BOOL
WINAPI
StartMaskKey(
LPDWORD lpdwVirtualKey,
int nLength,
BOOL bDisableKeyboard = FALSE
);
DECLSPEC_IMPORT
BOOL
WINAPI
StopMaskKey();
//lock.def
EXPORTS
StartMaskKey @1
StopMaskKey @2
Top
4 楼kernet(人生若只如初见,何事秋风悲画扇)回复于 2005-11-12 13:54:04 得分 20
将鼠标锁定在窗体范围内
CRect rct;
GetWindowRect(rct);
ClipCursor(rct);Top




