Winapi 剪贴板数据赢了';不要贴
我正在尝试从剪贴板加载和粘贴数据,如下所示:Winapi 剪贴板数据赢了';不要贴,winapi,clipboard,Winapi,Clipboard,我正在尝试从剪贴板加载和粘贴数据,如下所示: int main() { Sleep(3000); char buf[] = "Hello33"; HWND hwnd = GetActiveWindow(); if (OpenClipboard(hwnd)) { EmptyClipboard(); HGLOBAL hClipboardData; hClipboardData = GlobalAlloc(GMEM
int main() {
Sleep(3000);
char buf[] = "Hello33";
HWND hwnd = GetActiveWindow();
if (OpenClipboard(hwnd)) {
EmptyClipboard();
HGLOBAL hClipboardData;
hClipboardData = GlobalAlloc(GMEM_DDESHARE, BUFLEN);
char * pchData;
pchData = (char*) GlobalLock(hClipboardData);
strcpy(pchData, LPCSTR(buf));
GlobalUnlock(hClipboardData);
SetClipboardData(CF_TEXT, hClipboardData);
CloseClipboard();
SendMessage(hwnd, WM_PASTE, 0, 0);
}
}
启动程序,然后打开文本编辑器,文本编辑器是顶部窗口,不粘贴任何文本。如果我执行粘贴命令
Ctrl-V
,我将Hello33
放入文本区域。GetActiveWindow返回主窗口而不是子窗口
您应该尝试GetFocus()
但即使这样也不行,因为它位于属于其他进程的其他线程中
要解决这个问题,请致电
最后,我建议放弃所有这些,改用FindWindow并直接将消息发送到编辑框,方法是使用
GetActiveWindow
从命令行应用程序调用时,可能返回NULL
。它返回调用线程的活动窗口。你可能是想打电话。无论哪种方式,您都会得到一个顶级窗口。这通常不是一个处理WM_PASTE
消息的窗口。不管代码中有什么错误,剪贴板都属于用户。未经用户同意,请勿使用。如果要自动化另一个应用程序,请改用。如果将空HWND传递给OpenClipboard()
(例如GetActivewindow()
失败),SetClipboardData()
将失败。这是一种行为:“如果应用程序在hwnd设置为NULL的情况下调用OpenClipboard,EmptyClipboard会将剪贴板所有者设置为NULL;这会导致SetClipboardData失败。”您无法使用尚未拥有的hwnd打开剪贴板。