C剪贴板更新很慢

Posted

技术标签:

【中文标题】C剪贴板更新很慢【英文标题】:C Clipboard updating very slow 【发布时间】:2015-11-01 18:25:27 【问题描述】:

我想监控给另一个应用程序的关键事件,每当按下 ctrl+d 时,发送 ctrl+c,抓取(新)剪贴板内容并根据它执行其他操作。

我的代码:

void PressKeyboardKey(char key)
    INPUT ip;
    ip.type = INPUT_KEYBOARD;
    ip.ki.wVk = key;
    ip.ki.wScan = 0;
    ip.ki.dwFlags = 0;
    ip.ki.time = 0;
    ip.ki.dwExtraInfo = 0;
    SendInput(1, &ip, sizeof(INPUT));
    ip.ki.dwFlags =  KEYEVENTF_KEYUP;
    SendInput(1, &ip, sizeof(INPUT));


LRESULT CALLBACK LowLevelKeyboardProc( int nCode, WPARAM wParam, LPARAM lParam )
char pressedKey;
// Declare a pointer to the KBDLLHOOKSTRUCTdsad
KBDLLHOOKSTRUCT *pKeyBoard = (KBDLLHOOKSTRUCT *)lParam;
switch( wParam )

case WM_KEYUP:
   
    pressedKey = (char)pKeyBoard->vkCode; //get the key code
    if ((pressedKey == -94) || (pressedKey == -93))    //Ctrl
        CtrlPressed = FALSE;
    else if (pressedKey == 68)    //d
        if (CtrlPressed && IsTargetApplicationActive())
            PressKeyboardKey(67);  //c
            //Read from Clipboard
            Sleep(CLIPBOARD_SLEEP_TIME);
            HANDLE h;
            if (!OpenClipboard(NULL))
                break;  //abort
            
            h = GetClipboardData(CF_TEXT);
            const char* output = evaluateItem((char*)h);  // For now prints the content of the clipboard
            Sleep(ADDITIONAL_SLEEP_TIME);  //Ususally not there, added just for testing
            CloseClipboard();
            .....

如果 CLIPPBOARD_SLEEP_TIME >= 350(最小值),一切都会按预期进行,对于一个良好的工作流程来说,时间太长了。否则,我只会得到旧的剪贴板内容。

我的第一个猜测是,目标应用程序填充剪贴板的速度非常慢,但是下面的 ahk 脚本:

^d::
Send, ^c
MsgBox, %clipboard%

似乎是瞬时的。 因此必须有一种更快的方法来抓取剪贴板的内容。

任何人都知道如何在 C 中做到这一点 - 我做错了什么?

【问题讨论】:

键盘输入被缓冲,您不知道目标应用程序何时从消息队列中检索击键。没有合理的上限,当应用程序被换出内存时可能需要 。显然你做错了,其他的更好。不限于 SendMessageTimeout() 发送 WM_COPY 消息和使用 UI 自动化。 哇,SendMessage 真的很神奇。我使用 SendInput 的原因,是不是在寻找“发送键盘按 c”时在谷歌中弹出的东西 - 不知道这是一个坏主意。 我假设这是 Windows。添加该关键字会很有帮助。 【参考方案1】:

你必须使用SetClipboardViewer(),不要使用Sleep()

【讨论】:

以上是关于C剪贴板更新很慢的主要内容,如果未能解决你的问题,请参考以下文章

粘贴前更新剪贴板数据(不是“粘贴”事件)

从剪贴板获取数据并重新设置 - WINAPI,C [重复]

C#winform 剪贴板中的EXCEL文档,存入datatable中

python 带有Python 3更新的HTMLClipboard包括锁定剪贴板的异常处理。改进:http://code.activestate.com/recip

c_cpp 剪贴板简单用法

C ++从Linux上的剪贴板获取字符串