2013-11-22 41 views
1

我試圖用Windows APISendInput()彈出菜單,但每次都完全失敗。無法使用C中的「SendInput()」與GCC/Mingw32編譯器發送虛擬鍵「Alt + Space」?

#include <windows.h> 
int main (void) 
{ 
    INPUT Alt_Space[4] = {0}; 

    Alt_Space[0].type = INPUT_KEYBOARD; // Alt Key down 
    Alt_Space[0].ki.wVk = VK_MENU; 

    Alt_Space[1].type = INPUT_KEYBOARD; // Space Key down 
    Alt_Space[1].ki.wVk = VK_SPACE; 

    Alt_Space[2].type = INPUT_KEYBOARD; // Space Key up 
    Alt_Space[2].ki.dwFlags = KEYEVENTF_KEYUP; 
    Alt_Space[2].ki.wVk = VK_SPACE; 

    Alt_Space[3].type = INPUT_KEYBOARD; // Alt Key up 
    Alt_Space[3].ki.dwFlags = KEYEVENTF_KEYUP; 
    Alt_Space[3].ki.wVk = VK_MENU; 

    SendInput (4, Alt_Space, sizeof(INPUT)); 

    system ("pause"); 
} 

有誰知道爲什麼這段代碼無法彈出菜單?謝謝。

編譯命令:

mingw32-gcc.exe -O3 -c "Console.c" -o "Console.o" 
mingw32-gcc.exe -o "Console.exe" "Console.o" 
+0

不缺少簡單的解釋。 CTRL鍵關閉時不起作用。您的程序在將密鑰發送到自身後再終止一個毫秒,再見菜單。 –

+0

@Hans Passant我編輯了我的代碼,但仍然失敗。 –

+1

我可以想出更多的理由,但這是毫無意義的。這段代碼應該做什麼?爲什麼用戶需要幫助訪問控制檯窗口的系統菜單?他已經知道如何做到這一點。 –

回答

1

雖然我沒有用SendInput()keybd_event()與GCC/MINGW32完美的作品。

我回答了我自己的問題,並留下它以便提供一些想法給有同樣問題的人。

// Event 
#define KEYEVENTF_KEYDOWN 0x0000 

// ALT + SPACE 
#define SCAN_CODE_ALT  0x38 
#define SCAN_CODE_SPACE 0x39 
keybd_event (VK_MENU , SCAN_CODE_ALT , KEYEVENTF_KEYDOWN, 0); 
keybd_event (VK_SPACE , SCAN_CODE_SPACE, KEYEVENTF_KEYDOWN, 0); 
keybd_event (VK_SPACE , SCAN_CODE_SPACE, KEYEVENTF_KEYUP , 0); 
keybd_event (VK_MENU , SCAN_CODE_ALT , KEYEVENTF_KEYUP , 0); 

// UP * 2 
#define SCAN_CODE_UP  0x48 
keybd_event (VK_UP , SCAN_CODE_UP , KEYEVENTF_KEYDOWN, 0); 
keybd_event (VK_UP , SCAN_CODE_UP , KEYEVENTF_KEYUP , 0); 
keybd_event (VK_UP , SCAN_CODE_UP , KEYEVENTF_KEYDOWN, 0); 
keybd_event (VK_UP , SCAN_CODE_UP , KEYEVENTF_KEYUP , 0); 

// Enter 
#define SCAN_CODE_ENTER 0x1C 
keybd_event (VK_RETURN, SCAN_CODE_ENTER, KEYEVENTF_KEYUP , 0); 
keybd_event (VK_RETURN, SCAN_CODE_ENTER, KEYEVENTF_KEYDOWN, 0); 
+4

或沒有的#define: 'keybd_event(VK_MENU,MapVirtualKey(VK_MENU,0),0,0) keybd_event(VK_SPACE,MapVirtualKey(VK_SPACE,0),0,0) keybd_event(VK_SPACE,MapVirtualKey(VK_SPACE,0 ),KEYEVENTF_KEYUP,0) keybd_event(VK_MENU,MapVirtualKey(VK_MENU,0),KEYEVENTF_KEYUP,0)' – kero