获取“应用程序的名称”以及关键点击

时间:2012-10-13 04:40:51

标签: c++ c windows hook

要记录按键,我将钩子安装为:

BOOL WINAPI installHook(HINSTANCE hinstDLL, DWORD fwdReason, LPVOID lpvReserved) {
handleKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hinstDLL, 0);
MSG msg;

while(GetMessage(&msg, NULL, 0, 0)){
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}
return msg.wParam;
}

static LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
  // write here
}

有什么方法可以知道当前正在点击密钥的应用程序名称吗?就像我已经打开记事本写一些东西,我可以得到记事本的应用程序名称以及按键水龙头吗?其他一些应用程序也是如此,例如mozilla firefox。

1 个答案:

答案 0 :(得分:2)

你的钩子里面应该是这样的:

static LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    // if it is not a keydown event, continue the chain
    if(HC_ACTION != nCode || WM_KEYDOWN != wParam)
        return CallNextHookEx(0, nCode, wParam, lParam);

    const KBDLLHOOKSTRUCT* messageInfo = reinterpret_cast<const KBDLLHOOKSTRUCT*>(lParam);

    // add more code here...

    // tell Windows we processed the hook
    return 1;
}

messageinfo.vkCode将包含您要查找的密钥代码。这些代码的官方列表位于:http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx

键通常会被输入前景窗口(尽管有时会发生奇怪的窗口布局)。您可以像这样获得前景窗口的标题:

TCHAR title[100]; // increase size for longer titles
GetWindowText(GetForegroundWindow(), title, 100);

如果您想获取该程序的名称,请使用:

TCHAR title[100]; // increase size for longer program names
GetWindowModuleFileName(GetForegroundWindow(), title, 100);

并且,请记住添加错误检查并检查文档。