[Version Delphi] Logitech Infinite Spirit Sable, Patch du pilote - Implémentation d'un véritable joueur multimédia! Programme de camouflage de l'icône QQ ci-joint
██████████████ Programme de camouflage d'icônes QQ
Tournez "discuter avec tel ou tel" dans la barre de titre de la fenêtre de chat QQ sur "Mon document tel ou tel", et l'icône dans la fenêtre de chat devient l'icône du document Word, et l'icône dans le plateau devient également d'autres icônes dans différents états.
Les icônes de modification ne nécessitent pas de programmation, modifiez simplement le fichier qqres.dll de QQ2004.
████████████ Logitech Infinite Spirit Sable, Patch Driver - Réalisez un véritable joueur multimédia
Logitech Infinite Spirit Mink est une souris sans fil multifonctionnelle lancée par Logitech.
La plus grande caractéristique de cette souris est qu'il a de nombreuses clés de fonction intégrées, et en plus de la roue de défilement, il y a 8 touches. Les deux touches sur le côté sont équipées de nombreuses souris à mi-parole de Logitech, et les fonctions sont principalement à naviguer vers le haut et vers le bas; , En avant, en arrière, +, - ". De plus, la roue de défilement peut effectuer une navigation croisée, ce qui signifie qu'il existe une fonction de navigation gauche et droite supplémentaire.
Mais en usage réel, les fonctions de la clé multimédia sont vraiment limitées. Pourquoi le dites-vous?
Le lecteur multimédia que j'aime utiliser est MPC (MS Windows Media Player Classic).
Ce qui suit est une question sur les lacunes de MPC:
Jouez simplement / pause et cliquez sur le bouton gauche ou l'espace, et le bouton gauche est sur la souris, de sorte que le bouton Play / Pause est redondant;
Cliquez sur PGUP / PGDOWN sur le suivant / précédent. Même si vous recherchez des fichiers vidéo qui durent plus de 10 minutes, ce n'est pas un gros problème de cliquer manuellement sur le fichier suivant après en regarder un, donc ces deux clés ne sont pas nécessaires.
Les derniers pilotes de Logitech ne fournissent pas de fonctions de personnalisation pour les trois clés ci-dessus, donc pour utiliser pleinement les nombreuses touches de fonction sur la souris, j'ai dû ajouter un nouveau code au programme d'icône QQ pour implémenter ces trois touches. et il peut également permettre au même bouton de souris d'implémenter différentes fonctions de personnalisation dans différentes applications.
Utilisez le programme officiel de configuration du pilote pour configurer:
La fonction de la clé multimédia est la combinaison de clé: Ctrl + F4, et la fonction du zoom est de fermer le programme (très efficace).
Le programme ultérieur peut implémenter les fonctions suivantes (principalement combinaison de clés):
◎mpc
Parcourez: Allez de l'avant pendant 10 secondes;
◎ ACDSEE
Jouer / Pause: Ctrl + del;
◎ ACD Fotocanvas
Play / Pause: Ctrl + S;
◎ Netcaptor
Jouer / Pause: Ctrl + Shift + S;
◎ Ultraedit
Play / Pause: Ctrl + S;
Enfin, je veux mépriser les développeurs des conducteurs de vison Spirit Logitech Infinite!
La fonction centrale du conducteur de souris réside dans la conversion et le traitement des signaux de déplacement transmis à partir de la souris, ainsi que des problèmes tels que la définition de diverses clés et le traitement de l'accélération, mais ce ne sont que de petits problèmes par rapport au traitement et à l'analyse de signaux mobiles. Depuis que vous avez fait tant de souris à mi-hauteur, en particulier cette Lingsie que j'ai achetée pour RMB 360, pourquoi ne tapez-vous pas plus de codes et ajoutez quelques clés dans le clavier multimédia pour les personnaliser. Après tout, les ordinateurs ne sont pas des téléviseurs, des enregistreurs, des machines VCD, des machines DVD, des fonctions audio combinées ... Utilisé dans plus de logiciels d'application.
Le code de ██████████ Delphi est le suivant, parmi lequel seul MPC utilise des crochets, car dans le logiciel de lecture multimédia, les messages générés par le clavier multimédia et les deux touches latérales sont enlevés par les crochets de pilote de Logitech. Je dois donc faire un crochet mondial moi-même pour arrêter les nouvelles à l'avance afin que le crochet de Logitech ne puisse pas accrocher les informations dont j'ai besoin.
// ▓▓▓▓▓▓▓▓▓▓▓▓ retitle.dpr
Program Retitle;
usages
Formes,
Sysutils,
Fenêtres,
Unit1 dans 'unit1.pas' {f},
Dlgdebug_u dans 'dlgdebug_u.pas' {dlgdebug};
{$ R * .res}
Commencer
application.Initialize;
// statut de débogage
dbg: = findcmdlineswitch ('debug', ['/', '-'], true);
Si dbg, avec dlgdebug, commencez
dlgdebug: = tdlgdebug.create (application);
Left: = GetSystemMetrics (sm_cxscreen) -Width;
En haut: = GetSystemMetrics (SM_CYSCREEN) -HEight-60;
fin;
Application.CreateForm (tf, f);
Application.run;
fin.
// ▓▓▓▓▓▓▓▓▓ Unit1.pas
unité unité 1;
interface
usages
Windows, messages, systèmes, variantes, classes, graphiques, contrôles, formulaires,
Dialogues, stdctrls, extctrls, dlgdebug_u;
taper
Tf = classe (tform)
TMR: Ttimer;
Procédure FormCreate (expéditeur: tobject);
procédure tmrtimer (expéditeur: tobject);
Procédure wndproc (message var: tMessage);
Privé
{Déclarations privées}
hfocus: hwnd;
BUF: Array [0..1024] de Char;
Sticle: String;
Procédure GetMousPoshWndAndClassName (expéditeur: TPoint);
Fonction Remplacement (S, Source, Target: String): String;
// Logichi Infini Spiritual Sable
procédure vers le bas (VK: octet);
Procédure UP (VK: octet);
Procédure Key1 (VK1: octet);
Procédure Key2 (VK1, VK2: octet);
Procédure Key3 (VK1, VK2, VK3: octet);
publique
{Déclarations publiques}
fin;
var
F: TF;
const
Logitech = 0319;
Play_pause = $ e0000;
Play_left = $ C0000;
Play_right = $ b0000;
Mise en œuvre
Procédure Activer WheelHook;
procédure DisablewheelHook;
{$ R * .dfm}
Procédure tf.formCreate (expéditeur: tobject); // ██████████████████████████████ Initialisation de l'interface
Commencer
FormStyle: = fsStayontop;
Hauteur: = 0;
Largeur: = 0;
Cacher;
Tmr.interval: = 50;
Showwindow (application.handle, sw_hide);
Setwindowlong (application.handle, gwl_exstyle,
GetWindowlong (application.handle, gwl_exstyle) ou ws_ex_toolwindow et non ws_ex_appwindow);
Activer WheelHook; // Lotech Lingmian Blue Side Key, WM_Mousewheel Message Hook
fin;
Procédure tf.getMousePoshwndandClassName (expéditeur: tpoint); // ████ barre de titre de camouflage
var hwnd: thandle;
Atitle: Array [0..255] de Char;
str: string;
Commencer
hwnd: = windowfRompIval (expéditeur);
Si booléen (getWindowText (hwnd, atitle, 256)) alors commencez
str: = string (aTitle);
if ((pos ('et', str)> 0) et (pos ('chat', str)> 0)) alors commencez
str: = remplacement (str, 'chat', '');
str: = remplacer (str, 'et', 'ma documentation');
SetWindowText (hwnd, phar (str));
fin;
if ((pos ('groupe -', str)> 0) ou (pos ('groupe avancé -', str)> 0)) alors commencez
str: = remplacer (str, «groupe», «ma lettre»);
str: = remplacer (str, «avancé», '');
SetWindowText (hwnd, phar (str));
fin;
// salle de chat
Si pos ('QQ Chat Room', str)> 0 alors commencez
str: = 'Microsoft Visual C ++ 6.2';
SetWindowText (hwnd, phar (str));
fin;
// msn
Si pos ('- dialogue', str)> 0 alors commencez
str: = remplacer (str, «- dialogue», «document de travail»);
SetWindowText (hwnd, phar (str));
fin;
fin;
fin;
procédure tf.tmrtimer (expéditeur: tobject); // ██████████████████████████████████████ █████████████████████████████████████████
var RPOS: TPoint;
Commencer
Si boolean (getCursorpos (RPOS)) alors getMousPoshwndandClassName (RPOS);
fin;
fonction tf.replacing (s, source, cible: chaîne): chaîne; // ██████ remplacer la chaîne
site var, strlen: entier;
Commencer
Site: = POS (source, s);
strlen: = longueur (source);
Delete (S, site, strlen);
insert (cible, s, site);
Résultat: = S;
fin;
Procédure tf.wndproc (Message var: tmessage); //// █████████▌logytech infinie spirit mink
Commencez par le message commence
hérité;
// Si les trois touches au centre et à droite du clavier multimédia ne sont pas pressées, sortez
Si pas ((msg = logitech) et ((lparam = play_pause) ou (lparam = play_left) ou (lparam = play_right))) puis exit;
hfocus: = getforegroundwindow;
GetWindowText (hfocus, buf, 1024);
Sticle: = String (buf);
Deb (Stitle);
// acdsee
if (pos ('acdsee', semi
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', tremble
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', trette)> 0) et (msg = logitech) puis 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);
fin;
// ultraedit
if (pos ('ultraedit-32', tremblement)> 0) et (msg = logitech) puis 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
fin;
fin;
procédure tf.down (vk: byte); begin keybd_event (vk, mapVirtualKey (vk, 0), 0, 0);
procédure tf.up (vk: byte); begin keybd_event (vk, mapVirtualKey (vk, 0), keyeventf_keyup, 0);
procédure tf.key1 (vk1: octet);
Down (VK1);
Up (VK1);
fin;
procédure tf.key2 (vk1, vk2: octet);
Down (VK1);
Down (VK2);
Up (vk2);
Up (VK1);
fin;
Procédure TF.Key3 (VK1, VK2, VK3: BYTE);
Down (VK1);
Down (VK2);
Down (VK3);
Up (VK3);
Up (vk2);
Up (VK1);
fin;
fin.
// ▓▓▓▓▓▓▓▓▓▓▓▓ dlgdebug_u.pas
{************************************************* ******** **************************************
Boîte de dialogue non modale utilisée dans le programme pour afficher les informations de débogage
2005/02
**************************************************** ******* ******************************************* *****
unité dlgdebug_u;
utilise des fenêtres, des messages, des systèmes, des variantes, des classes, des graphiques, des contrôles, des formulaires,
Dialogues, stdctrls, comctrls;
Procédure Deb (themsg: String);
Procédure Deb (themsg: entier); surcharge;
Procédure Deb (const thestr: string; const args: array of const);
taper
Tdlgdebug = classe (tform)
Re: Trichedit;
Procédure mmkeyup (expéditeur: tobject; Var Key: Word; Shift: tshiftState);
Procédure FormCreate (expéditeur: tobject);
Privé
{Déclarations privées}
publique
{Déclarations publiques}
INDENT: octet;
Selcolor: tcolor;
Chronologie de la procédure;
fin;
var dlgdebug: tdlgdebug;
DBG: Boolean;
Mise en œuvre
{$ R * .dfm}
Procédure tdlgdebug.mmkeyup (expéditeur: tobject; clé var: word; shift: tshiftState);
Commencer
Si key = vk_space alors commencez
re.tag: = entier (pas boolean (re.tag));
//mm.tag: = entier (pas boolean (mm.tag));
// Si booléen (mm.tag) alors rouge.uspennd
// else red.resume;
fin;
fin;
Procédure Deb (themsg: String);
Si ce n'est pas DBG, sortez;
avec dlgdebug do commence // de débogage d'informations
Chronologie;
re.selattributes.color: = selColor;
re.paragraph.firsTindent: = indent;
re.lines.add (themsg);
//mm.lines.add(themsg);
fin;
fin;
Procédure Deb (themsg: entier);
Commencer
Si ce n'est pas DBG, sortez;
avec dlgdebug do commence // de débogage d'informations
Chronologie;
re.selattributes.color: = selColor;
re.paragraph.firsTindent: = indent;
re.lines.add (intToStr (themSG));
//mm.lines.add(intToStr(Themsg));
fin;
fin;
Procédure Deb (const thestr: string; const args: array of const);
Commencer
Si ce n'est pas DBG, sortez;
avec dlgdebug do commence // de débogage d'informations
Chronologie;
re.selattributes.color: = selColor;
re.paragraph.firsTindent: = indent;
re.lines.add (format (thestr, args));
//mm.lines.add(format(thestr, args));
fin;
fin;
Procédure tdlgdebug.Timeline;
Commencez par re commence
Paragraph.FirsStindent: = 0;
Selattributes.color: = craix;
lines.add (formatDateTime (LongtimeFormat, Now));
fin;
Procédure tdlgDebug.formCreate (Sender: TObject);
Commencer
INDENT: = 10;
selColor: = Clyellow;
fin;
fin.
// ▓▓▓▓▓▓▓▓▓▓▓▓ hookprj.dpr
bibliothèque hookprj;
usages
Sysutils,
Classes,
Hook_u dans 'hook_u.pas';
exportations
Activerwheelhook,
DisablewheelHook;
Commencer
fin.
// ▓▓▓▓▓▓▓▓▓ hook_u.pas
UNIT HOW_U;
utilise des fenêtres, des messages, des systèmes, des boîtes de dialogue;
var hk: hhook; //
hfocus: hwnd;
BUF: Array [0..1024] de Char;
Sticle: String;
IC: octet;
Zdelta: court;
Fonction WheelHookProc (Code: entier; WParam: longInt; msg: longint): lresult;
Fonction Activer WheelHook: Boolean;
Fonction DisablewheelHook: Boolean;
Mise en œuvre
// █████████████████████████████████████████�
Fonction WheelHookProc (Code: entier; WParam: longInt; msg: longint): lresult;
Commencer
zdelta: = short (hiword (pmsg (msg) ^. wparam));
if (code = hc_action) et (pmsg (msg) ^. message = wm_mousewheel) et (ab (zdelta)> 200) alors commencez
hfocus: = getforegroundwindow;
GetWindowText (hfocus, buf, 1024);
Sticle: = String (buf);
if (pos ('mPlayerc', Stitle)> 0) ou (pos ('Media Player Classic', Stitle)> 0) alors commencez
Inc (IC);
// Appuyez une fois sur la touche latérale bleue pour générer deux messages.
// Si tous traités, il équivaut à un transfert rapide deux fois, c'est-à-dire 10 secondes
// if (ic mod 2) = 0 alors commencez
keybd_event (VK_Control, MapVirtualKey (VK_Control, 0), 0, 0);
Si zdelta> 200 alors commencez
keybd_event (vk_right, mapVirtualKey (vk_right, 0), 0, 0);
keybd_event (vk_right, mapVirtualKey (vk_right, 0), keyeventf_keyup, 0); // tout droit
fin d'autre commence
keybd_event (vk_left, mapVirtualKey (vk_left, 0), 0, 0);
keybd_event (vk_left, mapVirtualkey (vk_left, 0), keyeventf_keyup, 0); //
fin;
keybd_event (VK_Control, MapVirtualKey (VK_Control, 0), KeyEventf_KeyUp, 0); // Ctrl UP
//fin;
PMSG (msg) ^. Message: = 0; // Parce que le message de la clé latérale a été traité localement, il n'a pas à être remis à d'autres threads pour le traitement
fin d'autre résultat: = callnexthooKex (hk, code, wparam, longint (@msg)); // si ce n'est pas MPC, transmettez
fin d'autre résultat: = callnexthooKex (hk, code, wparam, longint (@msg)); // s'il ne s'agit pas de deux clés latérales bleues, passez-la
fin;
Fonction Activer WheelHook: Boolean;
Commencer
Si hk = 0 alors commencez
Hk: = setwindowshooKex (wh_getMessage, @WheelHookProc, hinstance, 0);
Résultat: = true;
fin d'autre résultat: = false;
fin;
Fonction DisablewheelHook: Boolean;
Commencer
Si hk <> 0 alors commencez
DisookwindowshooKex (HK);
Hk: = 0;
Résultat: = true;
fin d'autre résultat: = false;
fin;
fin.
QQ: 7995.7944 (Shensi Road)
Courriel: [email protected]