Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SendInput(C+;+;)不工作_C++_Windows_Winapi - Fatal编程技术网

C++ SendInput(C+;+;)不工作

C++ SendInput(C+;+;)不工作,c++,windows,winapi,C++,Windows,Winapi,返回值是4,我正在管理模式下运行VisualStudio,所以权限应该是确定的。但是我没有看到任何打印出来的东西。有什么帮助吗?我使用的是Windows7x64 INPUT input[4]; input[0].type = INPUT_KEYBOARD; input[0].ki.wVk = 0; input[0].ki.wScan = 'a'; input[0].ki.dwFlags = KEYEVENTF_SCANCODE; input[0].ki.time = 0; input[0].k

返回值是4,我正在管理模式下运行VisualStudio,所以权限应该是确定的。但是我没有看到任何打印出来的东西。有什么帮助吗?我使用的是Windows7x64

INPUT input[4];

input[0].type = INPUT_KEYBOARD;
input[0].ki.wVk = 0;
input[0].ki.wScan = 'a';
input[0].ki.dwFlags = KEYEVENTF_SCANCODE;
input[0].ki.time = 0;
input[0].ki.dwExtraInfo = 0;

input[1].type = INPUT_KEYBOARD;
input[1].ki.wVk = 0;
input[1].ki.wScan = 'a';
input[1].ki.dwFlags = KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE;
input[1].ki.time = 0;
input[1].ki.dwExtraInfo = 0;

input[2].type = INPUT_KEYBOARD;
input[2].ki.wVk = 0;
input[2].ki.wScan = 'a';
input[2].ki.dwFlags = KEYEVENTF_SCANCODE;
input[2].ki.time = 0;
input[2].ki.dwExtraInfo = 0;

input[3].type = INPUT_KEYBOARD;
input[3].ki.wVk = 0;
input[3].ki.wScan = 'a';
input[3].ki.dwFlags = KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE;
input[3].ki.time = 0;
input[3].ki.dwExtraInfo = 0;

int retval = SendInput(4, input, sizeof(INPUT));
if(retval > 0)
{
  wxLogDebug("SendInput sent %i", retval);
}
else
{
  wxLogError("Unable to send input commands. Error is: %i", GetLastError());
}

您需要为每个键发送KeyDown和KeyUp事件。
要发送KeyUp事件,请将
dwFlags
设置为
KEYEVENTF\u KeyUp


此外,您需要使用
wVk
而不是
wScan
。(
wScan
仅与
KEYEVENTF\u UNICODE
一起使用)

仅为遇到此问题的人详细说明。I添加了KEYEVENTF\u UNICODE,删除了KEYEVENTF\u扫描码

KEYEVENTF_UNICODE 0x0004(如果指定), 系统合成一个VK_数据包 击键。wVk参数必须为 零。此标志只能组合使用 使用KEYEVENTF\u KEYUP标志。对于 更多信息,请参见备注 节

-

样本应输出“aa”

#包括
#包括
int _tmain(int argc,_TCHAR*argv[]
{
输入[4];
输入[0]。类型=输入\键盘;
输入[0].ki.wVk=0;
输入[0].ki.wScan=L'a';
输入[0]。ki.dwFlags=KEYEVENTF_UNICODE;
输入[0].ki.time=0;
输入[0]。ki.dwextranfo=0;
输入[1]。类型=输入\键盘;
输入[1]。ki.wVk=0;
输入[1].ki.wScan=L'a';
输入[1]。ki.dwFlags=KEYEVENTF_KEYUP | KEYEVENTF_UNICODE;
输入[1]。ki.time=0;
输入[1]。ki.dwextranfo=0;
输入[2]。类型=输入\键盘;
输入[2].ki.wVk=0;
输入[2].ki.wScan=L'a';
输入[2]。ki.dwFlags=KEYEVENTF_UNICODE;
输入[2]。ki.time=0;
输入[2]。ki.dwextranfo=0;
输入[3]。类型=输入\键盘;
输入[3].ki.wVk=0;
输入[3].ki.wScan=L'a';
输入[3]。ki.dwFlags=KEYEVENTF_KEYUP | KEYEVENTF_UNICODE;
输入[3]。ki.time=0;
输入[3]。ki.dwextranfo=0;
设置控制台(L“测试”);
显示窗口(FindWindow(空,L“测试”),开关最小化;
int retval=SendInput(4,input,sizeof(input));
如果(返回值>0)
{ 
_tprintf(_T(“发送输入发送%i”),retval);
} 
其他的
{ 
_tprintf(_T(“无法发送输入命令。错误为:%i”)、GetLastError();
} 
返回0;
}

我将标志更改为KEYEVENTF_UNICODE,它与扫描码一起工作。事实上,up事件不是必需的,尽管我展示的示例中有它。
#include <windows.h>
#include <tchar.h>

int _tmain(int argc, _TCHAR* argv[])
{
    INPUT input[4]; 

    input[0].type = INPUT_KEYBOARD; 
    input[0].ki.wVk = 0; 
    input[0].ki.wScan = L'a'; 
    input[0].ki.dwFlags = KEYEVENTF_UNICODE ; 
    input[0].ki.time = 0; 
    input[0].ki.dwExtraInfo = 0; 

    input[1].type = INPUT_KEYBOARD; 
    input[1].ki.wVk = 0; 
    input[1].ki.wScan = L'a'; 
    input[1].ki.dwFlags = KEYEVENTF_KEYUP  | KEYEVENTF_UNICODE ; 
    input[1].ki.time = 0; 
    input[1].ki.dwExtraInfo = 0; 

    input[2].type = INPUT_KEYBOARD; 
    input[2].ki.wVk = 0; 
    input[2].ki.wScan = L'a'; 
    input[2].ki.dwFlags = KEYEVENTF_UNICODE ; 
    input[2].ki.time = 0; 
    input[2].ki.dwExtraInfo = 0; 

    input[3].type = INPUT_KEYBOARD; 
    input[3].ki.wVk = 0; 
    input[3].ki.wScan = L'a'; 
    input[3].ki.dwFlags = KEYEVENTF_KEYUP | KEYEVENTF_UNICODE ; 
    input[3].ki.time = 0; 
    input[3].ki.dwExtraInfo = 0; 

     SetConsoleTitle(L"TESTING");
     ShowWindow(FindWindow(NULL, L"TESTING"),SW_MINIMIZE );

    int retval = SendInput(4, input, sizeof(INPUT)); 
    if(retval > 0) 
    { 
      _tprintf(_T("SendInput sent %i"), retval); 
    } 
    else 
    { 
      _tprintf(_T("Unable to send input commands. Error is: %i"), GetLastError()); 
    } 



    return 0;
}