Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.06.06;
Скачать: CL | DM;

Вниз

Как передать нажатие на клавишу в другую программу?   Найти похожие ветки 

 
Vikky ©   (2002-04-01 12:30) [0]

Господа! Есть такая проблема! Необходимо, передавать коды нажатых клавиш в другую программу.
Для чего? А вот например, играете вы в свою любимую игру (Квэйк на полный экран), а в фоне играет WinAmp.
И вдруг вам захотелось переключить надоевшую песню! Нажимаем на кнопку "Next" и продолжаем любимое дело! :-)
Естейственно, для переключения я могу (и должен) использовать дополнительные клавиши (на мультимедиа-клавиатуре).
Пишу обработчик хуков. В своей программе, работающей в фоне, могу получить нажимаемые клавиши!
Но как их передать тому же WinAmp?
SendMessage почему то не работает... :-(
Help me?!


 
Song ©   (2002-04-01 13:07) [1]

Во-первых, такая тема недавно обсуждалась. Не надо даже перелистывать страницу и именно в этой конференции.
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1017124447&n=5
Во-вторых для WinAmp"а есть свои сообщения и свои библиотеки.


 
watcher   (2002-04-01 13:09) [2]

А почему SendMessage Не работает ?
А вообще не лучше ли писать через RegisterHotKey()


 
Song ©   (2002-04-01 13:13) [3]

2watcher (01.04.02 13:09)
SendMessage не работает обычно у людей, первый раз столкнувшись с подобной задачей, потому что, вероятно, сообщение WM_KEY* и/или WM_CHAR передаётся не на тот hwnd. Сам когда-то сталкивался.


 
Vikky ©   (2002-04-01 15:23) [4]

2 Song
Спасибо за советы!
Смотрел http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1017124447&n=5
Но так и не понял, чем дело то кончилось?!
Так "рецепт" и не придумали...
Очень не хочется "ставить" фокус на "нижнюю" прогу! Особенно из полноэкранного режима....
А SendKey32.pas тоже не пошло! С Delhi"йными прогами работает, а
с тем же MS Word нет!
Ещё конкретизирую: нужно обрабатывать дополнительные клавиши
Message.WParam = 255
Т.е. обычного виртуального скан кода они не имеют...


 
Dimaond Cat ©   (2002-04-01 23:07) [5]

ну в принципе можно легко проверить работает sendmessage или нет (в твоем варианте) достаточно сделать это передав широковешательным образом т.е. вместо конкретного хендла подставить hwnd_broadcast, хотя он не может не работать и видимо ты действительно ошибся в дескрипторах


 
Vikky ©   (2002-04-02 17:00) [6]

Интересно...
Вот такой код
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

Ничего не происходит!!!!!!!!!
Господа, почему?!
Видимо, фокус должен быть в окне...
А без фокуса никак нельзя?!


 
Fellomena   (2002-04-02 17:10) [7]

sorry, но что есть ProcHWND ?
Ведь h:= FindWindow("Notepad", nil);


 
Виктор Щербаков ©   (2002-04-02 17:33) [8]

Для того чтобы определить куда и какие сообщения нужно отправить, существует простое решение: произвести необходимые манипуляции в WinSight и отправлять найденную с его помощью (правильную) цепочку сообщений программно.


 
Vikky ©   (2002-04-02 18:36) [9]

Простите великодушно.... :-)
Конечно, я ошибся!
procedure TForm1.Button1Click(Sender: TObject);
var
h: HWND;
begin
h := FindWindow("Notepad", nil); // ищем окно Блокнота
PostMessage(h, WM_KEYDOWN, VK_F5, 0);//посылаем нажатие F5
end;

ProcHWND = h

С дескриптором окна всё в порядке!
Все сообщения доходят!
Но обычные символы не отображаются!

Меня как раз и интересует КАК "отправлять найденную ... (правильную) цепочку сообщений программно"!!!


 
cok ©   (2002-04-02 19:16) [10]

>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"); :)


 
Набережных С.   (2002-04-02 20:16) [11]


> 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;


 
Song ©   (2002-04-02 20:53) [12]

2Набережных С. (02.04.02 20:16)
h:=FindWindow(nil,"Notepad"); - название окна - второй параметр
PostMessage(h, WM_KEYDOWN, Ord("A"), 1);

Последний параметр - кол-во повторений. 0 - не передатся ничего. Я пробовал.


 
Набережных С.   (2002-04-02 21:07) [13]


> Song © (02.04.02 20:53)

Просто попробуй мой код.(я тоже пробовал :)))



Страницы: 1 вся ветка

Текущий архив: 2002.06.06;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.009 c
1-17914
stupid
2002-05-27 15:23
2002.06.06
Нужно узнать размер файла после сжатия.


1-18059
LP
2002-05-25 14:25
2002.06.06
глобальная переменная


1-17899
Andre V.
2002-05-24 12:46
2002.06.06
Опять про сохранение состояния программы


1-17953
Alexandr__
2002-05-28 11:39
2002.06.06
как извлечь кубический корень


4-18193
ввв
2002-04-04 18:31
2002.06.06
Мастера, а как перезаписать файл со временем , которое я захочу е