环境:
我在Win10 x64 [16299.431]上使用VS2010。
我想使用SetWindowsHookEx
函数在PC上记录一些键。
最终目标:
如果有人按顺序输入正确的密码,我的电脑将自动解锁。
问题:
它不适用于SYSTEM
授权。
实现:
#define LOCK_ENABLE 0
#define LOCK_DISABLE 1
DWORD g_locker = LOCK_DISABLE;
DWORD g_selwrd = -2;
CHAR* g_szpaswd = "heaven";
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
HOOKPROC LockerPraq();
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam;
if(HC_ACTION == nCode)
{
switch (wParam)
{
case WM_KEYDOWN: case WM_SYSKEYDOWN:
switch (p->vkCode) {
case VK_HOME:
g_locker = LOCK_ENABLE;
g_selwrd = -1;
break;
case VK_END:
g_locker = LOCK_DISABLE;
g_selwrd = 0;
break;
}
if (LOCK_ENABLE == g_locker)
{
if (-1 == g_selwrd)
g_selwrd = 0;
else
{
CHAR szKbdstate[MAX_PATH] = {0};
WORD theChar = 0x0000;
ToAsciiEx(p->vkCode, p->scanCode, (BYTE*)szKbdstate, &theChar, 0, GetKeyboardLayout(0));
if (theChar != g_szpaswd[g_selwrd])
g_selwrd = 0;
else
{
g_selwrd++;
if (g_selwrd >= strlen(g_szpaswd))
UnLockPC();
}
}
}
break;
}
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
HOOKPROC LockerPraq()
{
HHOOK hook_install = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, NULL, 0);
if (NULL == hook_install)
return(0);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
UnhookWindowsHookEx(hook_install);
return(0);
}
最佳答案
Windows锁定或注销(如果确实是您的问题)时,您看不到任何按键的原因是因为Winlogon
在其自己的桌面上运行。
Winlogon是处理登录和锁定屏幕的过程,它以安全的方式进行。 Microsoft并没有很好地对其进行记录,但是有一篇here讨论了有关 session 和台式机的一般内容,您可能会觉得有帮助。
“SetWindowsHookEx”是documented,因为它仅是与调用应用程序在同一桌面上运行的挂钩应用程序,因此这可能是造成问题的原因。
我怀疑是否有办法解决这个问题。 Winlogon在其自己的桌面上运行是有原因的,Microsoft并不希望您靠近它。
编辑:好吧,也许您可以在其中潜入自己的过程,请参见:Running a process at the Windows 7 Welcome Screen