Текущий архив: 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