【问题标题】:C++ Generating Key Combinations WINAPI (Without MFC)C++ 生成组合键 WINAPI(无 MFC)
【发布时间】:2012-05-10 10:27:59
【问题描述】:

我正试图让我的应用程序输出一个组合键 (ALT + D) 以专注于 Internet Explorer 地址栏,但我无法实现所需的代码。我已经有了一个传递 1 个密钥的方法:

void GenerateKey(int vk, BOOL bExtended) {

KEYBDINPUT  kb = {0};
INPUT       Input = {0};

/* Generate a "key down" */
if (bExtended) { kb.dwFlags  = KEYEVENTF_EXTENDEDKEY; }
kb.wVk  = vk;
Input.type  = INPUT_KEYBOARD;
Input.ki  = kb;
SendInput(1, &Input, sizeof(Input));

/* Generate a "key up" */
ZeroMemory(&kb, sizeof(KEYBDINPUT));
ZeroMemory(&Input, sizeof(INPUT));
kb.dwFlags  =  KEYEVENTF_KEYUP;
if (bExtended) { kb.dwFlags |= KEYEVENTF_EXTENDEDKEY; }
kb.wVk = vk;
Input.type = INPUT_KEYBOARD;
Input.ki = kb;
SendInput(1, &Input, sizeof(Input));

return;
}

任何人都可以就如何实现所需的解决方案提供一些帮助吗?

解决方案:

我设法使用以下方法解决了这个问题:

void GenerateKeyCombination(int vk, int vk2, BOOL bExtended, BOOL bExtended2) {

KEYBDINPUT  kb = {0};
INPUT       Input = {0};
KEYBDINPUT  kb2 = {0};
INPUT       Input2 = {0};

// Generate a "key down" 1
if (bExtended) { kb.dwFlags  = KEYEVENTF_EXTENDEDKEY; }
kb.wVk  = vk;
Input.type  = INPUT_KEYBOARD;
Input.ki  = kb;
SendInput(1, &Input, sizeof(Input));

// Generate a "key down" 2
if (bExtended2) { kb2.dwFlags  = KEYEVENTF_EXTENDEDKEY; }
kb2.wVk  = vk2;
Input2.type  = INPUT_KEYBOARD;
Input2.ki  = kb2;
SendInput(1, &Input2, sizeof(Input2));

// Generate a "key up" 1
ZeroMemory(&kb, sizeof(KEYBDINPUT));
ZeroMemory(&Input, sizeof(INPUT));
kb.dwFlags  =  KEYEVENTF_KEYUP;
if (bExtended) { kb.dwFlags |= KEYEVENTF_EXTENDEDKEY; }
kb.wVk = vk;
Input.type = INPUT_KEYBOARD;
Input.ki = kb;
SendInput(1, &Input, sizeof(Input));

// Generate a "key up" 2
ZeroMemory(&kb2, sizeof(KEYBDINPUT));
ZeroMemory(&Input2, sizeof(INPUT));
kb2.dwFlags  =  KEYEVENTF_KEYUP;
if (bExtended2) { kb2.dwFlags |= KEYEVENTF_EXTENDEDKEY; }
kb2.wVk = vk2;
Input2.type = INPUT_KEYBOARD;
Input2.ki = kb2;
SendInput(1, &Input2, sizeof(Input2));

return;
}

然后这样称呼它:

        GenerateKeyCombination(0x12, 0x44, FALSE, FALSE);

0x12 是 ALT,0x44 是 D。

【问题讨论】:

  • 我不知道winapi,但是你有没有试过提供两个keydown事件,然后是key ups?
  • 这就是我一直在尝试做的,但它根本不适合我。我添加了第二种方法“GenerateKeyCombination”,它需要 4 个参数,但 Alt+D 仍然不起作用。它会选择 chrome 中的设置图标而不是地址栏。

标签: c++ winapi keypress


【解决方案1】:

将加速器映射添加到您的项目资源中,在运行时将其加载到您的应用程序中,并在您的消息循环中添加对 TranslateAccelerator 的调用,然后 TranslateMessage 和 DispatchMessage 有机会查看它。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646373%28v=vs.85%29.aspx 供参考。

【讨论】:

  • 我将此标记为答案,因为这可能是解决此问题的正确方法。但是,我设法使用添加到原始问题中的方法来解决它。
猜你喜欢
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
  • 2012-09-13
  • 1970-01-01
相关资源
最近更新 更多