2013-05-12 91 views
2

我有下面的代碼,我試圖從活動窗口中獲取選定的文本並將其打印到控制檯上。使用C++從活動窗口中獲取選定的文本

DWORD new12=0; 
KEYBDINPUT* input = new KEYBDINPUT[key_count]; 
    if(GetGUIThreadInfo(new12, lpgui)) 
{ 
    target_window = lpgui->hwndFocus; 
} 
else 
{ 
    // You can get more information on why the function failed by calling 
    // the win32 function, GetLastError(). 
    std::cout<<"error1"; 
} 
// We're sending two keys CONTROL and 'V'. Since keydown and keyup are two 
// seperate messages, we multiply that number by two. 

for(int i = 0; i < key_count; i++) 
{ 
    input[i].dwFlags = 0; 
    //input[i].type = INPUT_KEYBOARD; 
} 

input[0].wVk = VK_CONTROL; 
input[0].wScan = MapVirtualKey(VK_CONTROL, MAPVK_VK_TO_VSC); 
input[1].wVk = 0x56; // Virtual key code for 'v' 
input[1].wScan = MapVirtualKey(0x56, MAPVK_VK_TO_VSC); 

我有以上的C++代碼,但它似乎是給了一個錯誤說「error: MAPVK_VK_TO_VSC' was not declared in this scope」在該行input[0].wScan = MapVirtualKey(VK_CONTROL, MAPVK_VK_TO_VSC); 我不知道這裏有什麼問題。我不認爲這個錯誤是由於任何聲明問題而出現的。你能幫我在這裏嗎?謝謝。

+2

使用可訪問性接口。這就是他們的目的。 – 2013-05-12 02:21:20

+0

@Raymond Chen我正在使用jgrasp。我如何使用輔助接口? – 2013-05-12 02:30:54

+0

這是一個比單個SO問題可涵蓋的更大的話題。您可以閱讀MSDN中的輔助功能文檔。您可能最終會使用TextPattern.GetSelection。 – 2013-05-12 03:43:13

回答

3

MAPVK_VK_TO_VSC是一個簡單的#define MAPVK_VK_TO_VSC (0),甚至不是一個常量,所以它應該在預處理階段解決。或者你有未定義的WIN_VER(或定義它小於0x400),或者你錯過了包含「winuser.h」在這個代碼之前(在這種情況下,MapVirtualKey和VK_常量也將不被聲明)。有時很容易忘記WIN_VER必須以十六進制定義,並且使用#define WINVER 500之類的東西,您的版本低於2.0

+0

我已經包含標題和win_ver,但仍然彈出錯誤..我真的很想知道問題是什麼。我應該將MAPVK_VK_TO_VSC的值硬編碼爲0嗎? – 2013-05-13 05:03:47

+0

如果您發現任何MAPVK_VK_TO_VSC,請查看您的winuser.h文件。您可能有一個非常舊的SDK,其中沒有定義MAPVK_VK_TO_VSC。 – 2013-05-13 06:08:41

+0

是的,硬編碼0和看看會發生什麼是有意義的。我會添加'cout <<「WIN_VER也是」<< hex << WIN_VER << endl;',以確保沒有其他頭文件或編譯器選項重置它。 – 2013-05-13 10:18:34