C剪贴板更新非常慢

C剪贴板更新非常慢,c,windows,clipboard,C,Windows,Clipboard,我想监控给另一个应用程序的按键事件,每当按下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.dwExtraInf

我想监控给另一个应用程序的按键事件,每当按下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\u SLEEP\u TIME>=350(最小值),则一切都按预期进行,但对于一个好的工作流来说,时间太长了。否则,我只会得到旧的剪贴板内容

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

^d::
Send, ^c
MsgBox, %clipboard%
工作似乎是瞬间的。 因此,必须有一种更快的方法来抓取剪贴簿的内容


任何人都知道如何用C来做-我做错了什么?

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

键盘输入被缓冲,你不知道目标应用程序将在何时从消息队列中检索击键。没有合理的上限,当应用程序被换出内存时可能需要几秒钟。很明显你做错了,其他的都好。不仅限于SendMessageTimeout()发送WM_COPY消息和使用UI自动化。哇,SendMessage真的很神奇。我之所以选择SendInput,是因为它是谷歌搜索“send keyboard press c”时出现的东西——我不知道这是一个如此糟糕的主意。我假设这是Windows。添加该关键字会很有帮助。