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

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

Как передать нажатие на клавишу в другую программу? [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"а есть свои сообщения и свои библиотеки.


Наверх

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