【发布时间】:2022-07-08 18:11:04
【问题描述】:
我制作了一个程序,它可以捕捉每一次击键并在终端中打印出来。问题是它都是大写的,我不知道如何正确地做到这一点。如果有帮助,我可以发布代码。
主要:
#include
#include
#include
#include
#pragma comment( lib, "user32" )
int main()
{
fun();
printf("Loading library\n");
HMODULE libHandle = LoadLibraryA("TestLibrary");
if (libHandle == NULL) printf("***ERROR*** loading library\n");
printf("Getting address of hook procedure\n");
HOOKPROC procAddress = (HOOKPROC)GetProcAddress(libHandle, "KeyboardProc");
if (procAddress == NULL) printf("***ERROR*** getting address\n");
printf("Installing hook\n");
HHOOK hook = SetWindowsHookEx(WH_KEYBOARD_LL, procAddress, libHandle, 0);
if (hook == NULL) printf("***ERROR*** installing hook\n");
printf("Entering message loop\n");
while (GetMessage(NULL, NULL, 0, 0));
}
DLL:
#include "pch.h"
#include
#include
#include "TestLibrary.h"
void fun()
{
printf("Program started\n");
}
LRESULT CALLBACK KeyboardProc(_In_ int code, _In_ WPARAM wParam, _In_ LPARAM lParam)
{
if (wParam == WM_KEYDOWN)
{
PKBDLLHOOKSTRUCT tmp = (PKBDLLHOOKSTRUCT)lParam;
char c = MapVirtualKeyA(tmp->vkCode, 2);
if (tmp->vkCode == VK_RETURN)
printf("\n");
else if (tmp->vkCode == VK_BACK)
printf("\b \b");
else
printf("%c", c);
}
return CallNextHookEx(NULL, code, wParam, lParam);
-
我正在编辑我的问题
-
@AndreasWenzel 我发布了代码。谢谢!
-
请准确说明输入、期望行为和实际行为。
-
旁注:如果您在对
MapVirtualKeyA
的函数调用中编写MAPVK_VK_TO_CHAR
而不是简单的2
,您的代码将更具可读性。 -
低级钩子程序不需要编译成DLL。不过,它确实必须遵循 documented 协议。具体来说,除非
nCode
是HC_ACTION
,否则它不得进行任何处理。这不会改变您眼前的问题,但可以避免您在未来遇到问题。