вывести текст в чужое приложение
От: _Anton Россия  
Дата: 11.05.05 10:50
Оценка:
Необходимо вывести текст в приложение с заведомо неизвестным дискриптором окна.
делаю так:
hw := GetWindow(Application.Handle, GW_HWNDNEXT);
EnumChildWindows(hw, @ChildTree, 0);
в @ChildTree ищу 'Edit', получаю его Handle;
SetActiveWindow(Handle);
окно получает фокус клавиатуры, но после
SendMessageW(Handle, WM_KEYDOWN, msg.CharCode, msg.KeyData);
в окне ничего не пишется?
Re: вывести текст в чужое приложение
От: Stanky  
Дата: 11.05.05 10:58
Оценка:
> в окне ничего не пишется?
>
Юзай WM_CHAR!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re: вывести текст в чужое приложение
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 11.05.05 11:04
Оценка: 22 (1)
Здравствуйте, _Anton, Вы писали:

_A>Необходимо вывести текст в приложение с заведомо неизвестным дискриптором окна.

_A>делаю так:
_A>hw := GetWindow(Application.Handle, GW_HWNDNEXT);
_A>EnumChildWindows(hw, @ChildTree, 0);
_A>в @ChildTree ищу 'Edit', получаю его Handle;
_A>SetActiveWindow(Handle);
_A>окно получает фокус клавиатуры, но после
_A>SendMessageW(Handle, WM_KEYDOWN, msg.CharCode, msg.KeyData);
_A>в окне ничего не пишется?

Вот, типа, "концепция"
HWND hForeground = ::GetForegroundWindow();
DWORD dwForegroungThreadID = ::GetWindowThreadProcessId(hForeground, NULL);
DWORD dwCurrentTreadID = ::GetCurrentThreadId();

HWND hFocused = ::GetFocus();

::AttachThreadInput(dwCurrentTreadID, dwForegroungThreadID, TRUE);
hFocused = ::GetFocus();
::AttachThreadInput(dwCurrentTreadID, dwForegroungThreadID, FALSE);
::SendMessage(hFocused, WM_GETTEXT, BUFFER_SIZE, (LPARAM)achBuffer);
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
HgLab: Mercurial Server and Repository Management for Windows
Re[2]: вывести текст в чужое приложение
От: _Anton Россия  
Дата: 11.05.05 11:16
Оценка:
SendMessageW(Handle, WM_CHAR, msg.CharCode, msg.KeyData); аналогично не работает
Re[2]: вывести текст в чужое приложение
От: _Anton Россия  
Дата: 11.05.05 12:53
Оценка:
hw:= GetWindow(Application.Handle, GW_HWNDNEXT);

dwThreadID := GetCurrentThreadId;
dwCurThreadID := GetWindowThreadProcessId(hw, nil);

AttachThreadInput(dwThreadID, dwCurThreadID, TRUE);

EnumChildWindows(hw, @ChildTree, 0);

в @ChildTree ищу 'Edit', получаю его Handle;
SendMessageW(Handle, WM_KEYDOWN, msg.CharCode, msg.KeyData);

к сожалению не работает, у меня XP, возможно что-то поменялось, будем продолжать поиск
Re[3]: вывести текст в чужое приложение
От: Stanky  
Дата: 11.05.05 13:02
Оценка:
> SendMessageW(Handle, WM_CHAR, msg.CharCode, msg.KeyData); аналогично не
> работает
>
Вот уж не знаю как у тебя не работает, но: открываю блокнот, открываю Spy++, нахожу HWND Edit'а и делаю следующее:
HWND Edit = (HWND) 0x00AC01B8;
SendMessage(Edit, WM_CHAR, L'A', 0);

Spy показывает, что окну пришло сообщение, переключаюсь на блокнот и вижу там букву "A"!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[4]: вывести текст в чужое приложение
От: _Anton Россия  
Дата: 11.05.05 13:40
Оценка:
если дискриптор извесен, то все OK,
но вопрос был такой:
"Необходимо вывести текст в приложение с заведомо неизвестным дискриптором окна"
Re[5]: вывести текст в чужое приложение
От: Stanky  
Дата: 11.05.05 15:09
Оценка:
> "Необходимо вывести текст в приложение с заведомо неизвестным
> дискриптором окна"
>
Ну дык а для чего же ты тогда делал:
EnumChildWindows(hw, @ChildTree, 0);
в @ChildTree ищу 'Edit', получаю его Handle?
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[6]: вывести текст в чужое приложение
От: _Anton Россия  
Дата: 11.05.05 15:36
Оценка:
Sorry, неверно изяснился
проблема сводится к получению хендла, сейчас приходит 0
Re[7]: вывести текст в чужое приложение
От: Stanky  
Дата: 11.05.05 16:17
Оценка:
> проблема сводится к получению хендла, сейчас приходит 0
>
Ну MSDN и Spy++ в помощь!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[8]: вывести текст в чужое приложение
От: _Anton Россия  
Дата: 12.05.05 07:40
Оценка:
S>Ну MSDN и Spy++ в помощь!!!

дело то в том, что spy++ тут вообще не помошник(чужие приложения имеют разные дискрипторы), MSDN не дает общей концепции, ну да ладно;
спасибо всем
Re[9]: вывести текст в чужое приложение
От: Stanky  
Дата: 12.05.05 11:47
Оценка:
> дело то в том, что spy++ тут вообще не помошник
>
Он нужен лишь для того, чтобы понять в каких родственных отношениях находятся окна нужного тебе приложения!!!

> MSDN не дает общей концепции

>
И нафига он только нужен?
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re: вывести текст в чужое приложение
От: acrsoft  
Дата: 12.05.05 12:08
Оценка:
а что заведомо известно?
Re[2]: вывести текст в чужое приложение
От: _Anton Россия  
Дата: 14.05.05 12:05
Оценка:
заведомо известно:

ничего, кроме того, что фокус приходит в наше приложение из приложения, куда мы хотим посылать сообщения с буквами.
пример: работа экранной клавиатуры Windows: щелкаем в любом окне и печатаем
Re[10]: вывести текст в чужое приложение
От: _Anton Россия  
Дата: 14.05.05 12:08
Оценка:
S>Он нужен лишь для того, чтобы понять в каких родственных отношениях находятся окна нужного тебе приложения!!!

ну я и говорю, что spy++ бесполезен — по ТЗ они могут находится в любых связях (пример экранная клавиатура Win — щелкнул в окне и печатай)
Re[3]: вывести текст в чужое приложение
От: _Anton Россия  
Дата: 14.05.05 12:12
Оценка:
не работает, потому что
hw:= GetWindow(Application.Handle, GW_HWNDNEXT);
возвращает не дискриптор предыдущего приложения(которое находилось в фокусе до этого)
вот и вырисовалась проблема: получить hendle предыдущего фокусированного приложения
Re[3]: вывести текст в чужое приложение
От: Stanky  
Дата: 14.05.05 16:09
Оценка:
> пример: работа экранной клавиатуры Windows: щелкаем в любом окне и
> печатаем
>
Вот с этого-то и надо было начинать!!!
Не майся фигнёй с посылкой сообщений окнам — тебе нужны сообщения клавиатуры (keybd_event)!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.