在我的 c# .Net 应用程序中,我一直在尝试能够检索当前聚焦窗口中当前选定的文本。 (注意可以是windows中打开的任何窗口,比如word,或者safari)。
我能够检索当前聚焦控件的句柄。 (使用对 user32.dll 和 kernel32.dll 的几个互操作调用)。
但是,我一直无法始终能够取回所选文本。
我尝试过使用 SENDMESSAGE 和 GET_TEXT。然而,这似乎只适用于某些应用程序(适用于写字板等简单应用程序,不适用于 Firefox 或 Word 等更复杂的应用程序)。
我尝试过使用 SENDMESSAGE 和 WM_COPY。然而,这似乎只适用于某些控件。 (我认为 WM_COPY 会导致与手动按 CTRL-C 完全相同的行为,但事实并非如此)。
我尝试使用 SENDMESSAGE 和 WM_KEYUP+WM_KEYDOWN 手动激发复制命令。但这也并不总是有效。 (可能与用户调用我的应用程序时按下的实际热键重叠)。
关于始终能够检索当前选定的文本有什么想法吗? (在任何应用程序上)。
我通过结合几件事来实现这个工作。所以:
- 等待当前按住的任何修改器被释放。
-
发送 control+c (使用这个答案触发操作系统以编程方式复制(ctrl+c 或 Ctrl-x) https://stackoverflow.com/questions/2886756/trigger-os-to-copy-ctrlc-or-ctrl-x-programicly)
bool stillHeld = true;
int timeSlept = 0;
do
{
// wait until our hotkey is released
if ((Keyboard.Modifiers & ModifierKeys.Control) > 0 ||
(Keyboard.Modifiers & ModifierKeys.Alt) > 0 ||
(Keyboard.Modifiers & ModifierKeys.Shift) > 0)
{
timeSlept += 50;
System.Threading.Thread.Sleep(timeSlept);
}
else
{
stillHeld = false;
}
} while (stillHeld && timeSlept < 1000);
Keyboard.SimulateKeyStroke('c', ctrl: true);
我使用的是 WPF,因此 Keyboard.Modifiers 是 System.Windows.Input.Keyboard,而 Keyboard.SimulateKeyStroke 来自 Chris Schmick 的答案。
请注意, timeSlept 是我在继续愉快的方式之前等待用户放开按键的最长时间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)