无法使用send_input执行alt代码(alt + 11)

时间:2018-04-12 16:19:49

标签: c++ winapi

我尝试做的是发送alt代码alt + 1,其中=☺与发送输入。所以我必须按住atl,按下numpad 1,然后放开alt。目前,当代码运行时,它会保持alt按钮,但没有输出到活动窗口(记事本)。我验证了sendinput正在使用关键组合(ctrl + a)工作。在此程序运行时打开Num lock。 alt + f也有效。我认为问题是它可能发送'1'而不是numpad'1',这不适用于alt代码。

Sleep(1000 * 3);
INPUT tabinput[4];
tabinput[0].type = INPUT_KEYBOARD;
tabinput[0].ki = { VK_LMENU, 0 };
tabinput[1].type = INPUT_KEYBOARD;
tabinput[1].ki = { VK_NUMPAD1, 0 };
tabinput[2].type = INPUT_KEYBOARD;
tabinput[2].ki = { VK_NUMPAD1, 0, KEYEVENTF_KEYUP };
tabinput[3].type = INPUT_KEYBOARD;
tabinput[3].ki = { VK_LMENU, 0, KEYEVENTF_KEYUP };
SendInput(4, tabinput, sizeof(INPUT));
getchar();

2 个答案:

答案 0 :(得分:0)

您可以直接使用Unicode字符。如果代码点小于0xFFFF,请使用:

input.ki.wScan = L'☺';

某些字符的代码点大于0xFFFF,每个代码点需要两个关键笔划,在这种情况下使用宽字符串来处理它:

const wchar_t *buf = L"বাংলা ☺  Abc";

std::vector<INPUT> vec;
for(size_t i = 0, len = wcslen(buf); i < len; i++)
{
    INPUT input = { 0 };
    input.type = INPUT_KEYBOARD;
    input.ki.dwFlags = KEYEVENTF_UNICODE;
    input.ki.wScan = buf[i];
    vec.push_back(input);

    input.ki.dwFlags |= KEYEVENTF_KEYUP;
    vec.push_back(input);
}

SendInput(vec.size(), vec.data(), sizeof(INPUT));

答案 1 :(得分:-1)

以下代码可用于键入unicode字符 使用http://www.unicodemap.org/search.asp查找正确的代码

INPUT tabinput[2];
tabinput[0].type = INPUT_KEYBOARD;
tabinput[0].ki.dwFlags = KEYEVENTF_UNICODE;
tabinput[0].ki.wVk = 0;
tabinput[0].ki.wScan = 0x00E1; // This is a Bengali unicode character
tabinput[1].type = INPUT_KEYBOARD;
tabinput[1].ki.dwFlags = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP;
tabinput[1].ki.wVk = 0;
tabinput[1].ki.wScan = 0x00E1; // This is a Bengali unicode character
SendInput(2, tabinput, sizeof(INPUT));