Чтение из текстового поля в окне другого приложения

Первый контекст (может быть Activity / Service и т. д.)

У вас есть несколько вариантов:

1) Используйте Bundle из Intent :

Intent mIntent = new Intent(this, Example.class);
Bundle extras = mIntent.getExtras();
extras.putString(key, value);  

2) Создайте новый Bundle

Intent mIntent = new Intent(this, Example.class);
Bundle mBundle = new Bundle();
mBundle.extras.putString(key, value);
mIntent.putExtras(mBundle);

3) Используйте метод ярлыка putExtra () для Intent

Intent mIntent = new Intent(this, Example.class);
mIntent.putExtra(key, value);

Новый контекст (может быть Activity / Service и т. Д.)

Intent myIntent = getIntent(); // this getter is just for example purpose, can differ
if (myIntent !=null && myIntent.getExtras()!=null)
     String value = myIntent.getExtras().getString(key);
}

ПРИМЕЧАНИЕ: Связки имеют методы «get» и «put» для всех примитивных типов, Parcelables и Serializables. Я просто использовал Strings для демонстрационных целей.

16
задан efotinis 15 December 2008 в 13:06
поделиться

7 ответов

Для чтения текстового содержания от текстового поля другого приложения необходимо будет получить тот дескриптор окна управления текстовым полем так или иначе. В зависимости от того, как Ваше приложение UI разработан (если это имеет UI, который является) существует несколько различных способов, которыми можно использовать для получения этого дескриптора. Вы могли бы использовать "FindWindow" / "FindWindowEx", чтобы определить местоположение Вашего управления или использовать "WindowFromPoint", если это имеет смысл. Так или иначе, после того как у Вас есть дескриптор к текстовому управлению, которое можно отправить сообщению "WM_GETTEXT" в него для получения его содержания (предполагающий, что это - стандартное управление текстовым полем). Вот придуманный образец (без проверок на ошибки):

HWND hwnd = (HWND)0x00310E3A;
char szBuf[2048];
LONG lResult;

lResult = SendMessage( hwnd, WM_GETTEXT, sizeof( szBuf ) / sizeof( szBuf[0] ), (LPARAM)szBuf );
printf( "Copied %d characters.  Contents: %s\n", lResult, szBuf );

я использовал "Шпиона ++" для получения дескриптора к окну текстового поля, которое, оказалось, лежало вокруг.

Что касается защиты Ваших собственных текстовых полей от того, чтобы быть осмотренным как это, Вы могли всегда разделять свое текстовое поле на подклассы (см. "SetWindowLong" с "GWL_WNDPROC" для "nIndex" параметра), и сделайте некоторую специальную обработку сообщения "WM_GETTEXT", чтобы гарантировать, что только запрашивает от того же процесса, обслуживаются.

14
ответ дан 30 November 2019 в 22:17
поделиться
HWND FindWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName
);

http://msdn.microsoft.com/en-us/library/ms633499.aspx

-1
ответ дан 30 November 2019 в 22:17
поделиться

Хорошо, я несколько понял это.

начальная точка теперь знает дескриптор окна точно, мы только знаем частичный заголовок окна, таким образом, первое, что нужно сделать является находкой что главное окно:

...
EnumWindows((WNDENUMPROC)on_enumwindow_cb, 0);
...

, который перечисляет через все окна на рабочем столе. Это делает обратный вызов с каждым из этих дескрипторов окна:

BOOL CALLBACK on_enumwindow_cb(HWND hwndWindow, LPARAM lParam) {
    TCHAR wsTitle[2048];
    LRESULT result;
result = SendMessage(hwndWindow, WM_GETTEXT, (WPARAM) 2048, (LPARAM) wsTitle);
    ...

и при помощи wsTitle и небольшого regex волшебства, мы можем найти окно, которое мы хотим.

При помощи перед упомянутым Шпионом ++ я мог выяснить текстовое полевое имя класса редактирования и использовать его для нахождения требуемого поля в hwndWindow:

hwndEdit = FindWindowEx(hwndWindow, NULL, L"RichEdit20W", NULL);

и затем мы можем прочитать текст из того поля:

result = SendMessage(hwndEdit, WM_GETTEXT, (WPARAM) 4096, (LPARAM) wsText);

я надеюсь, что это помогает любому борющемуся с той же проблемой!

6
ответ дан 30 November 2019 в 22:17
поделиться

О том, как экранировать приложение для предотвращения его, Вы могли сделать много вещей. Один путь состоял бы в том, чтобы иметь собственный контроль для обработки ввода текста, которые растут, текст от позволяет, говорят, что несколько маркировок поместили, где текст был бы, или это рисует текст графически.

0
ответ дан 30 November 2019 в 22:17
поделиться

Да это возможно во многих отношениях (один путь состоит в том, чтобы использовать WINAPI GetWindow и GetWindowText).

Первый, получите дескриптор к текстовому полю, Вы хотите получить текст от (использование FindWindow, EnumChildWindows и других API), затем:

Старый VB6-codeexample, объявление API:

Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long  
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long  

Код для извлечения текста:

Dim MyStr As String
MyStr = String(GetWindowTextLength(TextBoxHandle) + 1, Chr$(0))
GetWindowText TextBoxHandle, MyStr, Len(MyStr)
MsgBox MyStr
0
ответ дан 30 November 2019 в 22:17
поделиться

Можно также получить текст от управления richedit с сообщением EM_GETTEXTRANGE, но это работает только в том же процессе, в котором было создано управление.

0
ответ дан 30 November 2019 в 22:17
поделиться

Взгляд Автогорячая клавиша . Если Вы нуждаетесь в API для своего приложения, смотрите на их источники. Для предотвращения его используйте пользовательский виджет вместо WinForms, MFC или Win32 API. Это не является надежным, но помогает.

1
ответ дан 30 November 2019 в 22:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: