将选定的文本复制到MSWord,OOWriter等中的剪贴板

时间:2019-04-15 18:57:27

标签: winapi clipboard

我在Delphi上有代码(但这不是主体)

 hWindow := GetForegroundWindow;
 EditHandle := GetTopWindow(hWindow);
 SendMessage(EditHandle, WM_COPY, 0, 0);
 SClipboard := Clipboard.AsText;

如果此代码适用于记事本-一切都很好。如果是另一个而不是简单的编辑器,则所选文本不会复制到剪贴板。 如何执行将文本复制到剪贴板? 我怀疑SendMessage无法正常工作。

1 个答案:

答案 0 :(得分:0)

首先,并非所有顶部窗口都是编辑控件。因此,EditHandle是不可预测的。

然后,WM_COPY仅在编辑控件或组合框中受支持。 WM_GETTEXT也是一样,它们不支持所有窗口。 除非您是Windows的所有者,否则您将无法更改其消息处理机制。

但是,有一种解决方法-将“ Ctrl + C”键盘输入模拟到目标窗口。

//SetForegroundWindow(hWindow); Since hWindow is already a Foreground Window
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);    // Ctrl down
keybd_event(ord('C'), MapVirtualKey(ord('C'), 0), 0, 0);        // C down
keybd_event(ord('C'), MapVirtualKey(ord('C'), 0), KEYEVENTF_KEYUP, 0);     // C up
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0); // Ctrl up

编辑:

由于keybd_event已被SendInput取代,因此以下是使用SendInput的C ++示例:

INPUT input[4] = {0};
input[0].type = input[1].type = input[2].type = input[3].type = INPUT_KEYBOARD;
input[0].ki.wVk = input[3].ki.wVk = VK_CONTROL;
input[0].ki.wScan = input[3].ki.wScan = MapVirtualKey(VK_CONTROL, MAPVK_VK_TO_VSC);
input[1].ki.wVk = input[2].ki.wVk = 'C';
input[1].ki.wScan = input[2].ki.wScan = MapVirtualKey('C', MAPVK_VK_TO_VSC);
input[2].ki.dwFlags = input[3].ki.dwFlags = KEYEVENTF_KEYUP; // there is no KEYEVENTF_KEYDOWN
SendInput(4, input, sizeof(INPUT));