如何拦截 Windows 命令提示符的击键

How to intercept keystrokes to windows command prompt?

本文关键字:命令提示符 何拦截 Windows      更新时间:2023-10-16

我正在开发特定于应用程序的击键动态工具。我的要求是在Windows CMD提示符下获取用户的击键计时数据。经过几次搜索,我找到了 2 种方法:1) 使用窗户挂钩2) Pyhook - 一个python包装模块

在我看来,我的应用程序功能将与键盘记录器的功能非常相似。但是我无法弄清楚我是否应该使用全局钩子或特定于线程的钩子来拦截对 CMD 提示符的击键。如果使用全局钩子,是否可以根据目标应用程序过滤击键?

下面的

这个好代码是一个热键应用程序,它位于后台侦听CTRL-y组合键,您可以修改或向应用程序添加任何其他组合键。 使用CTRL-q在隐藏时退出应用程序。

如果您希望完全隐藏控制台窗口,请在 main() 中取消注释此行://ShowWindow(FindWindowA("ConsoleWindowClass", NULL), false) 。享受。

if (CTRL_key !=0 && key == 'y' )
{
   MessageBox(NULL, "CTRL-y was pressednLaunch your app here", "H O T K E Y", MB_OK); 
   CTRL_key=0;
}

完整代码列表:

#define _WIN32_WINNT 0x0400
#pragma comment( lib, "user32.lib" )
#include <windows.h>
#include <stdio.h>
HHOOK hKeyboardHook;
__declspec(dllexport) LRESULT CALLBACK KeyboardEvent (int nCode, WPARAM wParam, LPARAM lParam)
{
    DWORD SHIFT_key=0;
    DWORD CTRL_key=0;
    DWORD ALT_key=0;
    if  ((nCode == HC_ACTION) &&   ((wParam == WM_SYSKEYDOWN) ||  (wParam == WM_KEYDOWN)))      
    {
        KBDLLHOOKSTRUCT hooked_key =    *((KBDLLHOOKSTRUCT*)lParam);
        DWORD dwMsg = 1;
        dwMsg += hooked_key.scanCode << 16;
        dwMsg += hooked_key.flags << 24;
        char lpszKeyName[1024] = {0};
        lpszKeyName[0] = '[';
        int i = GetKeyNameText(dwMsg,   (lpszKeyName+1),0xFF) + 1;
        lpszKeyName[i] = ']';
        int key = hooked_key.vkCode;
        SHIFT_key = GetAsyncKeyState(VK_SHIFT);
        CTRL_key = GetAsyncKeyState(VK_CONTROL);
        ALT_key = GetAsyncKeyState(VK_MENU);
        if (key >= 'A' && key <= 'Z')   
        {
            if  (GetAsyncKeyState(VK_SHIFT)>= 0) key +=32;
            if (CTRL_key !=0 && key == 'y' )
            {
               MessageBox(NULL, "CTRL-y was pressednLaunch your app here", "H O T K E Y", MB_OK); 
               CTRL_key=0;
            }
            if (CTRL_key !=0 && key == 'q' )
            {
                MessageBox(NULL, "Shutting down", "H O T K E Y", MB_OK); 
               PostQuitMessage(0);
            }


            printf("key = %cn", key);
            SHIFT_key = 0;
            CTRL_key = 0;
            ALT_key = 0;
        }
        printf("lpszKeyName = %sn",  lpszKeyName );
    }
    return CallNextHookEx(hKeyboardHook,    nCode,wParam,lParam);
}
void MessageLoop()
{
    MSG message;
    while (GetMessage(&message,NULL,0,0)) 
    {
        TranslateMessage( &message );
        DispatchMessage( &message );
    }
}
DWORD WINAPI my_HotKey(LPVOID lpParm)
{
    HINSTANCE hInstance = GetModuleHandle(NULL);
    if (!hInstance) hInstance = LoadLibrary((LPCSTR) lpParm); 
    if (!hInstance) return 1;
    hKeyboardHook = SetWindowsHookEx (  WH_KEYBOARD_LL, (HOOKPROC) KeyboardEvent,   hInstance,  NULL    );
    MessageLoop();
    UnhookWindowsHookEx(hKeyboardHook);
    return 0;
}
int main(int argc, char** argv)
{
    HANDLE hThread;
    DWORD dwThread;
    hThread = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)   my_HotKey, (LPVOID) argv[0], NULL, &dwThread);
    //ShowWindow(FindWindowA("ConsoleWindowClass", NULL), false);
    if (hThread) return WaitForSingleObject(hThread,INFINITE);
    else return 1;
}