1

很可笑。几分钟前我刚刚在这里询问SendInput() 键盘 - 只有小写,如何发送大写字母。解决方案是在信件之前发送班次。但是开机后就关不掉了...

我正在努力使用这样的 KEYEVENTF_KEYUP 标志:

INPUT Input = { 0 };
Input.type       = INPUT_KEYBOARD;
Input.mi.dwFlags = KEYEVENTF_EXTENDEDKEY;
Input.ki.wVk   = VK_LSHIFT;
SendInput( 1, &Input, sizeof( INPUT ) );

Input.type       = INPUT_KEYBOARD;
Input.mi.dwFlags = KEYEVENTF_EXTENDEDKEY;
Input.ki.wVk   = 'A';
SendInput( 1, &Input, sizeof( INPUT ) );

Input.type       = INPUT_KEYBOARD;
Input.mi.dwFlags = KEYEVENTF_KEYUP | KEYEVENTF_EXTENDEDKEY;
Input.ki.wVk   = VK_LSHIFT;
SendInput( 1, &Input, sizeof( INPUT ) );

Input.type       = INPUT_KEYBOARD;
Input.mi.dwFlags = KEYEVENTF_EXTENDEDKEY;
Input.ki.wVk   = 'A';
SendInput( 1, &Input, sizeof( INPUT ) );

但它似乎根本不起作用。它总是发送AA。

谢谢。

4

1 回答 1

1

问题在于

Input.mi.dwFlags

它应该是

Input.ki.dwFlags

感谢罗德里戈。

另一种方法是使用 KEYEVENTF_SCANCODE 标志。然后我们必须使用 VkKeyScan() 扫描我们的字符 - http://msdn.microsoft.com/en-us/library/windows/desktop/ms646329(v=vs.85).aspx,它为我们提供了虚拟键代码低字节和高字节中的状态(shift、ctrl 等)。

由于使用扫描码,我们必须使用 MapVirtualKey() 和 MAPVK_VK_TO_VSC 值将我们的虚拟代码映射到扫描码,MS​​DN 说:

uCode 是一个虚拟键码,被翻译成扫描码。如果是不区分左右键的虚拟键码,则返回左手扫码。如果没有翻译,该函数返回 0。

然后将其传递给 Input.ki 结构的 wScan 字段,因为根据 MSDN,如果我们使用扫描代码,它会忽略 wVk 并使用 wScan,MSDN 说:

如果指定,wScan 会识别密钥并忽略 wVk。

因此代码看起来像这样:

INPUT Event = { 0 };

const SHORT key = VkKeyScan('a');
const UINT mappedKey = MapVirtualKey( LOBYTE( key ), 0 );

// Press shift key
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = KEYEVENTF_SCANCODE;
Event.ki.wScan = MapVirtualKey( VK_LSHIFT, 0 );
SendInput( 1, &Event, sizeof( Event ) );

// upper case 'A' (press down)
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = KEYEVENTF_SCANCODE;
Event.ki.wScan = mappedKey;
SendInput( 1, &Event, sizeof( Event ) );

//  release 'A'
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
Event.ki.wScan = mappedKey;
SendInput( 1, &Event, sizeof( Event ) );

// Release shift key
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
Event.ki.wScan = MapVirtualKey( VK_LSHIFT, 0 );
SendInput( 1, &Event, sizeof( Event ) );

const SHORT key1 = VkKeyScan('a');
const UINT mappedKey1 = MapVirtualKey( LOBYTE( key1 ), 0 );

// lower case 'a' (press down)
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = KEYEVENTF_SCANCODE;
Event.ki.wScan = mappedKey1;
SendInput( 1, &Event, sizeof( Event ) );

// release 'a'
Event.type = INPUT_KEYBOARD;
Event.ki.dwFlags = KEYEVENTF_SCANCODE;
Event.ki.wScan = mappedKey1;
SendInput( 1, &Event, sizeof( Event ) );

如果我说错了,请纠正我。

于 2012-07-11T19:20:13.640 回答