C剪贴板更新非常慢

时间:2015-08-09 22:22:45

标签: 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.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中做到这一点 - 我做错了什么?

1 个答案:

答案 0 :(得分:0)

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