아래의 좋은 코드는 CTRL-y
키 조합을 수신 대기하는 백그라운드에있는 단축키 앱이며 더 많은 키 조합을 수정하거나 앱에 추가 할 수 있습니다. CTRL-q
을 사용하면 숨겨진 앱을 종료 할 수 있습니다.
콘솔 창을 완전히 숨기려면 main() : //ShowWindow(FindWindowA("ConsoleWindowClass", NULL), false)
에서이 행의 주석을 해제하십시오. 즐겨.
if (CTRL_key !=0 && key == 'y')
{
MessageBox(NULL, "CTRL-y was pressed\nLaunch 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 pressed\nLaunch 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 = %c\n", key);
SHIFT_key = 0;
CTRL_key = 0;
ALT_key = 0;
}
printf("lpszKeyName = %s\n", 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;
}
왜 응용 프로그램이 바로 이러한 키 입력 이벤트를 수신하지 않는 이유는 무엇입니까? 왜 명령 프롬프트에서 전역 적으로 가로 챌 필요가 있습니까? 명령 줄 응용 프로그램을 만들었습니까? –
@CodyGray : 설명이 불완전하면 죄송합니다. WH_KEYBOARD_LL 후크를 사용하는 콘솔 응용 프로그램을 작성했습니다. 키 스트로크와 타이밍 정보를 기록 할 수 있지만 앱은 시스템 전체에 기록됩니다. 이제는 CMD 창에서만 로깅을 제한하려고합니다. 내가 그 일을하는 더 좋은 방법이 있다면 알려주 길 바란다. 나는 api를 이기기 위하여 새롭다 나는 간신히 표면을 긁고있다. :) – secfreak
응용 프로그램이 명령 프롬프트에서 실행되는 경우 일반 응용 프로그램과 같은 키보드 이벤트를 수신하지 못하는 이유는 무엇입니까? 'WH_KEYBOARD_LL' 훅은 글로벌 로우 레벨 키보드 훅입니다. 즉, 시스템 전체에서 발생하는 모든 키보드 이벤트에 대한 알림을 얻습니다. 그것이 당신이 원하는 것이 아닌 것처럼 들리므로, 당신은 글로벌 훅을 전혀 원하지 않습니다. –