Форум: "Начинающим";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];
Вниз
Отправка символа другому окну Найти похожие ветки
← →
sashap (2007-08-31 18:38) [0]Добрый день!
У меня не получается отправить символ другому окну.
Я пробовал:var
h:HWND;
...
h:=FindWindow(nil,"Program name");
PostMessage(h, WM_KEYDOWN, Ord("A"), 0);
PostMessage(h, WM_KEYUP, Ord("A"), 0);
Но это не работает. Как можно иначе передать символ?
← →
Reindeer Moss Eater © (2007-08-31 18:39) [1]WM_CHAR
← →
sashap (2007-08-31 20:08) [2]Спасибо за ответ, Reindeer Moss Eater!
Если я правильно Вас понял, то код будет выглядеть так:var
h:HWND;
...
h:=FindWindow(nil,"Program name");
PostMessage(h, WM_CHAR, Ord("A"), 0);
Но это тоже не работает... Никакого действия.
← →
palva © (2007-08-31 20:32) [3]> Но это тоже не работает... Никакого действия.
А у меня работает
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;
← →
Bora.ru (2007-08-31 20:50) [4]
> sashap (31.08.07 20:08) [2]
... Никакого действия.
а какое должно быть действие?
← →
sashap (2007-08-31 21:06) [5]palva, можно узнать, что за дополнительный код?
Bora.ru: нужно, чтобы в окне хэндла "h", на том месте, где находится блинк курсора появился отосланный символ. Т.е. если открыт Notepad, то после выполнения кодаvar
h:HWND;
...
h:=FindWindow(nil,"Untitled - Notepad");
PostMessage(h, WM_CHAR, Ord("A"), 0);
в нем должен появиться символ "A".
← →
palva © (2007-08-31 21:54) [6]> palva, можно узнать, что за дополнительный код?
Дополнительный код это обработчик клавиши в главном окне Delphi-приложения. А почему не отвечает блокнот, я не знаю.
← →
Reindeer Moss Eater © (2007-08-31 22:59) [7]Ты свое сообщение посылаешь не тому окну вот ничего и не происходит.
Запусти WinSight и увидишь, что "Безымянный - Блокнот" - это окно верхнего уровня и у него два чайлда, одно из которых класса Edit.
Вот этому дочернему окну и надо засылать WM_CHAR
← →
palva © (2007-08-31 23:00) [8]Наверно блокноту не нравится, что не задан последний параметр. Там должен быть скан-код клавиши и число повторений. Если вместо блокнота взять другое приложение, то передача клавиши работает.
h:=FindWindow(nil,"C:\WINDOWS\system32\cmd.exe");
PostMessage(h, WM_CHAR, Ord("A"), 0);
← →
Reindeer Moss Eater © (2007-08-31 23:02) [9]Да все ему нравится.
Просто окно не то!
← →
Reindeer Moss Eater © (2007-08-31 23:08) [10]http://img231.imageshack.us/img231/8250/winsightgw3.jpg
← →
sashap (2007-09-01 01:48) [11]Спасибо, 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++. Думаю, это тоже самое.
← →
Anatoly Podgoretsky © (2007-09-01 09:45) [12]> sashap (01.09.2007 01:48:11) [11]
Только кто будет проверять результат работы функции findwindowex?
← →
sashap (2007-09-01 13:43) [13]ОК. Вот:
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!");
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.052 c