2015-08-09 19 views
7

Voglio monitorare gli eventi chiave dati a un'altra applicazione, e ogni volta che ctrl + d viene premuto, inviare ctrl + c, afferrare il (nuovo) contenuto degli appunti e, a seconda di come eseguire altre azioni.C L'aggiornamento degli appunti è molto lento

Il mio codice:

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(); 
      ..... 
} 

Se CLIPPBOARD_SLEEP_TIME> = 350 (minimo), tutto funziona come previsto, dura il tempo è troppo lungo per un buon flusso di lavoro. In caso contrario, ottengo solo il vecchio contenuto degli appunti.

La mia prima risposta è stata, che l'applicazione di destinazione riempie appunti molto lento, ma il seguente script AHK:

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

opere apparentemente istantanea. Quindi ci deve essere un modo più veloce per afferrare il contenuto degli appunti.

Qualcuno sa come farlo in C - cosa sto sbagliando?

+3

input della tastiera viene tamponata, si ha esattamente idea di quando l'applicazione di destinazione recupererà la sequenza di tasti dalla coda dei messaggi. Non esiste un limite massimo ragionevole, può richiedere * secondi * quando l'app è stata scambiata dalla memoria. Chiaramente stai sbagliando, qualsiasi altra cosa è migliore. Non limitato a SendMessageTimeout() per inviare il messaggio WM_COPY e utilizzare l'automazione dell'interfaccia utente. –

+0

Wow, SendMessage fa davvero miracoli. La mia ragione per SendInput, è stata LA cosa che è comparsa su google quando ho cercato "invia tastiera c" - non sapevo che questa è una cattiva idea. – user2089648

+0

Presumo che questo sia Windows. Sarebbe utile aggiungere quella parola chiave. – Jeff

risposta

0

È necessario utilizzare SetClipboardViewer(), non utilizzare Sleep()