|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Переключение треков
Есть клавиатуры на которых имеются клавиши мультимедиа, у меня не такая). Можно настроить переключение песен в проигрывателе(windows media player) на определённую клавишу? Чтоб как на мультимедийной клаве вперед и назад.
|
#2
|
|||
|
|||
Ну что-то нашёл
Код:
function TForm1.GetWMPHandle: hwnd; begin result := FindWindow('WMPlayerApp', nil); result := FindWindowEx(result, 0, 'WMPAppHost', 'WMPAppHost'); if result = 0 then result := Findwindow(nil,'Windows Media Player'); end; //На бутон или имя клавиши var wnd:hwnd; begin wnd := GetWMPHandle; if wnd <> 0 then SendMessage(wnd,WM_APPCOMMAND,0,$B0000); end; Цитата:
Но это работает только если прога имеет фокус, а как теперь сделать чтоб это работало независимо от активного на данный момент приложения? Т.е. например на VK_NUMPAD0 переключался трек? Последний раз редактировалось Qwed86, 07.11.2008 в 13:59. |
#3
|
|||
|
|||
регистрировать их как глобальные горячие клавиши.
Delphi - это лишь инструмент, а что ты сможешь создать при помощи этого инструмента, зависит исключительно от тебя. |
#4
|
|||
|
|||
Ну теперь всё работает
Код:
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) function GetWMPHandle : hwnd; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormActivate(Sender: TObject); private procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY; { Private declarations } public { Public declarations } end; var Form1: TForm1; var wnd:hwnd; implementation {$R *.dfm} function TForm1.GetWMPHandle: hwnd; begin result := FindWindow('WMPlayerApp', nil); result := FindWindowEx(result, 0, 'WMPAppHost', 'WMPAppHost'); if result = 0 then result := Findwindow(nil,'Windows Media Player'); end; procedure TForm1.WMHotKey(var Msg: TWMHotKey); begin wnd := GetWMPHandle; if msg.HotKey=1 then if wnd <> 0 then SendMessage(wnd,WM_APPCOMMAND,0,$C0000); if msg.HotKey=2 then if wnd <> 0 then SendMessage(wnd,WM_APPCOMMAND,0,$B0000); if msg.HotKey=3 then if wnd <> 0 then SendMessage(wnd,WM_APPCOMMAND,0,$E0000); end; procedure TForm1.FormCreate(Sender: TObject); begin RegisterHotKey(Form1.Handle, 1, 0, vk_f1); RegisterHotKey(Form1.Handle, 2, 0, vk_f2); RegisterHotKey(Form1.Handle, 3, 0, vk_f3); end; procedure TForm1.FormDestroy(Sender: TObject); begin UnRegisterHotKey(Form1.Handle, vk_f1); UnRegisterHotKey(Form1.Handle, vk_f2); UnRegisterHotKey(Form1.Handle, vk_f3); end; procedure TForm1.FormActivate(Sender: TObject); begin ShowWindow(Handle,SW_MINIMIZE); ShowWindow(Application.Handle,SW_MINIMIZE); end; end. Если просто переделывать ругается на procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY; в часности на слово message типа unknown directive? Последний раз редактировалось Qwed86, 07.11.2008 в 17:51. |
#5
|
|||
|
|||
Сервис писать, или еще проще просто спрятать форму.
Delphi - это лишь инструмент, а что ты сможешь создать при помощи этого инструмента, зависит исключительно от тебя. |
#6
|
|||
|
|||
Alexo Ну спрятать это понятно, я чтоб весила меньше хочу, щас я допру уже почти родил).
|
#7
|
|||
|
|||
Вот оно), теперь всё нормал, exeшник 49,5кб весит
Код:
program Project1; uses windows, messages, sysutils; {$R *.res} var wnd, Instance, Handle : hwnd; WindowClass : TWndClass; msg : TMsg; Procedure Close; begin UnRegisterHotKey(Handle, vk_f1); UnRegisterHotKey(Handle, vk_f2); UnRegisterHotKey(Handle, vk_f3); UnRegisterHotKey(Handle, vk_f4); Halt(255); end; function GetWMPHandle: hwnd; begin result := FindWindow('WMPlayerApp', nil); result := FindWindowEx(result, 0, 'WMPAppHost', 'WMPAppHost'); if result = 0 then result := Findwindow(nil,'Windows Media Player'); end; function WindowProc (Hwn,msg,wpr,Ipr: longint): longint; stdcall; begin wnd := GetWMPHandle; if Msg=WM_KEYDOWN then if Wpr=WM_Destroy then Close; if msg=WM_HOTKEY then case Wpr of 1: if wnd <> 0 then SendMessage(wnd,WM_APPCOMMAND,0,$C0000); 2: if wnd <> 0 then SendMessage(wnd,WM_APPCOMMAND,0,$B0000); 3: if wnd <> 0 then SendMessage(wnd,WM_APPCOMMAND,0,$E0000); 4: Close; end; result:=defwindowproc(hwn,msg,wpr,Ipr); end; begin instance :=GetModuleHandle(nil); WindowClass.style:=CS_HRedraw or CS_VRedraw; WindowClass.HbrBackground:= color_btnface; WindowClass.Hcursor:=LoadCursor(0,IDC_ARROW); WindowClass.Lpfnwndproc:=@windowproc; WindowClass.LpszClassName:='DX'; WindowClass.Hinstance:=Instance; RegisterClass (WindowClass); Handle:=CreateWindowEx (0,'DX', '' , WS_POPUP, 1,1, 200, 200,0,0,Instance, nil); RegisterHotKey(Handle, 1, 0, vk_f1); RegisterHotKey(Handle, 2, 0, vk_f2); RegisterHotKey(Handle, 3, 0, vk_f3); RegisterHotKey(Handle, 4, 0, vk_f4); //ShowWindow(Handle,SW_SHOW); //UpdateWindow(Handle); while (GetMessage(msg, 0, 0, 0)) do begin translatemessage (msg) ; dispatchmessage (msg); end; end. |
#8
|
|||
|
|||
Ну не совсем хорошо, переключается, но в играх нет(. Если фокус на окне с игрой то нифига не посылается. В чём причина и как исправить кто знает? Игры чё блокируют всё сразу? Не все конечно например в pes2009 не работет.
Последний раз редактировалось Qwed86, 09.11.2008 в 19:45. |