Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 键盘挂钩_C_Windows_Winapi_Dll_Keyboard Hook - Fatal编程技术网

C 键盘挂钩

C 键盘挂钩,c,windows,winapi,dll,keyboard-hook,C,Windows,Winapi,Dll,Keyboard Hook,我试着用c语言编写一个程序,对一些键盘键的使用情况进行统计分析。 首先,我想使用全局钩子创建一个键盘记录器,并将其记录到文件中 以下是我编写的代码的第一部分: #include <stdio.h> #include <Windows.h> HHOOK hook; LRESULT CALLBACK hook_proc(int nCode, WPARAM wParam, LPARAM lParam) { if (wParam == WM_KEYDOWN)

我试着用c语言编写一个程序,对一些键盘键的使用情况进行统计分析。 首先,我想使用全局钩子创建一个键盘记录器,并将其记录到文件中

以下是我编写的代码的第一部分:

#include <stdio.h>
#include <Windows.h>

HHOOK hook;

LRESULT CALLBACK hook_proc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (wParam == WM_KEYDOWN)
    {
        KBDLLHOOKSTRUCT kbdstruct = *((KBDLLHOOKSTRUCT*)lParam);
        char ch = kbdstruct.vkCode;
        printf("%c", ch);

    }

    return CallNextHookEx(hook, nCode, wParam, lParam);
}


void main()
{
    MSG msg;
    hook = SetWindowsHookEx(WH_KEYBOARD_LL, HOOKPROC(hook_proc), NULL, 0);
    while (GetMessage(&msg, NULL, 0, 0))
    {

    }
}
#包括
#包括
钩;
LRESULT回调hook_proc(int-nCode、WPARAM-WPARAM、LPARAM-LPARAM)
{
if(wParam==WM_KEYDOWN)
{
KBDLLHOOKSTRUCT kbdstruct=*((KBDLLHOOKSTRUCT*)LPRAM);
char ch=kbdstruct.vkCode;
printf(“%c”,ch);
}
返回CallNextHookEx(hook、nCode、wParam、lParam);
}
void main()
{
味精;
hook=SetWindowsHookEx(WH\u-KEYBOARD\u-LL,HOOKPROC(hook\u-proc),NULL,0);
while(GetMessage(&msg,NULL,0,0))
{
}
}
  • 为什么我必须创建无限循环?没有它就不行
  • 我了解到,对于全局钩子,
    SetWindowHookEx
    中的第二个参数应该指向外部DLL中的钩子过程。这很好,为什么只打印虚拟代码呢。如何将其转换为“常规密钥”,而不使用每个虚拟密钥的开关盒?有没有有效的方法
  • 如果需要外部dll,应如何根据我编写的代码从主dll写入和调用它
  • 您需要一个消息循环来处理键盘活动。这在以下文件中明确说明:
  • 这个钩子是在安装它的线程的上下文中调用的。调用是通过向安装钩子的线程发送消息来完成的。因此,安装钩子的线程必须有一个消息循环

  • 大多数全局钩子在每个正在运行的进程的上下文中运行,因此钩子必须位于DLL中,以便可以将其注入到其他进程中。但不是
    WH\u键盘LL
    (见上文)。至于钥匙本身,
    KBDLLHOOKSTRUCT
    仅提供虚拟钥匙和扫描代码。要将它们转换为字符,请使用、或

  • WH\u KEYBOARD\u LL
    不需要DLL。见上文


  • C语言中没有键盘。这个问题似乎有三个问题。因此,我认为它是“太宽”。1:操作系统必须进入您的程序,以便进行HookGePoC()调用。只有当主线程可以安全地中断以进行调用时,它才会这样做。GetMessage()是解决此问题的通用解决方案。2:WH_KEYBOARD\u LL很特别,它不需要DLL。我以前也遇到过第二个问题(在编写我自己的间谍程序时),到目前为止,我发现的最优雅的解决方案是。。。实现您自己的键盘驱动程序,并以某种方式通过编程将其放入客户端系统(或受害者系统:D)。如果你懂俄语,那么我可以给你一些俄语教程的链接。
    while()
    的无限性是什么?