Ir al contenido


Foto

HKMedia


  • Por favor identifícate para responder
10 respuestas en este tema

#1 cHackAll

cHackAll

    Advanced Member

  • Administrador
  • 599 mensajes

Escrito 07 junio 2009 - 09:08

Los teclados multimedias sin duda traen muchas facilidades pues tan solo presionando una tecla podemos ejecutar aplicaciones, subir o bajar el volumen, cambiar de cancion, etc., etc. Sin embargo no todos los teclados multimedia cuentan con las funciones que uno quisiera, y ni hablar de aquellos teclados antiguos.

El siguiente ejemplo muestra una solucion para este tema, registrando combinaciones de teclas que cumplen las funciones multimedia deseadas;



delphi
  1. program HKMedia; // by cHackAll
  2.  
  3. uses Windows, ShellAPI, Messages;
  4.  
  5. const
  6. VK_VOLUME_UP = $AF;
  7. VK_VOLUME_DOWN = $AE;
  8. VK_MEDIA_NEXT_TRACK = $B0;
  9. VK_MEDIA_PREV_TRACK = $B1;
  10. MediaHotKey = 'MediaHotKey';
  11.  
  12. var
  13. hMenu: Cardinal;
  14. hKey: Windows.HKEY;
  15. FileName: array [1..MAX_PATH] of Char;
  16.  
  17. function WndProc(hWnd, uMsg, wParam, lParam: Cardinal): Integer; stdcall;
  18. var Point: TPoint;
  19. begin
  20. Result := 0;
  21. case uMsg of
  22.   WM_HOTKEY: begin
  23.               keybd_event(wParam, 0, 0, 0);
  24.               keybd_event(wParam, 0, KEYEVENTF_KEYUP, 0);
  25.             end;
  26.   WM_USER: if lParam = WM_RBUTTONDOWN then
  27.             begin
  28.             SendMessage(hWnd, WM_COMMAND, 2, WM_USER);
  29.             SetForegroundWindow(hWnd); GetCursorPos(Point);
  30.             TrackPopupMenu(hMenu, TPM_LEFTALIGN, Point.X, Point.Y, 0, hWnd, nil);
  31.             end;
  32.   WM_COMMAND: if wParam = 0 then
  33.               SendMessage(hWnd, WM_CLOSE, 0, 0)
  34.               else
  35.               begin
  36.                 uMsg := MF_BYCOMMAND;
  37.                 if RegQueryValueEx(hKey, MediaHotKey, nil, nil, nil, nil) = 0 then
  38.                 uMsg := uMsg or MF_CHECKED;
  39.                 if lParam = WM_USER then
  40.                 ModifyMenu(hMenu, 2, uMsg, 2, 'Startup')
  41.                 else if uMsg <> MF_BYCOMMAND then
  42.                 RegDeleteValue(hKey, MediaHotKey)
  43.                 else
  44.                 RegSetValueEx(hKey, MediaHotKey, 0, REG_SZ, @FileName, GetModuleFileName(0, @FileName, SizeOf(FileName)));
  45.               end;
  46.   WM_DESTROY: PostQuitMessage(0);
  47. else
  48.   Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
  49. end;
  50. end;
  51.  
  52. var
  53. WndClass: TWndClass = (lpfnWndProc: @WndProc; lpszClassName: MediaHotKey);
  54. NotifyIconData: TNotifyIconData = (cbSize: SizeOf(NotifyIconData);
  55.   uFlags: NIF_MESSAGE or NIF_ICON or NIF_TIP;
  56.   uCallbackMessage: WM_USER;
  57.   szTip: 'HKMedia'#13'by cHackAll');
  58. hWnd: Cardinal;
  59. Msg: TMsg;
  60.  
  61. begin
  62. CreateMutex(nil, True, MediaHotKey);
  63. if GetLastError <> 0 then Exit;
  64.  
  65. hWnd := CreateWindow(PChar(RegisterClass(WndClass)), nil, WS_POPUP, 0, 0, 0, 0, 0, 0, hInstance, nil);
  66.  
  67. RegisterHotKey(hWnd, VK_MEDIA_NEXT_TRACK, MOD_CONTROL, VK_RIGHT);
  68. RegisterHotKey(hWnd, VK_MEDIA_PREV_TRACK, MOD_CONTROL, VK_LEFT);
  69. RegisterHotKey(hWnd, VK_VOLUME_DOWN, MOD_CONTROL, VK_DOWN);
  70. RegisterHotKey(hWnd, VK_VOLUME_UP, MOD_CONTROL, VK_UP);
  71.  
  72. NotifyIconData.Wnd := hWnd;
  73. NotifyIconData.hIcon := LoadImage(LoadLibrary('osk.exe'), 'APP_OSK', IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
  74. Shell_NotifyIcon(NIM_ADD, @NotifyIconData);
  75.  
  76. hMenu := CreatePopupMenu;
  77. if RegOpenKey(HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Run', hKey) = ERROR_SUCCESS then
  78.   begin
  79.   AppendMenu(hMenu, MF_BYCOMMAND or MF_CHECKED, 2, 'Startup');
  80.   AppendMenu(hMenu, MF_BYCOMMAND or MF_SEPARATOR, 1, nil);
  81.   end;
  82. AppendMenu(hMenu, MF_BYCOMMAND, 0, 'Close');
  83.  
  84. repeat GetMessage(Msg, 0, 0, 0);
  85.   DispatchMessage(Msg);
  86. until Msg.Message = WM_QUIT;
  87.  
  88. Shell_NotifyIcon(NIM_DELETE, @NotifyIconData);
  89. end.



Las funciones que el anterior ejemplo muestra son;
Ctrl + Flecha Derecha = Siguiente canción
Ctrl + Flecha Izquierda = Anterior canción
Ctrl + Flecha Arriba = Subir el volumen
Ctrl + Flecha Abajo = Bajar el volumen


Se pueden aumentar a voluntad funciones añadiendo una linea como la siguiente;



delphi
  1. RegisterHotKey(hWnd, VK_VOLUME_MUTE, MOD_CONTROL, VK_END); // Ctrl+End=Mute



Tambien muestra un manejo sencillo de mensajes, TrayIcon y de ejecución automatica.

Enjoy!
  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 07 junio 2009 - 09:16

Wow, eso está genial bro  (6), lo bajé, lo corrí­ y lo probé y ¡excelente! :D (y)
  • 0

#3 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 07 junio 2009 - 10:17

Hola
Lo de siempre, nos tienes acostumbrados a lo mejor. (y)
Saludos
  • 0

#4 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 07 junio 2009 - 02:20

Bonito código (y)
  • 0

#5 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 07 junio 2009 - 02:21

Hola....
Una preguntonta.... ¿funciona con cualquier reproductor? Yo lo he probado sólo con el Windows Media... y funciona.

Noto que el volumen es el del sistema.... pensaba que bajaba el volumen del reproductor.

Saludos,
  • 0

#6 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 07 junio 2009 - 02:49

Una preguntonta.... ¿funciona con cualquier reproductor? Yo lo he probado sólo con el Windows Media... y

Te respondo yo  8-| ... Solo funciona con aquellos reproductores que utilicen esas teclas.

Chackall simula la pulsación de las teclas multimedia que hay en los nuevos teclados, si el reproductor no ha previsto la pulsación de esas teclas no hara nada
  • 0

#7 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 07 junio 2009 - 03:24

Pues jurarí­a haber leí­do algo parecido de cHackAll en alguna parte, pero no lo encuentro. ¿Me equivoco?. ¿Será que se borro en la última caí­da de Delphiaccess? :p

De cualquier forma me parece una idea y un código muy bueno.  (y)

Saludos.
  • 0

#8 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 08 junio 2009 - 08:25

¡Que bien!  (y)

Amigo me pierdo un poco, quisiera modificar la combinacion de teclas ya que a veces no deja hacer algunas cosas que usan los mismos comandos; ¿donde, donde?  :D
  • 0

#9 cHackAll

cHackAll

    Advanced Member

  • Administrador
  • 599 mensajes

Escrito 08 junio 2009 - 02:07

Pues jurarí­a haber leí­do algo parecido de cHackAll en alguna parte, pero no lo encuentro. ¿Me equivoco?. ¿Será que se borro en la última caí­da de Delphiaccess?...


Exactamente amigo escafandra... el codigo nace en respuesta de una pregunta de un usuario, lastimosamente se pierde el hilo pero no asi el interes en el codigo :)

...Amigo me pierdo un poco, quisiera modificar la combinacion de teclas ya que a veces no deja hacer algunas cosas que usan los mismos comandos; ¿donde, donde?  :D


jeje, si... justamente note que el Ctrl+Cursor es usado en todos los editores de texto.
La respuesta a lo que pides;



delphi
  1. // . . .
  2. // RegisterHotKey(hWnd, VK_MEDIA_NEXT_TRACK, MOD_CONTROL, VK_RIGHT);
  3. RegisterHotKey(hWnd, VK_MEDIA_NEXT_TRACK, MOD_ALT or MOD_CONTROL, VK_RIGHT);
  4. // . . .



Sin embargo el codigo tal cual lo publico en el primer post tiene un par de BUGs adicionales. Ya corregido vuelvo a adjuntar la fuente compatible con Vista y Seven.

Enjoy!
  • 0

#10 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 08 junio 2009 - 04:41


Pues jurarí­a haber leí­do algo parecido de cHackAll en alguna parte, pero no lo encuentro. ¿Me equivoco?. ¿Será que se borro en la última caí­da de Delphiaccess?...


Exactamente amigo escafandra... el codigo nace en respuesta de una pregunta de un usuario, lastimosamente se pierde el hilo pero no asi el interes en el codigo :)


Bien, veo que la cabeza no me va tan mal como pensaba. :p

Saludos.
  • 0

#11 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 08 junio 2009 - 07:24

Te respondo yo  8-| ... Solo funciona con aquellos reproductores que utilicen esas teclas.

Chackall simula la pulsación de las teclas multimedia que hay en los nuevos teclados, si el reproductor no ha previsto la pulsación de esas teclas no hara nada


Gracias Maestro por sacarme la duda.
Ahora deberí­a ponerme a estudiar el código para no cometer alguna otra preguntonta. No voy a decir que me parece Chino... pero si algo menos complicado.... tal vez aleman :D
Mi cabeza no trabaja a muchas revoluciones por minutos.... trabaja leeennnnto... algún dí­a comprenderé del todo las maestras obras que exponen.

Saludos,
  • 0




IP.Board spam blocked by CleanTalk.