我在Delphi上有代码(但这不是主体)
hWindow := GetForegroundWindow;
EditHandle := GetTopWindow(hWindow);
SendMessage(EditHandle, WM_COPY, 0, 0);
SClipboard := Clipboard.AsText;
如果此代码适用于记事本-一切都很好。如果是另一个而不是简单的编辑器,则所选文本不会复制到剪贴板。 如何执行将文本复制到剪贴板? 我怀疑SendMessage无法正常工作。
答案 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));