[Versión de Delphi] Logitech Infinite Spirit Sable, Patch Driver - Implementación de un jugador multimedia real! Programa de camuflaje de icono QQ adjunto
██████████████ Programa de camuflaje de icono QQ
Convierta "chat con tal y tal" en la barra de título de la ventana de chat QQ en "mi documento tal y tal", y el icono en la ventana de chat se convierte en el ícono del documento de Word, y el icono en la bandeja También se convierte en otros íconos en diferentes estados.
Los iconos de cambio no requieren programación, simplemente modifique el archivo Qqres.dll de QQ2004.
████████████ Logitech Infinite Spirit Sable, Patch Driver: realización de un jugador multimedia real
Logitech Infinite Spirit Mink es un mouse inalámbrico multifuncional lanzado por Logitech.
La característica más importante de este mouse es que tiene muchas teclas de función incrustadas, y además de la rueda de desplazamiento, hay 8 teclas. Las dos claves en el costado están equipadas con los muchos ratones de mediana a alta gama, y las funciones son principalmente para navegar hacia arriba y hacia abajo; , Hacia adelante, hacia atrás, +, -". Además, la rueda de desplazamiento puede realizar la navegación cruzada, lo que significa que hay una función de navegación adicional izquierda y derecha.
Pero en uso real, las funciones de la clave multimedia son realmente limitadas. ¿Por qué lo dices?
El reproductor de medios que me gusta usar es MPC (MS Windows Media Player Classic).
La siguiente es una pregunta sobre las deficiencias de MPC:
Simplemente juegue/pausa y haga clic en el botón o el espacio izquierdo, y el botón izquierdo está en el mouse, por lo que el botón Play/Pause es redundante;
Haga clic en PGUP/PGDOWN en el siguiente/anterior. Incluso si está buscando archivos de video que sean más de 10 minutos, no es un gran problema hacer clic manualmente en el siguiente archivo después de ver uno, por lo que estas dos teclas son innecesarias.
Los últimos controladores de Logitech no proporcionan funciones de personalización para las tres claves anteriores, por lo que para hacer un uso completo de las muchas teclas de función en el mouse, tuve que agregar un nuevo código al programa de icono QQ para implementar estas tres claves. y también puede habilitar el mismo botón del mouse para implementar diferentes funciones de personalización en diferentes aplicaciones.
Use el programa oficial de configuración del controlador para configurar:
La función de la clave de medios es la combinación de clave: Ctrl+F4, y la función del zoom es cerrar el programa (muy eficiente).
El programa posterior puede implementar las siguientes funciones (principalmente combinación de clave):
◎mpc
Explore: avance por 10 segundos;
◎ ACDSEE
Play/Pause: Ctrl+Del;
◎ ACD Fotocanvas
Play/Pausa: Ctrl+S;
◎ netcaptor
Play/Pausa: Ctrl+Shift+S;
◎ Ultraedit
Play/Pausa: Ctrl+S;
¡Finalmente, quiero despreciar a los desarrolladores de Logitech Infinite Spirit Mink Drivers!
La función central del controlador del mouse radica en la conversión y el procesamiento de las señales de desplazamiento transmitidas desde el mouse, así como problemas como la definición de varias claves y el procesamiento de la aceleración, pero estos son solo pequeños problemas en comparación con el procesamiento y el análisis de Señales móviles. Dado que ha realizado tantos ratones de mediana a alta gama, especialmente este lingsie que compré para RMB 360, ¿por qué no escribe más códigos y agrega algunas teclas en el teclado multimedia para personalizarlos? Después de todo, las computadoras no son televisores, grabadoras, máquinas VCD, máquinas de DVD, audio combinado ... Las funciones multimedia son solo parte de las funciones de las computadoras. Utilizado en más software de aplicación.
El código de ██████████ Delphi es el siguiente, entre los cuales solo MPC usa ganchos, porque en el software de reproducción de medios, los mensajes generados por el teclado multimedia y las dos teclas laterales son secuestrados por los ganchos de controladores de Logitech. Así que tengo que hacer un gancho global para detener las noticias con anticipación para que Logitech's Hook no pueda enganchar la información que necesito.
// ▓▓▓▓▓▓▓▓▓▓▓▓ retitle.dpr
Retitle del programa;
usos
Formularios,
Sysutils,
Windows,
Unidad1 en 'unit1.pas' {f},
Dlgdebug_u en 'dlgdebug_u.pas' {dlgDebug};
{$ R *.res}
Comenzar
aplicación.initialize;
// Estado de depuración
dbg: = findcmdlineswitch ('debug', ['/', '-'], true);
Si dbg entonces con dlgdebug comience
dlgDebug: = tdlgdebug.create (aplicación);
Izquierda: = getSystemMetrics (SM_CXScreen) -Width;
Superior: = getSystemMetrics (SM_CYSCREEN) -Height-60;
fin;
Application.CreateForm (TF, F);
Aplicación.run;
fin.
// ▓▓▓▓▓▓▓▓▓ UNIT1.pas
Unidad Unidad1;
interfaz
usos
Windows, mensajes, sysutils, variantes, clases, gráficos, controles, formularios,
Diálogo, stdctrls, extctrls, dlgdebug_u;
tipo
Tf = class (tForm)
Tmr: ttimer;
procedimiento formulcreate (remitente: tobject);
procedimiento tmrtimer (remitente: tobject);
procedimiento WNDProc (Mensaje VAR: TMessage);
Privado
{Declaraciones privadas}
hfocus: hwnd;
BUF: Array [0..1024] de char;
stitle: cadena;
procedimiento getMousePoshwnDandClassName (remitente: tPoint);
reemplazo de función (s, fuente, destino: cadena): cadena;
// logichi infinito sable espiritual
procedimiento hacia abajo (VK: byte);
Procedimiento Up (VK: Byte);
Procedimiento Key1 (VK1: Byte);
Procedimiento Key2 (VK1, Vk2: Byte);
Procedimiento Key3 (VK1, VK2, VK3: BYTE);
público
{Declaraciones públicas}
fin;
varilla
F: tf;
estúpido
Logitech = $ 0319;
Play_pause = $ e0000;
Play_left = $ c0000;
Play_right = $ B0000;
Implementación
procedimiento habilitar Wheelhook;
procedimiento disable
{$ R *.dfm}
procedimiento tf.FormCreate (remitente: tobject); // ██████████████████████████████ Inicialización de la interfaz
Comenzar
FormStyle: = fsstayontop;
Altura: = 0;
Ancho: = 0;
Esconder;
Tmr.interval: = 50;
Showwindow (aplicación.handle, sw_hide);
Setwindowlong (Application.Handle, GWL_EXSTYLE,
GetWindowlong (Application.Handle, GWL_EXSTYLE) o WS_EX_TOOLWINDOW y no ws_ex_appwindow);
Habilitarwheelhook; // llave del lado azul lotech lingmian, gancho de mensajes wm_mousewheel
fin;
procedimiento tf.getMousePoshwnDandClassName (remitente: tpoint); // ████ Barra de título de camuflaje
var hwnd: Thandle;
atitle: matriz [0..255] de char;
str: cadena;
Comenzar
hwnd: = WindowFromPoint (remitente);
Si boolean (getwindowtext (hwnd, atitle, 256)) entonces comience
str: = string (atitle);
if ((pos ('y', str)> 0) y (pos ('chat', str)> 0)) Entonces comience
str: = reemplazar (str, 'chat', '');
str: = reemplazar (str 'y', 'mi documentación');
SetWindowText (hwnd, pchar (str));
fin;
if ((pos ('grupo-', str)> 0) o (pos ('grupo avanzado-', str)> 0)) Luego comience
str: = reemplazar (str, 'group-', 'mi letra');
str: = reemplazar (str, 'avanzado', '');
SetWindowText (hwnd, pchar (str));
fin;
// sala de chat
Si pos ('sala de chat qq', str)> 0 entonces comience
str: = 'Microsoft Visual C ++ 6.2';
SetWindowText (hwnd, pchar (str));
fin;
// msn
Si pos (' - diálogo', str)> 0 entonces comience
str: = reemplazar (str, ' - diálogo', 'documento de trabajo');
SetWindowText (hwnd, pchar (str));
fin;
fin;
fin;
procedimiento tf.tmrtimer (remitente: tobject); // ██████████████████████████████████████ █████████████████████████████████████████
var rpos: tpoint;
Comenzar
Si boolean (getCursorpos (RPO)), entonces getMousePoshwnDandClassName (RPO);
fin;
función tf.replacing (s, fuente, destino: string): string; // ██████ Reemplace la cadena
sitio var, strlen: entero;
Comenzar
Sitio: = pos (fuente, s);
strlen: = longitud (fuente);
eliminar (s, sitio, strlen);
insertar (objetivo, s, sitio);
resultado: = S;
fin;
procedimiento tf.wndproc (mensaje var: tmessage); //// █████████▌logytech infinito espíritu visón
Comience con el mensaje Comenzar
heredado;
// Si no se presionan las tres teclas en el centro y la derecha del teclado multimedia, salga
Si no ((msg = logitech) y ((lParam = play_pause) o (lParam = play_left) o (lParam = play_right))) y luego salga;
hfocus: = getForeforeWindow;
GetWindowText (hfocus, buf, 1024);
stitle: = string (buf);
Deb (Stitle);
// acdsee
if (pos ('acdsee', stitle)> 0) y (pos ('5.0', stitle)> 0) y (msg = logitech) entonces caso lParam de
Play_pause: key2 (vk_control, vk_delete); // ctrl+del
Play_left: key2 (vk_menu, ord ('m')); // alt+m
Play_right: key2 (vk_menu, ord ('c')); // alt+c
fin;
if (pos ('acd', stitle)> 0) y (pos ('fotocanvas', stitle)> 0) y (msg = logitech) luego caso lParam de
Play_pause: key2 (vk_control, ord ('s')); // ctrl+s
Play_left: key2 (vk_shift, ord ('s')); // shift+s
Play_right: key2 (vk_shift, ord ('a')); // shift+a
fin;
// netcaptor
if (pos ('netcaptor', stitle)> 0) y (msg = logitech) entonces caso lParam de
Play_Pause: Key3 (vk_control, vk_shift, ord ('s')); // ctrl+shift+s
Play_left: key1 (vk_f2);
Play_right: Key1 (VK_F3);
fin;
// ultraedit
if (pos ('ultraedit-32', stitle)> 0) y (msg = logitech) entonces caso lParam de
Play_pause: key2 (vk_control, ord ('s')); // ctrl+s
Play_left: Key2 (VK_Control, VK_F6); // Ctrl+F6
Play_right: Key3 (VK_Control, VK_Shift, VK_F6); // Ctrl+Shift+F6
fin;
fin;
procedimiento tf.down (vk: byte);
Procedimiento TF.UP (VK: BYTE);
Procedimiento TF.Key1 (VK1: Byte);
Abajo (vk1);
Arriba (vk1);
fin;
Procedimiento TF.Key2 (VK1, VK2: Byte);
Abajo (vk1);
Abajo (vk2);
Arriba (vk2);
Arriba (vk1);
fin;
Procedimiento TF.Key3 (VK1, VK2, VK3: BYTE);
Abajo (vk1);
Abajo (vk2);
Abajo (vk3);
Arriba (vk3);
Arriba (vk2);
Arriba (vk1);
fin;
fin.
// ▓▓▓▓▓▓▓▓▓▓▓▓ dlgdebug_u.pas
{************************************************** ******** ****************************************
Cuadro de diálogo no modal utilizado en el programa para mostrar información de depuración
2005/02
************************************************************ ******* ********************************************** *****
Unidad DLGDEBUG_U;
Utiliza Windows, mensajes, sysutils, variantes, clases, gráficos, controles, formularios,
Diálogo, stdctrls, comctrls;
procedimiento deb (themsg: string);
procedimiento deb (themsg: entero); sobrecarga;
procedimiento deb (const thestr: string; const args: matriz de const);
tipo
Tdlgdebug = class (tForm)
Re: Trichedit;
procedimiento mmKeyUp (remitente: tobject; var key: word; shift: tshiftState);
procedimiento formulcreate (remitente: tobject);
Privado
{Declaraciones privadas}
público
{Declaraciones públicas}
sangría: byte;
Selcolor: tcolor;
línea de tiempo del procedimiento;
fin;
var dlgdebug: tdlgdebug;
DBG: booleano;
Implementación
{$ R *.dfm}
procedimiento tdlgdebug.mmkeyup (remitente: tobject; var key: word; shift: tshiftState);
Comenzar
if key = vk_space entonces comience
re.tag: = entero (no booleano (re.tag));
//mm.tag: = integer (no boolean (mm.tag));
// Si boolean (mm.tag) entonces rojo.suspend
// else Red.resume;
fin;
fin;
procedimiento deb (themsg: string);
Si no es DBG, salga;
con dlgdebug hice begin // depurar información
Línea de tiempo;
re.selattributes.color: = SelColor;
re.paragraph.firstindent: = indent;
re.lines.add (themsg);
//mm.lines.add(themSg);
fin;
fin;
procedimiento deb (themsg: entero);
Comenzar
Si no es DBG, salga;
con dlgdebug hice begin // depurar información
Línea de tiempo;
re.selattributes.color: = SelColor;
re.paragraph.firstindent: = indent;
re.lines.add (intToStr (themsg));
//mm.lines.add(intTostr(themSg));
fin;
fin;
procedimiento deb (const thestr: string; const args: matriz de const);
Comenzar
Si no es DBG, salga;
con dlgdebug hice begin // depurar información
Línea de tiempo;
re.selattributes.color: = SelColor;
re.paragraph.firstindent: = indent;
re.lines.add (formato (thestr, args));
//mm.lines.add(Format(thestr, args));
fin;
fin;
procedimiento tdlgdebug.timeline;
Comience con Re Do Comen
párrafo.firstindent: = 0;
Selattributes.color: = clred;
líneas.Add (FormatDateTime (LongtimeFormat, ahora));
fin;
procedimiento tdlgDebug.FormCreate (remitente: tobject);
Comenzar
sangría: = 10;
selcolor: = clyellow;
fin;
fin.
// ▓▓▓▓▓▓▓▓▓▓▓▓ HookPrj.DPR
Biblioteca HookPrj;
usos
Sysutils,
Clases,
Hook_u en 'Hook_u.pas';
exportaciones
Habilitarwheelhook,
Deshabilitarwheelhook;
Comenzar
fin.
// ▓▓▓▓▓▓▓▓▓ Hook_u.pas
Unidad Hook_u;
Utiliza Windows, mensajes, sysutils, diálogos;
var hk: hhook; // valor de mango de gancho
hfocus: hwnd;
BUF: Array [0..1024] de char;
stitle: cadena;
ic: byte;
Zdelta: corto;
function wheelhookproc (código: integer; wparam: longint; msg: longint): lResult;
funciones habilitanwheelhook: boolean;
Función DISPLEYWHOELHOOK: boolean;
Implementación
// █████████████████████████████████████████�
function wheelhookproc (código: integer; wparam: longint; msg: longint): lResult;
Comenzar
zDelta: = Short (HIWORD (PMSG (MSG)^. WPARAM));
if (code = hc_action) y (pmsg (msg)^. mensaje = wm_mousewheel) y (abs (zdelta)> 200) luego comience
hfocus: = getForeforeWindow;
GetWindowText (hfocus, buf, 1024);
stitle: = string (buf);
if (pos ('mplayerC', stitle)> 0) o (pos ('Media Player Classic', Stitle)> 0) Entonces comience
inc (ic);
// Presione la tecla del lado azul una vez para generar dos mensajes.
// Si todo se procesa, es equivalente a reenviar rápidamente dos veces, es decir, 10 segundos
// if (ic mod 2) = 0 entonces comience
keyBD_EVENT (VK_CONTROL, MAPVirtualKey (VK_Control, 0), 0, 0);
Si zdelta> 200 entonces comienza
KeyBD_Event (VK_Right, MAPVirtualKey (VK_Right, 0), 0, 0);
keyebd_event (vk_right, mapvirtualkey (vk_right, 0), keyEventf_Keyup, 0); // de inmediato
Fin El otro comienzo
keyBD_EVENT (VK_LET, MAPVirtualKey (VK_LEFT, 0), 0, 0);
keyBD_EVENT (VK_LEFT, MAPVIRTUALKEY (VK_LEFT, 0), KeyEventf_Keyup, 0); // Izquierda
fin;
keyBD_EVENT (VK_CONTROL, MAPVirtualKey (VK_Control, 0), KeyEventF_Keyup, 0); // Ctrl Up
//fin;
PMSG (MSG)^. Mensaje: = 0; // Debido a que el mensaje de clave lateral se ha procesado localmente, no tiene que entregarse a otros hilos para procesar
End el más resultado: = callExthookex (HK, código, wparam, longInt (@msg)); // Si no es MPC, pase hacia abajo
end el más resultado: = callnexthookex (HK, código, wparam, longint (@msg)); // Si no son dos claves laterales azules, páselo hacia abajo
fin;
function habilitanwheelhook: boolean;
Comenzar
Si hk = 0 entonces comienza
HK: = setWindowShookex (wh_getMessage, @wheelhookproc, hinstance, 0);
Resultado: = verdadero;
Fin el resultado del otro: = falso;
fin;
función disablewheelhook: boolean;
Comenzar
Si hk <> 0 entonces comienza
UnwookWindowshookex (HK);
HK: = 0;
Resultado: = verdadero;
Fin el resultado del otro: = falso;
fin;
fin.
QQ: 7995.7944 (Shensi Road)
Correo electrónico: [email protected]