Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Мультимедиа
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.11.2008, 14:16
Qwed86 Qwed86 вне форума
Новичок
 
Регистрация: 12.09.2008
Сообщения: 66
Репутация: 10
По умолчанию Переключение треков

Есть клавиатуры на которых имеются клавиши мультимедиа, у меня не такая). Можно настроить переключение песен в проигрывателе(windows media player) на определённую клавишу? Чтоб как на мультимедийной клаве вперед и назад.
Ответить с цитированием
  #2  
Старый 07.11.2008, 13:57
Qwed86 Qwed86 вне форума
Новичок
 
Регистрация: 12.09.2008
Сообщения: 66
Репутация: 10
По умолчанию

Ну что-то нашёл
Код:
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;
Цитата:
{Windows Media Player API}
WMP_VOLUME_MUTE = $80000;
WMP_VOLUME_DOWN = $90000;
WMP_VOLUME_UP = $a0000;
WMP_MEDIA_NEXTTRACK = $B0000;
WMP_MEDIA_PREVIOUSTRACK = $C0000;
WMP_MEDIA_STOP = $D0000;
WMP_MEDIA_PLAY_PAUSE = $E0000;

Но это работает только если прога имеет фокус, а как теперь сделать чтоб это работало независимо от активного на данный момент приложения?
Т.е. например на VK_NUMPAD0 переключался трек?

Последний раз редактировалось Qwed86, 07.11.2008 в 13:59.
Ответить с цитированием
  #3  
Старый 07.11.2008, 15:06
Alexo Alexo вне форума
Начинающий
 
Регистрация: 24.01.2007
Сообщения: 191
Репутация: 15
По умолчанию

регистрировать их как глобальные горячие клавиши.
__________________
Delphi - это лишь инструмент, а что ты сможешь создать при помощи этого инструмента, зависит исключительно от тебя.
Ответить с цитированием
  #4  
Старый 07.11.2008, 17:37
Qwed86 Qwed86 вне форума
Новичок
 
Регистрация: 12.09.2008
Сообщения: 66
Репутация: 10
По умолчанию

Ну теперь всё работает
Код:
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.
А можно это всё на winapi полностью без формы, нах она не нужна просто? У меня не выходит что-то.
Если просто переделывать ругается на procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY; в часности на слово message типа unknown directive?

Последний раз редактировалось Qwed86, 07.11.2008 в 17:51.
Ответить с цитированием
  #5  
Старый 07.11.2008, 17:53
Alexo Alexo вне форума
Начинающий
 
Регистрация: 24.01.2007
Сообщения: 191
Репутация: 15
По умолчанию

Сервис писать, или еще проще просто спрятать форму.
__________________
Delphi - это лишь инструмент, а что ты сможешь создать при помощи этого инструмента, зависит исключительно от тебя.
Ответить с цитированием
  #6  
Старый 07.11.2008, 18:09
Qwed86 Qwed86 вне форума
Новичок
 
Регистрация: 12.09.2008
Сообщения: 66
Репутация: 10
По умолчанию

Alexo Ну спрятать это понятно, я чтоб весила меньше хочу, щас я допру уже почти родил).
Ответить с цитированием
  #7  
Старый 07.11.2008, 18:47
Qwed86 Qwed86 вне форума
Новичок
 
Регистрация: 12.09.2008
Сообщения: 66
Репутация: 10
По умолчанию

Вот оно), теперь всё нормал, 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  
Старый 09.11.2008, 19:41
Qwed86 Qwed86 вне форума
Новичок
 
Регистрация: 12.09.2008
Сообщения: 66
Репутация: 10
По умолчанию

Ну не совсем хорошо, переключается, но в играх нет(. Если фокус на окне с игрой то нифига не посылается. В чём причина и как исправить кто знает? Игры чё блокируют всё сразу? Не все конечно например в pes2009 не работет.

Последний раз редактировалось Qwed86, 09.11.2008 в 19:45.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:57.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter