【问题标题】:Monitor Clipboard Changes c++ For all applications (Windows)监控剪贴板更改 c++ 适用于所有应用程序 (Windows)
【发布时间】:2021-01-22 06:26:34
【问题描述】:

我在考虑创建一个程序的方法时遇到了麻烦,该程序可以随时监控剪贴板的使用情况,并将其打印到 .txt 文件中(应该可以监控任何窗口/应用程序的剪贴板)。我使用了使用剪贴板 WIn32,但我不确定如何让这个过程持续运行?我能够获得一次剪贴板,但我的程序停止了。我应该使用while循环吗?基本上,我的程序只在我希望它继续跟踪更改时运行一次。我该怎么办?

///

剪贴板格式侦听器能否帮助我满足我的需求?

///

int main()
{
    OpenClipboard(nullptr);
    HANDLE hData = GetClipboardData(CF_TEXT);
    char* pszText = static_cast<char*>(GlobalLock(hData));
    string text = pszText;
    GlobalUnlock(hData);
    CloseClipboard();

    cout << text;
    return 0;
}

【问题讨论】:

  • 诸如“剪贴板”之类的东西非常依赖于操作系统,有时甚至依赖于环境。请edit您的问题至少包含您的目标操作系统作为标签。也请花一些时间阅读How to Ask,以及this question checklist。
  • @Someprogrammerdude 请看上面。改变了。
  • 也许可以使用WM_CLIPBOARDUPDATE 消息进行调查。 Stack Overflow 上的某个地方甚至可能还有另一个帖子...
  • ...也许不完全是重复的,但在这里:stackoverflow.com/q/59460658/10871073
  • 已经看过这些资源了。还是很迷茫。

标签: c++ windows winapi


【解决方案1】:

使用AddClipboardFormatListener 订阅WM_CLIPBOARDUPDATE 消息需要消息队列和消息泵。对于控制台应用程序,这可以通过 message-only window 和相应的消息循环来完成。下面是一些实现两者的准系统代码。

#include <windows.h>
#include <stdio.h>

LRESULT CALLBACK ClipWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static BOOL bListening = FALSE;
    switch(uMsg)
    {
    case WM_CREATE:
        bListening = AddClipboardFormatListener(hWnd);
        return bListening ? 0 : -1;

    case WM_DESTROY:
        if(bListening)
        {
            RemoveClipboardFormatListener(hWnd);
            bListening = FALSE;
        }
        return 0;

    case WM_CLIPBOARDUPDATE:
        printf("WM_CLIPBOARDUPDATE\n");
        return 0;
    }

    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}


int main()
{
    WNDCLASSEX wndClass = { sizeof(WNDCLASSEX) };
    wndClass.lpfnWndProc = ClipWndProc;
    wndClass.lpszClassName = L"ClipWnd";
    if(!RegisterClassEx(&wndClass))
    {   printf("RegisterClassEx error 0x%08X\n", GetLastError()); return 1; }
    HWND hWnd = CreateWindowEx(0, wndClass.lpszClassName, L"", 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, GetModuleHandle(NULL), NULL);
    if(!hWnd)
    {   printf("CreateWindowEx error 0x%08X\n", GetLastError()); return 2; }

    printf("Press ^C to exit\n\n");

    MSG msg;
    while(BOOL bRet = GetMessage(&msg, 0, 0, 0)) {
        if(bRet == -1)
        {   printf("GetMessage error 0x%08X\n", GetLastError()); return 3; }
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

【讨论】:

    猜你喜欢
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    相关资源
    最近更新 更多