【问题标题】:Simulate pressed shortcut模拟按下的快捷方式
【发布时间】:2012-05-20 06:23:20
【问题描述】:

对不起,我不得不以这种迂回的方式描述功能,但我不知道如何最好地实现想要的功能*

我有一个简单的程序,可以在按下全局热键时将一些数据放入剪贴板。用户通常的用例是直接将该文本粘贴到 Photoshop 中的文本字段中。 IE。 - 假设ctrl-x 调用全局热键 - 他们一直在做ctrl-x ctrl-v。显然这是糟糕的设计。

那么,基本上模拟ctrl-v 事件的最简单方法是什么,以便 Photoshop 无需额外按键即可直接粘贴文本?

正如winapi 标签所暗示的,我在这里并不关心Mac。必须在 Win 7 下工作,与 XP/Vista 的兼容性将是一个明确的优势。脚本的其余部分是用 Python3 和 PyQt4 编写的,但如果需要,我也可以编写一些 c 扩展。

PS:欢迎大家对标题有更好的想法来改进它。

*而且我想避免执行问题的简单一半然后要求不可能的事情的陷阱。

【问题讨论】:

  • 您可以将您的问题视为重放键盘宏。您可以尝试嗅探 Windows 键盘宏记录器 AutoHotKey 的来源,看看它们是如何模拟按键的。
  • @Li 看起来正是我要找的东西,谢谢!让我们看看我能不能弄明白。
  • 很高兴为您提供帮助。如果您弄明白了,请在此处发布答案,这样我们以后就不必重新弄明白了。 ;)
  • @Li 正在计划中。现在我只需要鼓起勇气看看 win32 代码——这些年来 API 真的没有变得更漂亮;)
  • 您可以使用SendInput,但它是 AHK 中的单行代码。

标签: c++ python qt winapi keyboard-shortcuts


【解决方案1】:

使用SendInput()。我没有对此进行测试,但它应该可以工作:

INPUT ctrlV [4];
ZeroMemory(ctrlv, sizeof ctrlV);

ctrlV [0].type = INPUT_KEYBOARD;
ctrlV [0].ki.wVk = VK_LCONTROL;

ctrlV [1].type = INPUT_KEYBOARD;
ctrlV [1].ki.wVk = 'V'; //assuming ASCII

ctrlV [2].type = INPUT_KEYBOARD;
ctrlV [2].ki.wVk = 'V'; //assuming ASCII
ctrlV [2].ki.dwFlags = KEYEVENTF_KEYUP;

ctrlV [3].type = INPUT_KEYBOARD;
ctrlV [3].ki.wVk = VK_LCONTROL;
ctrlV [3].ki.dwFlags = KEYEVENTF_KEYUP;

SendInput (4, ctrlV, sizeof (INPUT));

【讨论】:

  • 啊,Win32的荣耀。看看这是多么简单! :)
  • @Li 是的,他们确实试图使 API 尽可能简单;)仍然很好。
  • 我认为主要是它是用C编写的,目的是覆盖所有基础。当然,他们一直在使事情更容易与托管代码(如 MFC)一起使用。这个函数是包装器的主要候选者之一:Input::generate ("^X"); 将是我可以看到的东西。当然,您可以对其进行大量更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多