我是
靠谱客的博主
鲜艳蛋挞,最近开发中收集的这篇文章主要介绍
用C++ 和 Win32 SDK 写的简单键盘锁,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
最近总要在笔记本电脑前面写东西,所以一般把本子放在键盘上。但是又容易不小心按了哪个键。所以写了个键盘锁,这样锁起来之后按什么键都不起作用了。主要是使用了 Hook 技术。
可能有谁也会需要到,就贴在这里了。
另外,关于气泡提示中的 timeout 的变量好像不是很准,我设置了 1000 毫秒,但是基本上要等上 10 秒左右才能消失。暂时还不知道是什么原因。
#define
_WIN32_IE 0x0500
#include
<
windows.h
>
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113147262381.gif)
enum
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113149085291.gif)
...
{
WM_TRAYICON = WM_USER + 100, //自定义托盘消息
ID_LOCK,
ID_UNLOCK,
ID_EXIT
}
;
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113147262381.gif)
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);
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113147262381.gif)
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113147262381.gif)
int
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine,
int
iCmdShow)
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113149085291.gif)
...
{
HWND hwnd;
MSG msg;
NOTIFYICONDATA IconData;
WNDCLASS wndclass;
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113161065850.gif)
static TCHAR szAppName[] = ...{"Keyboard Lock"};
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113142380563.gif)
//初始化窗口
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;
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113142380563.gif)
RegisterClass(&wndclass);
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113142380563.gif)
hwnd = CreateWindow(szAppName, szAppName, WS_OVERLAPPEDWINDOW, 0, 0, 0, 0, 0, 0, hInstance, NULL);
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113142380563.gif)
//这里之后不需要显示窗口,新建托盘图标,操作全部在托盘图标上完成
//Warning: HWND 和 HINSTANCE 不对的话,就会有问题
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113142380563.gif)
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;
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113142380563.gif)
strcpy(IconData.szTip, "键盘锁");
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113142380563.gif)
Shell_NotifyIcon(NIM_ADD, &IconData);
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113142380563.gif)
while(GetMessage(&msg, NULL, 0, 0))
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113161065850.gif)
...{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113142380563.gif)
return msg.wParam;
}
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113147262381.gif)
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113147262381.gif)
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113149085291.gif)
...
{
switch (message)
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113161065850.gif)
...{
case WM_COMMAND:
if(HIWORD(wParam) == 0)
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113161065850.gif)
...{
//菜单动作的消息
switch (LOWORD(wParam))
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113161065850.gif)
...{
case ID_LOCK:
OnLock(hwnd);
break;
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113142380563.gif)
case ID_UNLOCK:
OnUnlock(hwnd);
break;
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113142380563.gif)
case ID_EXIT:
::DestroyWindow(hwnd);
break;
}
}
break;
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113142380563.gif)
case WM_TRAYICON:
switch (lParam)
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113161065850.gif)
...{
case WM_LBUTTONDOWN:
CreateTrayMenu(hwnd);
break;
}
break;
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113142380563.gif)
case WM_DESTROY:
DestroyTrayIcon(hwnd);
PostQuitMessage(0);
break;
}
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113142380563.gif)
return DefWindowProc(hwnd, message, wParam, lParam);
}
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113147262381.gif)
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113147262381.gif)
LRESULT CALLBACK KeyboardHookProc(
int
nCode, WPARAM wParam, LPARAM lParam)
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113149085291.gif)
...
{
//是键盘的动作全部忽略
if (nCode == HC_ACTION)
return 1;
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113142380563.gif)
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113147262381.gif)
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113147262381.gif)
int
EnableKeyboardCapture()
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113149085291.gif)
...
{
// 13 表示使用低级键盘钩子,和 WM_KEYBOARD 不同
KBhook = !KBhook ? SetWindowsHookEx(13, (HOOKPROC)KeyboardHookProc, (HINSTANCE)GetModuleHandle(NULL), 0) : KBhook;
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113142380563.gif)
return (KBhook ? 1 : -1);
}
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113147262381.gif)
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113147262381.gif)
int
DisableKeyboardCapture()
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113149085291.gif)
...
{
if (KBhook == NULL)
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113161065850.gif)
...{
return 0;
}
else
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113161065850.gif)
...{
BOOL flag;
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113142380563.gif)
flag = UnhookWindowsHookEx(KBhook);
KBhook = NULL;
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113142380563.gif)
return (flag ? 1 : -1);
}
}
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113147262381.gif)
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113147262381.gif)
void
TrayMessage(HWND hwnd, LPCTSTR szText)
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113149085291.gif)
...
{
NOTIFYICONDATA nid;
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113142380563.gif)
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));
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113142380563.gif)
wsprintf(nid.szInfo, szText);
strcpy(nid.szInfoTitle, "键盘锁");
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113142380563.gif)
Shell_NotifyIcon(NIM_MODIFY, &nid);
}
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113147262381.gif)
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113147262381.gif)
void
DestroyTrayIcon(HWND hwnd)
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113149085291.gif)
...
{
NOTIFYICONDATA nid;
nid.cbSize = sizeof(nid);
nid.uID = (UINT)GetModuleHandle(NULL);
nid.hWnd = hwnd;
nid.uFlags = 0;
Shell_NotifyIcon(NIM_DELETE, &nid);
}
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113147262381.gif)
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113147262381.gif)
void
CreateTrayMenu(HWND hwnd)
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113149085291.gif)
...
{
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, "退出");
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113142380563.gif)
POINT pt;
GetCursorPos(&pt);
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113142380563.gif)
TrackPopupMenu(hMenu, TPM_RIGHTALIGN, pt.x, pt.y, 0, hwnd, NULL);
}
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113147262381.gif)
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113147262381.gif)
void
OnUnlock(HWND hwnd)
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113149085291.gif)
...
{
switch (DisableKeyboardCapture())
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113161065850.gif)
...{
case 0:
TrayMessage(hwnd, "键盘没有锁定");
break;
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113142380563.gif)
case 1:
TrayMessage(hwnd, "键盘已经解锁");
break;
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113142380563.gif)
case -1:
TrayMessage(hwnd, "键盘解锁错误");
break;
}
}
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113147262381.gif)
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113147262381.gif)
void
OnLock(HWND hwnd)
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113149085291.gif)
...
{
switch (EnableKeyboardCapture())
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113161065850.gif)
...{
case 1:
TrayMessage(hwnd, "键盘已经锁定");
break;
![](https://file2.kaopuke.com:8081/files_image/2023061121/202306112113142380563.gif)
case -1:
TrayMessage(hwnd, "键盘锁定错误");
break;
}
}
最后
以上就是鲜艳蛋挞为你收集整理的用C++ 和 Win32 SDK 写的简单键盘锁的全部内容,希望文章能够帮你解决用C++ 和 Win32 SDK 写的简单键盘锁所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复