用C++ 和 Win32 SDK 写的简单键盘锁
2008-01-03 22:55
399 查看
最近总要在笔记本电脑前面写东西,所以一般把本子放在键盘上。但是又容易不小心按了哪个键。所以写了个键盘锁,这样锁起来之后按什么键都不起作用了。主要是使用了 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;
}
}
可能有谁也会需要到,就贴在这里了。
另外,关于气泡提示中的 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 服务程序
- 用 C++ 创建简单的 Win32 服务程序
- win32sdk学习 richedit实现的一个简单记事本
- 使用C++ REST SDK开发简单的Web(HTTP)服务
- c++实现一段最简单的病毒代码,锁住你的键盘和鼠标(后果自负)
- 用Win32 SDK写一个简单的计算器
- 用 C++ 创建简单的 Win32 服务程序
- 用 C++ 创建简单的 Win32 服务程序
- 用 C++ 创建简单的 Win32 服务程序
- 用 C++ 创建简单的 Win32 服务程序
- 用Win32 SDK & C++实现的一个简易版局域网聊天软件
- 简单的锁键盘锁鼠标的C++病毒代码
- Carbide.c++简单使用之import and debug SDK example
- 关于Win32 SDK(C++)的命令行获取,通过__argc和__argv
- 用C++创建简单的Win32 服务程序
- win32sdk学习-简单的创建一个自己的工具栏
- 一个基于Win32SDK写的超简单画图板
- win32 C++多线程编程简单实例
- Qt(C++)调用工业相机Basler的SDK简单使用示例
- Win32 SDK程序创建一些控件(简单调用InitCommonControlsEx,并指定ICC_LISTVIEW_CLASSES控件就可以了)