VK_TAB在我的c ++程序中的SendInput()中不起作用

时间:2013-12-31 11:21:14

标签: c++ winapi

我正在开发一个项目,我使用SendInput()将粘贴命令发送到另一个应用程序窗口,如下所示:

`INPUT input, vButton, ctrl1, ctrl2;` 
input.type = INPUT_KEYBOARD; 
input.ki.wVk = VK_CONTROL; 
input.ki.wScan = 0; 
input.ki.dwFlags = KEYEVENTF_UNICODE ; 
input.ki.time = 0; 
input.ki.dwExtraInfo = 0; 

vButton .type = INPUT_KEYBOARD; 
vButton .ki.wVk = 0x56; 
vButton .ki.wScan =0; 
vButton .ki.dwFlags = KEYEVENTF_UNICODE ; 
vButton .ki.time = 0; 
vButton .ki.dwExtraInfo = 0; 

ctrl1.type = INPUT_KEYBOARD; 
ctrl1.ki.wVk = VK_CONTROL; 
ctrl1.ki.wScan = 0;
ctrl1.ki.dwFlags = KEYEVENTF_KEYUP |KEYEVENTF_UNICODE ; 
ctrl1.ki.time = 0; 
ctrl1.ki.dwExtraInfo = 0; 

ctrl2.type = INPUT_KEYBOARD; 
ctrl2.ki.wVk = VK_TAB;
ctrl2.ki.wScan = 0; 
ctrl2.ki.dwFlags = KEYEVENTF_KEYUP ; 
ctrl2.ki.time = 0; 
ctrl2.ki.dwExtraInfo = 0; 

// Send Input To Another Window
::ShowWindow(mainHwnd, SW_SHOWNORMAL);
int retval = SendInput(1, &input, sizeof(INPUT)); 
retval = SendInput(1, &vButton, sizeof(INPUT)); 
retval = SendInput(1, &ctrl1, sizeof(INPUT)); 
retval = SendInput(1, &ctrl2, sizeof(INPUT));`

除了具有INPUT密钥的VK_TAB之外,它工作正常。我想发送VK_TAB命令到应用程序。

但它没有按预期工作,即使成功完成SendInput()后,下一个控件也没有得到关注。

任何人都可以帮助我。 我如何专注于其他应用程序的下一个控制?

先谢谢你。

1 个答案:

答案 0 :(得分:3)

如果您只是发送简单的密钥,请不要将KEYEVENTF_UNICODE用于dwFlags。对于KeyDown转换,将dwFlags设置为0,并将其设置为KEYEVENTF_KEYUP以进行KeyUp转换。

您忘了SendInput V的KeyUp转换和VK_TAB的KeyDown转换

使用那种代码。

INPUT input:
input.type = INPUT_KEYBOARD;
input.ki.time = 0;
input.ki.dwExtraInfo = 0;
input.ki.wScan = 0; 
input.ki.dwFlags = 0;

// Ctrl Down
input.ki.wVk = VK_CONTROL;
SendInput( 1, &input, sizeof( INPUT ) );
// V Down
input.ki.wVk = 0x56;
SendInput( 1, &input, sizeof( INPUT ) );
// V Up
input.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput( 1, &input, sizeof( INPUT ) );
// Ctrl Up
input.ki.wVk = VK_CONTROL;
SendInput( 1, &input, sizeof( INPUT ) );
// Tab Down 
input.ki.wVk = VK_TAB;
input.ki.dwFlags = 0;
SendInput( 1, &input, sizeof( INPUT ) );
// Tab Up
input.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput( 1, &input, sizeof( INPUT ) );