2010-04-02 68 views
3

我不能得到這個工作的權利。這應該按左1秒鐘,然後等待10秒,然後用鼠標右鍵1秒,等:keybd_event是不工作的權利=(

keybd_event(0x25, 0xCB, 0, 0); // press left 
cout << "Ldown\n";    // so i know it worked 

Sleep(1000);     // hold it for 1sec 
keybd_event(0x25, 0xCB, KEYEVENTF_KEYUP, 0);// let go of the key 
cout << "Lup\n";    // so i know i let go 
Sleep(10000);     // Sleep for 10secs 

keybd_event(0x27, 0xCD, 0, 0); // press right 
cout << "Rdown\n";    // so i know i pressed right 
Sleep(1000);     // sleep 1sec 
keybd_event(0x27, 0xCD, KEYEVENTF_KEYUP, 0);// let go of the key 
cout << "Rdown\n";    // so i know i let go. 

這是一個循環,但它不會做任何事情:(除非我關閉程序之前,關鍵是放手,那麼它將保持關鍵,直到我再次按下鍵。

我知道你只能使用一個關鍵代碼if你想,但我需要同時使用。

所以我錯過什麼?

+0

如果除去睡眠,它的工作原理? ( – Eric 2010-04-02 02:36:50

+0

)No =(* FILLER TEXT:\ * – user302131 2010-04-02 02:40:11

+0

您是否嘗試過scancode = 0?第二個參數 – Eric 2010-04-02 02:46:38

回答

3

代碼似乎爲我工作。我清理了一點(沒有神奇的數字!,使用MapVirtualKey,輔助功能等):

#include <iostream> 
#include <windows.h> 

// for key pushing 
BYTE scan_code(DWORD pKey) 
{ 
    const DWORD result = MapVirtualKey(pKey, MAPVK_VK_TO_VSC); 

    return static_cast<BYTE>(result); 
} 

void press_key(DWORD pKey) 
{ 
    keybd_event(static_cast<BYTE>(pKey), scan_code(pKey), 0, 0); 
} 

void release_key(DWORD pKey) 
{ 
    keybd_event(static_cast<BYTE>(pKey), scan_code(pKey), KEYEVENTF_KEYUP, 0); 
} 

// for testing 
#define PRESS(x) press_key(x); std::cout << "Press: " #x << std::endl 
#define RELEASE(x) release_key(x); std::cout << "Release: " #x << std::endl 

// test 
int main(void) 
{ 
    for (;;) 
    { 
     PRESS(VK_LEFT); 
     Sleep(10); // hold it for 1/100'th of a second 

     RELEASE(VK_LEFT); 
     Sleep(1000); // wait for a second 

     PRESS(VK_RIGHT); 
     Sleep(10); // hold it for 1/100'th of a second 

     RELEASE(VK_RIGHT); 
     Sleep(1000); // wait for a second 
    } 
} 

我測試通過打開記事本,輸入一串字符,然後運行該程序。脫字符來回移動。你如何測試它?

1

你是如何衡量「什麼都不做」?僅僅是沒有輸出?使用std :: ENDL結束你的線條,GMAN做,而不是「\ n」,因爲ENDL執行除了輸出換行符沖洗。