2015-08-09 9 views
7

मैं किसी अन्य एप्लिकेशन को दी गई प्रमुख घटनाओं की निगरानी करना चाहता हूं, और जब भी 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% 

काम करता प्रतीत होता है तात्कालिक। इसलिए क्लिपबोर्ड सामग्री को पकड़ने के लिए एक तेज़ तरीका होना चाहिए।

कोई भी जानता है कि सी में इसे कैसे किया जाए - मैं क्या गलत कर रहा हूं?

+3

कीबोर्ड इनपुट बफ़र है, तो आप पता नहीं वास्तव में जब लक्ष्य एप्लिकेशन संदेश कतार से कीस्ट्रोक प्राप्त हो सकें। कोई उचित ऊपरी सीमा नहीं है, जब ऐप को स्मृति से बाहर कर दिया गया है तो इसमें * सेकंड * लग सकते हैं। स्पष्ट रूप से आप इसे गलत कर रहे हैं, और कुछ भी बेहतर है। WM_COPY संदेश भेजने और UI स्वचालन का उपयोग करने के लिए SendMessageTimeout() तक सीमित नहीं है। –

+0

वाह, SendMessage वास्तव में चमत्कार काम करता है। SendInput के लिए मेरा कारण, यह "कुंजीपटल प्रेस सी भेजें" की तलाश करते समय Google में पॉप अप करना था - यह नहीं पता था कि यह इतना बुरा विचार है। – user2089648

+0

मुझे लगता है कि यह विंडोज है। उस कीवर्ड को जोड़ने में मददगार होगा। – Jeff

उत्तर

0

आप SetClipboardViewer() का उपयोग करना चाहिए, का उपयोग नहीं करते Sleep()

संबंधित मुद्दे