![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как передать нажатие на клавишу в другую программу? [D4, D5, D6, Win95/98, Win2k]
Vikky © (2002-04-01 12:30:00)Господа! Есть такая проблема! Необходимо, передавать коды нажатых клавиш в другую программу.
Для чего? А вот например, играете вы в свою любимую игру (Квэйк на полный экран), а в фоне играет WinAmp.
И вдруг вам захотелось переключить надоевшую песню! Нажимаем на кнопку "Next" и продолжаем любимое дело! :-)
Естейственно, для переключения я могу (и должен) использовать дополнительные клавиши (на мультимедиа-клавиатуре).
Пишу обработчик хуков. В своей программе, работающей в фоне, могу получить нажимаемые клавиши!
Но как их передать тому же WinAmp?
SendMessage почему то не работает... :-(
Help me?!
Набережных С. (2002-04-02 21:07:00) [1]
> Song © (02.04.02 20:53)
Просто попробуй мой код.(я тоже пробовал :)))
Song (2002-04-02 20:53:00) [2]2Набережных С. (02.04.02 20:16)
h:=FindWindow(nil,"Notepad"); - название окна - второй параметр
PostMessage(h, WM_KEYDOWN, Ord("A"), 1);
Последний параметр - кол-во повторений. 0 - не передатся ничего. Я пробовал.
Набережных С. (2002-04-02 20:16:00) [3]
> Vikky © (02.04.02 18:36)
А ты попробуй так:
h:=FindWindow("Notepad",nil);
if h<>0 then
begin
h:=FindWindowEx(h,0,"Edit",nil);
if h<>0 then
PostMessage(h, WM_KEYDOWN, Ord("A"), 0);
end;
cok (2002-04-02 19:16:00) [4]>Vikky © (02.04.02 17:00)
>Интересно...
>Вот такой код
procedure TForm1.Button1Click(Sender: TObject);
var
h: HWND;
begin
h := FindWindow("Notepad", nil); // ищем окно Блокнота
PostMessage(ProcHWND, WM_KEYDOWN, VK_F5, 0);//посылаем нажатие F5
end;
>Всё супер! Но...
>Не могу послать ничего другого?!
Может потому, что надо писать
h:=FindWindow(nil,"NotePad"); :)
Vikky (2002-04-02 18:36:00) [5]Простите великодушно.... :-)
Конечно, я ошибся!
procedure TForm1.Button1Click(Sender: TObject);
var
h: HWND;
begin
h := FindWindow("Notepad", nil); // ищем окно Блокнота
PostMessage(h, WM_KEYDOWN, VK_F5, 0);//посылаем нажатие F5
end;
ProcHWND = h
С дескриптором окна всё в порядке!
Все сообщения доходят!
Но обычные символы не отображаются!
Меня как раз и интересует КАК "отправлять найденную ... (правильную) цепочку сообщений программно"!!!
Виктор Щербаков (2002-04-02 17:33:00) [6]Для того чтобы определить куда и какие сообщения нужно отправить, существует простое решение: произвести необходимые манипуляции в WinSight и отправлять найденную с его помощью (правильную) цепочку сообщений программно.
Fellomena (2002-04-02 17:10:00) [7]sorry, но что есть ProcHWND ?
Ведь h:= FindWindow("Notepad", nil);
Vikky (2002-04-02 17:00:00) [8]Интересно...
Вот такой код
procedure TForm1.Button1Click(Sender: TObject);
var
h: HWND;
begin
h := FindWindow("Notepad", nil); // ищем окно Блокнота
PostMessage(ProcHWND, WM_KEYDOWN, VK_F5, 0);//посылаем нажатие F5
end;
Всё супер! Но...
Не могу послать ничего другого?!
Например, в выше представленном, при замене
PostMessage(ProcHWND, WM_KEYDOWN, Ord("A"), 0);//посылаем нажатие A
Ничего не происходит!!!!!!!!!
Господа, почему?!
Видимо, фокус должен быть в окне...
А без фокуса никак нельзя?!
Dimaond Cat (2002-04-01 23:07:00) [9]ну в принципе можно легко проверить работает sendmessage или нет (в твоем варианте) достаточно сделать это передав широковешательным образом т.е. вместо конкретного хендла подставить hwnd_broadcast, хотя он не может не работать и видимо ты действительно ошибся в дескрипторах
Vikky (2002-04-01 15:23:00) [10]2 Song
Спасибо за советы!
Смотрел http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1017124447&n=5
Но так и не понял, чем дело то кончилось?!
Так "рецепт" и не придумали...
Очень не хочется "ставить" фокус на "нижнюю" прогу! Особенно из полноэкранного режима....
А SendKey32.pas тоже не пошло! С Delhi"йными прогами работает, а
с тем же MS Word нет!
Ещё конкретизирую: нужно обрабатывать дополнительные клавиши
Message.WParam = 255
Т.е. обычного виртуального скан кода они не имеют...
Song (2002-04-01 13:13:00) [11]2watcher (01.04.02 13:09)
SendMessage не работает обычно у людей, первый раз столкнувшись с подобной задачей, потому что, вероятно, сообщение WM_KEY* и/или WM_CHAR передаётся не на тот hwnd. Сам когда-то сталкивался.
watcher (2002-04-01 13:09:00) [12]А почему SendMessage Не работает ?
А вообще не лучше ли писать через RegisterHotKey()
Song (2002-04-01 13:07:00) [13]Во-первых, такая тема недавно обсуждалась. Не надо даже перелистывать страницу и именно в этойконференции.
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1017124447&n=5
Во-вторых для WinAmp"а есть свои сообщения и свои библиотеки.