2011-03-19 91 views
1

我已經在Internet上搜索了一個用於在C++中模擬按鍵的好系統。分解字符串並使用keybd發送字符

我想一個字符串發送到另一個程序,但據我可以看到GenerateKey功能只能一次發送一個。我創建了一個代碼來分解一個字符串,並單獨發送每個字母,但有時會發送字母表中特定字母的數字而不是字母本身。 (例如,我輸入「H」電腦吐出了「8」)

我怎樣才能解決這個問題,是有沒有更好的辦法做到這一點?謝謝!

#include <windows.h> 
#include<iostream> 
#include <winable.h> 
#include <fstream> 
#include<time.h> 
#include<string> 

using namespace std; 

void GenerateKey(int vk, BOOL bExtended) { 

    KEYBDINPUT kb = {0}; 
    INPUT  Input = {0}; 

    /* Generate a "key down" */ 
    if (bExtended) { kb.dwFlags = KEYEVENTF_EXTENDEDKEY; } 
    kb.wVk = vk; 
    Input.type = INPUT_KEYBOARD; 
    Input.ki = kb; 
    SendInput(1, &Input, sizeof(Input)); 

    /* Generate a "key up" */ 
    ZeroMemory(&kb, sizeof(KEYBDINPUT)); 
    ZeroMemory(&Input, sizeof(INPUT)); 
    kb.dwFlags = KEYEVENTF_KEYUP; 
    if (bExtended) { kb.dwFlags |= KEYEVENTF_EXTENDEDKEY; } 
    kb.wVk = vk; 
    Input.type = INPUT_KEYBOARD; 
    Input.ki = kb; 
    SendInput(1, &Input, sizeof(Input)); 

    return; 
}  

int main() { 

SetConsoleTitle("sendkeys"); 
string sentence; 
while (1){ 
    cin>>sentence; 
    char letter; 
    int track = 0; 

    while(sentence[track] != '\0') { 

    cout<<sentence[track]; 
    letter = sentence[track];  
    GenerateKey(letter, FALSE); 
    track++;  
}  
}  
} 
+0

GenerateKey('a',FALSE);這會生成密鑰a, – 2011-03-20 00:13:41

+0

已經添加了'winapi'標籤,因爲這與C++本身無關。 – 2011-03-20 00:33:25

+0

GenerateKey('h'...)讓你獲得8的原因是因爲SendInput採用VK值,該值標識鍵盤上的鍵,而不是ASCII字符。 VK和ASCII值在0-9和A-Z之間重疊 - 大寫;但任何其他的ASCII值最終會讓你成爲一個「隨機」鍵。小寫字母h的ASCII代碼爲0x68;在winuser.h中查看它,它定義了所有的VK_值,並且你會看到它是VK_NUMPAD8,所以系統將它視爲在數字鍵盤上按8。這將使您獲得8或上箭頭,具體取決於numlock。發送'H'會根據大寫鎖定狀態獲得H和h。 – BrendanMcK 2011-03-20 04:49:56

回答

1

這種做法真的很複雜(需要管理SHIFT,控制和ALT的狀態,轉換特殊字符ALT + 0xyz連擊),如果用戶在這個過程中改變了鍵盤焦點,鍵就可以去錯誤的窗口。

使用SendMessage(WM_SETTEXT)SendMessage(EM_REPLACESEL)你可以一次發送整個字符串到一個特定的窗口。

+0

謝謝,我正在調查。 – 2011-03-20 00:36:48

+0

你能給我一個用於發送字符串的synax的例子嗎? – 2011-03-20 00:45:05

+0

或者它是一個獨立的功能? – 2011-03-20 21:12:34

1

我並不完全熟悉你正在使用的一些API,但是我假設你正在嘗試將文本發送到其他進程的stdin

如果它是一個子進程(即一個你進程中啓動本身),你可以使用管道和重定向的I/O在this article解釋。

+0

我很抱歉地說,我是什麼可悲的陌生你在談論。但我會研究它。 – 2011-03-20 21:12:01

+0

'SendInput'發送鍵盤事件到UI消息循環,而不是'stdin'。 – 2011-03-20 22:53:49

+0

@Ben:gotcha。 @Edmund:在這種情況下,這種方法可能不是你所需要的。請隨時忽略! – Mac 2011-03-20 23:01:13

相關問題