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打开剪贴板。