最近总要在笔记本电脑前面写东西,所以一般把本子放在键盘上。但是又容易不小心按了哪个键。所以写了个键盘锁,这样锁起来之后按什么键都不起作用了。主要是使用了 Hook 技术。
可能有谁也会需要到,就贴在这里了。
另外,关于气泡提示中的 timeout 的变量好像不是很准,我设置了 1000 毫秒,但是基本上要等上 10 秒左右才能消失。暂时还不知道是什么原因。
#define
_WIN32_IE 0x0500
#include
<
windows.h
>

enum

...
{
WM_TRAYICON = WM_USER + 100, //自定义托盘消息
ID_LOCK,
ID_UNLOCK,
ID_EXIT
}
;
HHOOK KBhook
=
NULL;
//
钩子句柄
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK KeyboardHookProc(
int
nCode, WPARAM wParam, LPARAM lParam);
//
键盘钩子回调函数
void
TrayMessage(HWND hwnd, LPCTSTR szText);
//
显示托盘气泡信息
void
DestroyTrayIcon(HWND hwnd);
//
删除托盘图标
void
CreateTrayMenu(HWND hwnd);
//
建立托盘菜单
int
EnableKeyboardCapture();
//
激活键盘钩子
int
DisableKeyboardCapture();
//
解除键盘钩子
void
OnLock(HWND hwnd);
void
OnUnlock(HWND hwnd);

int
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine,
int
iCmdShow) 
...
{
HWND hwnd;
MSG msg;
NOTIFYICONDATA IconData;
WNDCLASS wndclass;
static TCHAR szAppName[] = ...{"Keyboard Lock"};
//初始化窗口
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hCursor = LoadCursor(NULL, IDI_APPLICATION);
wndclass.hIcon = LoadIcon(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hInstance = hInstance;
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
RegisterClass(&wndclass);
hwnd = CreateWindow(szAppName, szAppName, WS_OVERLAPPEDWINDOW, 0, 0, 0, 0, 0, 0, hInstance, NULL);
//这里之后不需要显示窗口,新建托盘图标,操作全部在托盘图标上完成
//Warning: HWND 和 HINSTANCE 不对的话,就会有问题
IconData.cbSize = sizeof(NOTIFYICONDATA);
IconData.hWnd = hwnd;
IconData.uID = (UINT)hInstance;
IconData.hIcon = LoadIcon(0, MAKEINTRESOURCE(IDI_INFORMATION));
IconData.uFlags = NIF_MESSAGE + NIF_ICON + NIF_TIP;
IconData.uCallbackMessage = WM_TRAYICON;
strcpy(IconData.szTip, "键盘锁");
Shell_NotifyIcon(NIM_ADD, &IconData);
while(GetMessage(&msg, NULL, 0, 0)) 
...{
TranslateMessage(&msg);
DispatchMessage(&msg);
} 
return msg.wParam;
}


LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
...
{
switch (message) 
...{
case WM_COMMAND:
if(HIWORD(wParam) == 0)
...{
//菜单动作的消息
switch (LOWORD(wParam))
...{
case ID_LOCK:
OnLock(hwnd);
break;
case ID_UNLOCK:
OnUnlock(hwnd);
break;
case ID_EXIT:
::DestroyWindow(hwnd);
break;
}
}
break;
case WM_TRAYICON:
switch (lParam) 
...{
case WM_LBUTTONDOWN:
CreateTrayMenu(hwnd);
break;
}
break;
case WM_DESTROY:
DestroyTrayIcon(hwnd);
PostQuitMessage(0);
break;
} 
return DefWindowProc(hwnd, message, wParam, lParam);
}


LRESULT CALLBACK KeyboardHookProc(
int
nCode, WPARAM wParam, LPARAM lParam)
...
{
//是键盘的动作全部忽略
if (nCode == HC_ACTION)
return 1;
return CallNextHookEx(NULL, nCode, wParam, lParam);
}


int
EnableKeyboardCapture()
...
{
// 13 表示使用低级键盘钩子,和 WM_KEYBOARD 不同
KBhook = !KBhook ? SetWindowsHookEx(13, (HOOKPROC)KeyboardHookProc, (HINSTANCE)GetModuleHandle(NULL), 0) : KBhook;
return (KBhook ? 1 : -1);
}


int
DisableKeyboardCapture()
...
{
if (KBhook == NULL)
...{
return 0;
}
else
...{
BOOL flag;
flag = UnhookWindowsHookEx(KBhook);
KBhook = NULL;
return (flag ? 1 : -1);
}
}


void
TrayMessage(HWND hwnd, LPCTSTR szText)
...
{
NOTIFYICONDATA nid;
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hwnd;
nid.uID = (UINT)GetModuleHandle(NULL);
nid.uFlags = NIF_INFO | NIF_ICON;
nid.dwInfoFlags = NIIF_INFO;
nid.uTimeout = 1000;
nid.hIcon = LoadIcon(0, MAKEINTRESOURCE(IDI_INFORMATION));
wsprintf(nid.szInfo, szText);
strcpy(nid.szInfoTitle, "键盘锁");
Shell_NotifyIcon(NIM_MODIFY, &nid);
}


void
DestroyTrayIcon(HWND hwnd)
...
{
NOTIFYICONDATA nid;
nid.cbSize = sizeof(nid);
nid.uID = (UINT)GetModuleHandle(NULL);
nid.hWnd = hwnd;
nid.uFlags = 0;
Shell_NotifyIcon(NIM_DELETE, &nid);
}


void
CreateTrayMenu(HWND hwnd)
...
{
HMENU hMenu;
hMenu = CreatePopupMenu();
AppendMenu(hMenu, MF_STRING, ID_LOCK, "锁定键盘");
AppendMenu(hMenu, MF_STRING, ID_UNLOCK, "解锁键盘");
AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);
AppendMenu(hMenu, MF_STRING, ID_EXIT, "退出");
POINT pt;
GetCursorPos(&pt);
TrackPopupMenu(hMenu, TPM_RIGHTALIGN, pt.x, pt.y, 0, hwnd, NULL);
}


void
OnUnlock(HWND hwnd)
...
{
switch (DisableKeyboardCapture())
...{
case 0:
TrayMessage(hwnd, "键盘没有锁定");
break;
case 1:
TrayMessage(hwnd, "键盘已经解锁");
break;
case -1:
TrayMessage(hwnd, "键盘解锁错误");
break;
}
}


void
OnLock(HWND hwnd)
...
{
switch (EnableKeyboardCapture())
...{
case 1:
TrayMessage(hwnd, "键盘已经锁定");
break;
case -1:
TrayMessage(hwnd, "键盘锁定错误");
break;
}
}
最后
以上就是鲜艳蛋挞最近收集整理的关于用C++ 和 Win32 SDK 写的简单键盘锁的全部内容,更多相关用C++内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复