如何拦截 Windows 命令提示符的击键
How to intercept keystrokes to windows command prompt?
我正在开发特定于应用程序的击键动态工具。我的要求是在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;
}
相关文章:
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 如何使用命令提示符、记事本和 MinGW 使用主文件、头文件和实现文件编译C++程序?
- Windows 10命令提示符的输出不正确
- 命令提示符下的 NVCC CUDA 不使用 GPU
- C++构建增强 1.57.0 VS2013 x64 本机工具命令提示符
- 使用程序在C++中自动使用命令提示符
- 从命令提示符使用 MSBuild 调试简单的C++可执行文件
- 在Windows命令提示符中使用G 编译C 程序
- 我将如何替换命令提示符上的文本?C
- 如何在IDE中而不是在命令提示符中显示Visual Studio控制台应用程序输出
- 如何在 Windows 命令提示符下使用 Dev C++ 编译器编译 c++ 程序
- 在命令提示符下看到换行符,但在文件输出中可以看到 相同的字符串
- 如何从 c++ 打开管理命令提示符
- 从WIndows中的命令提示符运行QT应用程序
- C++简单的钩子和隐藏命令提示符
- Qt - qt 命令提示符
- 隐藏由 system();调用的命令提示符
- 在C++中启动进程时隐藏命令提示符
- 如何通过命令提示符在Windows上编译GLFW程序
- 如何拦截 Windows 命令提示符的击键