2015-05-21 2 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 ™ - это пойти с [Автоматизация пользовательского интерфейса] (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); 

Ny кстати, есть ошибка ждущий, чтобы случиться в вашем коде:

Вы динамически выделяемый буфер и возвращает указатель из функции

обугленного * Buffer = новый символ [100];

В какой-то момент вам нужно будет удалить указатель []. Но если что-то пойдет не так в функции, вы возвращаете пустой строковый литерал «». Если вы удалите код сбой. Таким образом, либо вы закончите сбой или утечку памяти. Я рекомендую передать указатель в качестве аргумента функции и скопировать туда строку.

+0

Вы не можете отправлять сообщения WM_USER + x через границы процесса. 'EM_GETSEL' является одним из тех сообщений, которые система автоматически не маршалирует для вас. Если вы не внесете свой код в адресное пространство целевого процесса, в лучшем случае вы повредите случайную память. – IInspectable

Смежные вопросы