简体   繁体   English

无法通过GCC / Mingw32编译器在C中使用“ SendInput()”发送虚拟键“ Alt + Space”?

[英]Failed to sent virtual key “Alt+Space” using “SendInput()” in C with GCC/Mingw32 Compiler?

I tried to pop up the menu using Windows API : SendInput() , but totally failed every time. 我试图使用Windows API弹出菜单: SendInput() ,但是每次都完全失败。

#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");
}

Can anyone know why this code failed to pop up the menu? 谁能知道为什么此代码未能弹出菜单? Thanks. 谢谢。

Compile Command: 编译命令:

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

Though I didn't use SendInput() , keybd_event() works perfectly with GCC/Mingw32. 尽管我没有使用SendInput() ,但keybd_event()与GCC / Mingw32完美兼容。

I answered my own question, and leave it in order to provide some idea to whom have the same problem. 我回答了我自己的问题,并留下它是为了向遇到相同问题的人提供一些想法。

// 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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM