[Versão Delphi] Logitech Infinite Spirit Sable, Patch Driver - Implementando um verdadeiro jogador multimídia! Programa de camuflagem QQ anexado
██████████████ Programa de camuflagem qq qq
Transforme "converse com o mais ou menos" na barra de título da janela de bate-papo QQ em "meu documento de modo mais ou menos", e o ícone na janela de bate-papo se torna o ícone do documento do Word e o ícone na bandeja Também se torna outros ícones em diferentes estados.
Os ícones de alteração não requerem programação, basta modificar o arquivo QQRES.DLL do QQ2004.
████████████ Logitech Infinite Spirit Sable, Patch Driver - Realize um verdadeiro jogador multimídia
A Logitech Infinite Spirit Mink é um mouse sem fio multifuncional lançado pela Logitech.
A maior característica deste mouse é que ele possui muitas teclas de função incorporadas e, além da roda de rolagem, existem 8 teclas. As duas teclas ao lado estão equipadas com os muitos ratos de média a ponta da Logitech, e as funções são principalmente para navegar para cima e para baixo; , Para frente, para trás, +, -". Além disso, a roda de rolagem pode executar a navegação cruzada, o que significa que há uma função de navegação esquerda e direita adicional.
Mas, no uso real, as funções da chave multimídia são realmente limitadas. Por que você diz isso?
O mídia que eu gosto de usar é o MPC (MS Windows Media Player Classic).
A seguir, é apresentada uma pergunta sobre as deficiências do MPC:
Basta reproduzir/pausar e clicar no botão ou espaço esquerdo, e o botão esquerdo está no mouse, para que o botão de reprodução/pausa seja redundante;
Clique em PGUP/PGDOWN no próximo/anterior. Mesmo se você estiver procurando por arquivos de vídeo com mais de 10 minutos, não é um grande problema clicar manualmente no próximo arquivo depois de assistir um, para que essas duas chaves sejam desnecessárias.
Os drivers mais recentes da Logitech não fornecem funções de personalização para as três teclas acima; portanto, para fazer pleno uso das muitas teclas de função no mouse, tive que adicionar um novo código ao programa QQ Icon para implementar essas três chaves. E também pode permitir que o mesmo botão do mouse implemente diferentes funções de personalização em diferentes aplicativos.
Use o programa oficial de configuração do driver para configurar:
A função da chave de mídia é a combinação de chave: Ctrl+F4, e a função do zoom é fechar o programa (muito eficiente).
O programa subsequente pode implementar as seguintes funções (principalmente a combinação de chave):
◎mpc
Navegue: vá em frente por 10 segundos;
◎ Acdsee
Jogue/pausa: Ctrl+del;
◎ ACD Fotocanvas
Jogue/pausa: ctrl+s;
◎ NetCaptor
Jogue/pausa: Ctrl+Shift+S;
◎ UltraEdit
Jogue/pausa: Ctrl+S;
Finalmente, quero desprezar os desenvolvedores dos drivers de vison de Logitech Infinite Spirit!
A função principal do motorista do mouse está na conversão e processamento de sinais de deslocamento transmitidos do mouse, bem como problemas como a definição de várias chaves e o processamento da aceleração, mas esses são apenas pequenos problemas em comparação com o processamento e análise de Sinais móveis. Desde que você fez tantos ratos de médio a ponta, especialmente essa Lingsie que comprei para o RMB 360, por que você não digita mais códigos e adiciona algumas teclas no teclado multimídia para personalizá-las. Afinal, os computadores não são TVs, gravadores, máquinas VCD, máquinas de DVD, áudio combinado ... As funções multimídia são apenas parte das funções dos computadores. Usado em mais software de aplicativo.
O código de ██████████ Delphi é o seguinte, entre os quais apenas o MPC usa ganchos, porque no software de reprodução de mídia, as mensagens geradas pelo teclado multimídia e as duas teclas laterais são sequestradas pelos ganchos de driver da Logitech. Então, eu tenho que fazer um gancho global para parar as notícias com antecedência, para que o gancho da Logitech não possa conectar as informações de que preciso.
// ▓▓▓▓▓▓▓▓▓▓▓▓ Retitle.dpr
Retite do programa;
usos
Formas,
Sysutils,
Windows,
Unidade1 em 'unidade1.pas' {f},
Dlgdebug_u em 'dlgdebug_u.pas' {dlgdebug};
{$ R *.res}
Começar
Application.initialize;
// status de depuração
dbg: = findcmdlineswitch ('debug', ['/', '-'], true);
Se o DBG, então com o dlgdebug começar
dlgdebug: = tdlgdebug.create (aplicativo);
Esquerda: = getSystemMetrics (sm_cxscreen) -Width;
TOP: = getSystemMetrics (SM_CYSCREEN) -Height-60;
fim;
Application.creatEform (tf, f);
Application.run;
fim.
// ▓▓▓▓▓▓▓▓▓ Unit1.Pas
unidade de unidade1;
interface
usos
Janelas, mensagens, sysutils, variantes, classes, gráficos, controles, formulários,
Diálogos, stdctrls, extctrls, dlgdebug_u;
tipo
Tf = classe (tform)
TMR: ttimer;
Procedimento FormCreate (remetente: Tobject);
procedimento tmrtimer (remetente: tabjas);
Procedimento WNDPROC (VAR Mensagem: TMessage);
Privado
{Declarações privadas}
hfocus: hwnd;
BUF: Array [0..1024] de Char;
Stitle: string;
Procedimento getMousePoshWNDAndClassName (remetente: TPOint);
função substituindo (s, fonte, destino: string): string;
// LOGICHI Infinite Sable espiritual
procedimento para baixo (vk: byte);
procedimento para cima (vk: byte);
Procedimento KEY1 (VK1: BYTE);
Procedimento KEY2 (VK1, VK2: byte);
Procedimento KEY3 (VK1, VK2, VK3: BYTE);
público
{Declarações públicas}
fim;
var
f: tf;
const
Logitech = $ 0319;
Play_pause = $ e0000;
Play_left = $ c0000;
Play_right = $ b0000;
Implementação
Procedimento Ative WheelHook;
Procedimento Desativar o WheelHook;
{$ R *.dfm}
procedimento tf.formCreate (remetente: tabject); // ██████████████████████████████ Inicialização da interface
Começar
Formstyle: = fsStayOntop;
Altura: = 0;
Largura: = 0;
Esconder;
Tmr.Interval: = 50;
ShowWindow (Application.Handle, SW_HIDE);
SetWindowlong (Application.Handle, gwl_exstyle,
Getwindowlong (Application.Handle, GWL_Exstyle) ou WS_EX_TOOLWindow e não ws_ex_appwindow);
Habilable Wheelhook; // LOTECH LINGMIAN BLUE Side Key, WM_MOUSEWHEL MENSAGEN
fim;
procedimento tf.getMousePoshWndandClassName (remetente: TPOINT); // ████ Barra de título de camuflagem
var hwnd: thandle;
atitle: matriz [0..255] de char;
str: string;
Começar
HWND: = WindowFroMpoint (remetente);
Se booleano (getWindowText (hwnd, atitle, 256)) então comece
str: = string (atitle);
if ((pos ('e', str)> 0) e (pos ('chat', str)> 0)) então comece
str: = substituindo (str, 'chat', '');
str: = substituindo (str, 'e', 'minha documentação');
SetWindowText (hwnd, pchar (str));
fim;
if ((pos ('grupo-', str)> 0) ou (pos ('grupo avançado-', str)> 0)) então comece
str: = substituindo (str, 'grupo-', 'minha letra');
str: = substituindo (str, 'avançado', '');
SetWindowText (hwnd, pchar (str));
fim;
// Sala de bate -papo
Se pos ('QQ Chat Sala', str)> 0, então comece
str: = 'Microsoft Visual C ++ 6.2';
SetWindowText (hwnd, pchar (str));
fim;
// msn
Se pos (' - diálogo', str)> 0, então comece
str: = substituindo (str, ' - diálogo', 'documento de trabalho');
SetWindowText (hwnd, pchar (str));
fim;
fim;
fim;
procedimento tf.tmrtimer (remetente: tobject); // ██████████████████████████████████████ █████████████████████████████████████████
var rpos: TPoint;
Começar
se boolean (getCursorPos (rPOs)) então getMousePoshWNDandClassName (rPOS);
fim;
função tf.Replacing (s, fonte, destino: string): string; // ██████ Substitua a string
Site Var, Strlen: Inteiro;
Começar
Site: = POS (fonte, S);
strlen: = comprimento (fonte);
excluir (s, site, strlen);
inserir (alvo, s, site);
resultado: = s;
fim;
procedimento tf.wndproc (var mensagem: tmessage); //// █████████▌Logytech Infinite Spirit Mink
Comece com a mensagem. Comece
herdado;
// Se as três chaves no centro e à direita do teclado multimídia não estiverem pressionadas, saia
Se não ((msg = logitech) e ((lparam = play_pause) ou (lparam = play_left) ou (lparam = play_right))) depois saia;
hfocus: = getforegroundwindow;
GetWindowText (Hfocus, BUF, 1024);
estitle: = string (buf);
Deb (Stitle);
// acdsee
if (POS ('ACDSEE', STITLE)> 0) e (POS ('5.0', Stitle)> 0) e (Msg = Logitech), em seguida, case 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
fim;
if (POS ('ACD', Stitle)> 0) e (POS ('Fotocanvas', Stitle)> 0) e (Msg = Logitech), então case 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
fim;
// netCaptor
if (pos ('netcaptor', stitle)> 0) e (msg = logitech) então case lparam de
Play_pause: key3 (vk_control, vk_shift, ord ('s')); // ctrl+shift+s
Play_left: key1 (vk_f2);
Play_right: key1 (vk_f3);
fim;
// UltraEdit
if (POS ('UltraEdit-32', Stitle)> 0) e (Msg = Logitech) então case 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
fim;
fim;
procedimento tf.down (vk: byte);
procedimento tf.up (vk: byte);
procedimento TF.KEY1 (VK1: BYTE);
Para baixo (vk1);
Up (vk1);
fim;
Procedimento TF.KEY2 (VK1, VK2: BYTE);
Para baixo (vk1);
Para baixo (vk2);
Up (vk2);
Up (vk1);
fim;
Procedimento TF.KEY3 (VK1, VK2, VK3: BYTE);
Para baixo (vk1);
Para baixo (vk2);
Para baixo (vk3);
Up (vk3);
Up (vk2);
Up (vk1);
fim;
fim.
// ▓▓▓▓▓▓▓▓▓▓▓▓ dlgdebug_u.pas
{***************************************************** ******** **************************************
Caixa de diálogo não modal usada no programa para exibir informações de depuração
2005/02
**************************************************** ******* *****
unidade dlgdebug_u;
Usa janelas, mensagens, sistemas, variantes, classes, gráficos, controles, formulários,
Diálogos, stdctrls, comctrls;
Procedimento Deb (THEMSG: String);
Procedimento Deb (THEMSG: Integer); sobrecarga;
Procedimento Deb (const theSt: String; const args: matriz de const);
tipo
Tdlgdebug = classe (tform)
Re: Trichedit;
Procedimento mmkeyUp (remetente: TOBJECT; VAR Tecla: Word; Shift: TSHIFTSTATE);
Procedimento FormCreate (remetente: Tobject);
Privado
{Declarações privadas}
público
{Declarações públicas}
recuo: byte;
Selcolor: tcolor;
Linha do tempo do procedimento;
fim;
var dlgdebug: tdlgdebug;
DBG: booleano;
Implementação
{$ R *.dfm}
procedimento tdlgdebug.mmKeyUp (remetente: TOBJECT; VAR Tecla: Word; Shift: TSHIFTSTATE);
Começar
se key = vk_space então comece
re.TAG: = Inteiro (não booleano (re.TAG));
//mm.tag: = número inteiro (não booleano (mm.tag));
// se booleano (mm.tag) então vermelho.suspend
// else Red.resume;
fim;
fim;
Procedimento Deb (THEMSG: String);
se não for dbg, então saia;
com dlgdebug do começo // informações de depuração
Linha do tempo;
re.Selattributes.Color: = Selcolor;
re.Paragraph.Firstindent: = Indent;
re. lines.add (themsg);
//mm.lines.add(themsg);
fim;
fim;
Procedimento Deb (THEMSG: Inteiro);
Começar
se não for dbg, então saia;
com dlgdebug do começo // informações de depuração
Linha do tempo;
re.Selattributes.Color: = Selcolor;
re.Paragraph.Firstindent: = Indent;
re. lines.add (inttostr (themsg));
//mm.Lines.add(inttostr(themsg));
fim;
fim;
Procedimento Deb (const theSt: String; const args: matriz de const);
Começar
se não for dbg, então saia;
com dlgdebug do começo // informações de depuração
Linha do tempo;
re.Selattributes.Color: = Selcolor;
re.Paragraph.Firstindent: = Indent;
re. lines.add (formato (theSt, args));
//mm.Lines.add(Format(TheST, args));
fim;
fim;
procedimento tdlgdebug.timeline;
Comece com re do começo
parágrafo.Firstindent: = 0;
Selattributes.color: = clred;
lines.add (formatDateTime (longtimeFormat, agora));
fim;
procedimento tdlgdebug.formCreate (remetente: tabject);
Começar
recuo: = 10;
Selcolor: = Clyellow;
fim;
fim.
// ▓▓▓▓▓▓▓▓▓▓▓▓ Hookprj.dpr
Biblioteca Hookprj;
usos
Sysutils,
Aulas,
Hook_u em 'Hook_u.pas';
exportações
Hability Wheelhook,
Desativar o wheelhook;
Começar
fim.
// ▓▓▓▓▓▓▓▓▓ gancho_u.pas
unidade gancho_u;
usa janelas, mensagens, sysutils, diálogos;
var hk: hhook; // Valor da alça do gancho
hfocus: hwnd;
BUF: Array [0..1024] de Char;
Stitle: string;
ic: byte;
Zdelta: curto;
função wheelhookproc (código: número inteiro; wparam: longnt; msg: longnt): lResult;
Função Ativar WheelHook: Boolean;
função desativar o wheelhook: boolean;
Implementação
// █████████████████████████████████████████�
função wheelhookproc (código: número inteiro; wparam: longnt; msg: longnt): lResult;
Começar
zdelta: = curto (hiword (pmsg (msg)^. wparam));
if (code = hc_action) e (pmsg (msg)^. message = wm_mousewheel) e (abs (zdelta)> 200) então inicie
hfocus: = getforegroundwindow;
GetWindowText (Hfocus, BUF, 1024);
estitle: = string (buf);
if (pos ('mplayerc', stitle)> 0) ou (pos ('media player clássico', sTitle)> 0) então comece
Inc (IC);
// Pressione a tecla lateral azul uma vez para gerar duas mensagens.
// Se tudo processado, é equivalente a encaminhar rapidamente duas vezes, ou seja, 10 segundos
// if (ic mod 2) = 0 então comece
keybd_event (vk_control, mapvirtualKey (vk_control, 0), 0, 0);
Se Zdelta> 200, então comece
keybd_event (vk_right, mapVirtualKey (vk_right, 0), 0, 0);
keybd_event (vk_right, mapvirtualKey (vk_right, 0), keyeventf_keyup, 0); //
final mais começa
keybd_event (vk_left, mapvirtualKey (vk_left, 0), 0, 0);
keybd_event (vk_left, mapvirtualKey (vk_left, 0), keyeventf_keyup, 0); // deixado para cima
fim;
keybd_event (vk_control, mapvirtualKey (vk_control, 0), keyeventf_keyup, 0); // ctrl up
//fim;
Pmsg (msg)^.
final mais resultado: = callnexthookex (hk, código, wparam, long (@msg)); // se não for mpc, passa para baixo
final mais resultado: = CallNexthookex (hk, código, wparam, long (@msg)); // se não for duas chaves laterais azuis, passe para baixo
fim;
Função Ativar WheelHook: Boolean;
Começar
Se hk = 0 então comece
Hk: = setWindowshookex (wh_getMessage, @wheelhookproc, hinstance, 0);
Resultado: = true;
final mais resultado: = false;
fim;
Função Desativar o WheelHook: Boolean;
Começar
Se hk <> 0, então comece
UNOKWindowshookex (HK);
Hk: = 0;
Resultado: = true;
final mais resultado: = false;
fim;
fim.
QQ: 7995.7944 (estrada Shensi)
E-mail: [email protected]