2015-05-21 37 views
4

我可以在不使用剪貼板的情況下從另一個應用程序中獲取選定的文本。我找到了從活動應用程序獲得HWND的方法,但是當我使用EM_GETSELTEXT時,它們在緩衝區中沒有文本。如何從另一個應用程序獲取選定的文本?

char* shortcut::getSelectedText(){ 
    POINT mouse; 
    if (GetCursorPos(&mouse)){ 
    HWND window = WindowFromPoint(mouse);//get the HWND from the active application 
    if (window != nullptr){ 
     char* buffer = new char[100]; 
     SendMessage(window , EM_GETSELTEXT, 0, LPARAM(buffer)); 
     return buffer; 
    } 
    else{ 
     return ""; 
    } 
    } 
    else{ 
    return ""; 
    } 
} 
+0

請問您是否需要重新編譯變量'racourci','souri'和'fenetre'爲英文?您的代碼看起來有點模糊。 –

+0

HWND是一個Rich Edit框,對吧? –

+2

'EM_GETSELTEXT'位於消息的'WM_USER + x'範圍內。系統不會爲該範圍內的消息提供指針自動封送處理。您必須在目標進程中分配內存,或使用其中一個標準Windows消息(例如'WM_GETTEXT')。當然,Right Thing™要做的就是使用[UI Automation](https://msdn.microsoft.com/en-us/library/windows/desktop/ee684009.aspx)。除非你對你的應用程序隨機失敗感到滿意。 – IInspectable

回答

-1

您可以分兩步進行。 首先發送EM_GETSEL獲取所選文本的開始/結束索引(0,0如果沒有被選中) 然後調用GetWindowText時,或發送WM_GETTEXT以獲得完整的文本,並篩選出所選擇的子

TCHAR buffer[100]; 

DWORD start, end; 
SendMessage(hEdit, EM_GETSEL, (WPARAM)&start, (LPARAM)&end); 

GetWindowText(hEdit, buffer, 100); 
TCHAR * otherBuff = new TCHAR[100]; 
memset(otherBuff, 0, 100 * sizeof *otherBuff); 
_tcsncpy(otherBuff, buffer + start, end); 

尹恩惠順便說一下,有等待您的代碼中發生了一個錯誤:

你動態分配緩存和從函數返回指針

的char *緩衝區=新的char [100];

在某些時候,您將不得不刪除[]指針。但是,如果函數中出現錯誤,則返回空字符串文字「」。如果你刪除你的代碼崩潰。所以要麼你最終崩潰或內存泄漏。 我建議將指針作爲參數傳遞給函數,並將字符串複製到那裏。

+0

您不能通過進程邊界發送'WM_USER + x'消息。 'EM_GETSEL'是系統不會自動爲您編組的消息之一。除非您讓代碼在目標進程的地址空間內運行,否則最好會損壞隨機內存。 – IInspectable

相關問題