c++ - 监视剪贴板更改

c++ - 监视剪贴板更改

订阅 WM_CLIPBOARDUPDATE消息使用 AddClipboardFormatListener需要消息队列和消息泵。对于控制台应用程序,这可以通过 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;
}

https://stackoverflow.com/questions/65840288/monitor-clipboard-changes-c-for-all-applications-windows

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值