Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отправка символа другому окну


sashap ©   (2007-08-31 18:38:00) 

Добрый день!
У меня не получается отправить символ другому окну.
Я пробовал:
var
 h:HWND;
...
h:=FindWindow(nil,'Program name');
PostMessage(h, WM_KEYDOWN, Ord('A'), 0);
PostMessage(h, WM_KEYUP, Ord('A'), 0);


Но это не работает. Как можно иначе передать символ?


sashap   (2007-09-01 13:43:00) [1]

ОК. Вот:

var
h:HWND;
begin
...
h:= findwindowex( findwindow(nil,'Untitled - Notepad'), 0, 'Edit', nil);
if h<>0 then PostMessage(h, WM_CHAR, Ord('A'), 0)
else showmessage('Handle not found!');


Anatoly Podgoretsky   (2007-09-01 09:45:00) [2]

> sashap  (01.09.2007 01:48:11)  [11]

Только кто будет проверять результат работы функции findwindowex?


sashap   (2007-09-01 01:48:00) [3]

Спасибо, palva, Reindeer Moss Eater!
Всё работает:

var
 h:HWND;
begin
 ...
 h:= findwindowex( findwindow(nil,'Untitled - Notepad'), 0, 'Edit', nil);
 PostMessage(h, WM_CHAR, Ord('A'), 0);


З.Ы.: WinSight я у себя не нашел, зато нашел Microsoft Spy++. Думаю, это тоже самое.


Reindeer Moss Eater   (2007-08-31 23:08:00) [4]

http://img231.imageshack.us/img231/8250/winsightgw3.jpg


Reindeer Moss Eater   (2007-08-31 23:02:00) [5]

Да все ему нравится.
Просто окно не то!


palva   (2007-08-31 23:00:00) [6]

Наверно блокноту не нравится, что не задан последний параметр. Там должен быть скан-код клавиши и число повторений. Если вместо блокнота взять другое приложение, то передача клавиши работает.

 h:=FindWindow(nil,'C:\WINDOWS\system32\cmd.exe');
 PostMessage(h, WM_CHAR, Ord('A'), 0);


Reindeer Moss Eater   (2007-08-31 22:59:00) [7]

Ты свое сообщение посылаешь не тому окну вот ничего и не происходит.
Запусти WinSight и увидишь, что "Безымянный - Блокнот" - это окно верхнего уровня и у него два чайлда, одно из которых класса Edit.
Вот этому дочернему окну и надо засылать WM_CHAR


palva   (2007-08-31 21:54:00) [8]

> palva, можно узнать, что за дополнительный код?
Дополнительный код это обработчик клавиши в главном окне Delphi-приложения. А почему не отвечает блокнот, я не знаю.


sashap   (2007-08-31 21:06:00) [9]

palva, можно узнать, что за дополнительный код?
Bora.ru: нужно, чтобы в окне хэндла "h", на том месте, где находится блинк курсора появился отосланный символ. Т.е. если открыт Notepad, то после выполнения кода

var
h:HWND;
...
h:=FindWindow(nil,'Untitled - Notepad');
PostMessage(h, WM_CHAR, Ord('A'), 0);


в нем должен появиться символ 'A'.


Bora.ru   (2007-08-31 20:50:00) [10]


> sashap   (31.08.07 20:08) [2]
... Никакого действия.

а какое должно быть действие?


palva   (2007-08-31 20:32:00) [11]

> Но это тоже не работает... Никакого действия.

А у меня работает

procedure TForm3.Button1Click(Sender: TObject);
begin
 PostMessage(Edit1.Handle, WM_CHAR, Ord('A'), 0);
end;

Так что проблема в том, что не находится окно (нужно проверять h<>0) либо окно не способно ответить на клавиатурный ввод. Например, передача сообщения главному окну без дополнительного кода работать не будет.

procedure TForm3.Button1Click(Sender: TObject);
begin
 PostMessage(Handle, WM_CHAR, Ord('A'), 0);
end;


sashap   (2007-08-31 20:08:00) [12]

Спасибо за ответ, Reindeer Moss Eater!
Если я правильно Вас понял, то код будет выглядеть так:

var
h:HWND;
...
h:=FindWindow(nil,'Program name');
PostMessage(h, WM_CHAR, Ord('A'), 0);


Но это тоже не работает... Никакого действия.


Reindeer Moss Eater   (2007-08-31 18:39:00) [13]

WM_CHAR


Наверх

Титульная страница Поиск, карта сайта Написать письмо