[Delphi 버전] Logitech Infinite Spirit Sable, 드라이버 패치 - 실제 멀티미디어 플레이어 구현! 첨부 된 QQ 아이콘 위장 프로그램
██████████████ QQ 아이콘 위장 프로그램
QQ 채팅 창의 제목 표시 줄에서 "so-and-so"를 "내 문서와 소"로 바꾸면 채팅 창의 아이콘이 Word 문서의 아이콘이되고 트레이의 아이콘이됩니다. 또한 다른 상태의 다른 아이콘이됩니다. 예를 들어 온라인 = 네트워크 드라이브, Leave = Floppy Disk Drive, Stealth = Hardline = Offline = Distroncnect Network Drive.
변경 아이콘은 프로그래밍이 필요하지 않으며 QQRES.DLL 파일을 수정하십시오.
████████████ Logitech Infinite Spirit Sable, Driver Patch - 실제 멀티미디어 플레이어 실현
Logitech Infinite Spirit Mink는 Logitech에서 시작한 다기능 무선 마우스입니다.
이 마우스의 가장 큰 특징은 많은 기능 키가 내장되어 있으며 스크롤 휠 외에도 8 개의 키가 있다는 것입니다. 측면에있는 두 개의 키에는 Logitech의 많은 중간-고급 마우스가 장착되어 있으며, 기능은 주로 상단 및 아래쪽을 찾아 내야합니다. , 앞으로, 뒤로, +, -". 또한 스크롤 휠은 교차 내비게이션을 수행 할 수 있으므로 왼쪽 및 오른쪽 브라우징 기능이 추가됩니다.
그러나 실제로 사용하면 멀티미디어 키의 기능은 내 표준에 따라 제한되어 있습니다. 왜 그렇게 말합니까?
내가 사용하는 미디어 플레이어는 MPC (MS Windows Media Player Classic)입니다. 짧고 간결하고 빠른 시작, 소규모 자원, 풍부한 바로 가기 키이며 마우스와 키보드로 작동하기가 매우 간단합니다.
다음은 MPC의 단점에 대한 질문입니다.
재생/일시 중지하고 왼쪽 버튼이나 공간을 클릭하면 왼쪽 버튼이 마우스에 있으므로 재생/일시 정지 버튼이 중복됩니다.
다음/이전 마우스에서 PGUP/PGDOIN을 클릭하십시오. 해당 마우스는 앞으로/뒤로 이루어 지지만 영화 나 비디오 클립을 볼 때 이전 또는 다음 파일을 시청해야합니다. 10 분 이상인 비디오 파일을 찾고 있더라도 다음 파일을 시청 한 후 다음 파일을 수동으로 클릭하는 것은 큰 문제가되지 않으므로이 두 키는 불필요합니다.
Logitech의 최신 드라이버는 위의 세 가지 키에 대한 사용자 정의 기능을 제공하지 않으므로 마우스의 많은 기능 키를 최대한 활용하려면 QQ 아이콘 프로그램에 새 코드를 추가 하여이 세 가지 키를 구현해야했습니다. 또한 동일한 마우스 버튼을 사용하여 다른 응용 프로그램에서 다른 사용자 정의 기능을 구현할 수 있습니다.
공식 드라이버 설정 프로그램을 사용하여 설정하십시오.
미디어 키의 기능은 키 조합 인 Ctrl+F4이며 줌의 기능은 프로그램을 닫는 것입니다 (매우 효율적).
후속 프로그램은 다음 기능 (주로 주요 조합)을 구현할 수 있습니다.
◎mpc
찾아보기 : 10 초 동안 앞으로 나아가십시오.
Acdsee
플레이/일시 중지 : CTRL+DEL;
ACD FOTOCANVAS
플레이/일시 중지 : CTRL+S;
netcaptor
플레이/일시 중지 : ctrl+shift+s;
◎ Ultraedit
플레이/일시 중지 : ctrl+s; ctrl+f6;
마지막으로 Logitech Infinite Spirit Mink 운전자의 개발자를 멸시하고 싶습니다!
마우스 드라이버의 핵심 기능은 마우스에서 전송 된 변위 신호의 변환 및 처리에 있으며 다양한 키의 정의 및 가속 처리와 같은 문제이지만 이는 처리 및 분석과 비교하여 작은 문제입니다. 모바일 신호. 당신이 너무 많은 중간에서 높은 엔드 마우스, 특히 내가 RMB 360에서 구입 한이 링 사이를 만들었으므로, 더 많은 코드를 입력하고 멀티미디어 키패드에 몇 개의 키를 추가하여 사용자 정의하십시오. 결국, 컴퓨터는 TV, 레코더, VCD 머신, DVD 머신, 결합 된 오디오가 아닙니다. 멀티미디어 기능은 대부분의 사람들이 여전히 다른 수영을 할 수있는 경우에도 사용해야합니다. 더 많은 애플리케이션 소프트웨어에 사용됩니다. 각 키는 사용자 정의 기능을 구현하므로 현재 가격은 400 위안 미만과 많은 수의 마우스 버튼을 사용하면 확실히 큰 가치 마우스입니다!
ph Delphi의 코드는 다음과 같습니다. MPC 만 고리를 사용합니다. 미디어 재생 소프트웨어에서 멀티미디어 키패드에서 생성 된 메시지와 두 사이드 키는 Logitech의 드라이버 후크에 의해 납치되기 때문입니다. 따라서 Logitech의 후크가 필요한 정보를 연결할 수 없도록 뉴스를 미리 중지하기 위해 전 세계 고리를 직접 만들어야합니다.
// ▓▓▓▓▓▓▓▓▓▓▓▓ retitle.dpr
프로그램 레티틀;
용도
형태,
sysutils,
창문,
init1 in 'init1.pas'{f},
'dlgdebug_u.pas'{dlgdebug}의 dlgdebug_u;
{$ r *.res}
시작하다
application.initialize;
// 디버그 상태
dbg : = findcmdlineswitch ( 'debug', [ '/', '-'], true);
DBG와 함께 DLGDEBUG가 시작됩니다
dlgdebug : = tdlgdebug.create (응용 프로그램);
왼쪽 : = getSystemMetrics (SM_CXSCREEN) -Width;
상단 : = getSystemMetrics (SM_CYSCREEN) -Height-60;
끝;
application.createform (tf, f);
application.run;
끝.
// ▓▓▓▓▓▓▓▓▓ init1.pas
단위 유닛 1;
인터페이스
용도
창, 메시지, 시스템, 변형, 클래스, 그래픽, 컨트롤, 양식,
대화, stdctrls, extctrls, dlgdebug_u;
유형
tf = 클래스 (tform)
TMR : TTIMER;
프로 시저 Formcreate (sender : tobject);
절차 tmrtimer (sender : tobject);
절차 wndproc (var 메시지 : tmessage);
사적인
{개인 선언}
HFOCUS : HWND;
BUF : char의 배열 [0..1024];
스티틀 : 문자열;
절차 getMousePoshwndandClassName (sender : tpoint);
함수 대체 (S, 소스, 대상 : String) : String;
// Logichi Infinite Spiritual Sable
절차 다운 (VK : 바이트);
절차 UP (VK : 바이트);
절차 key1 (vk1 : 바이트);
절차 key2 (vk1, vk2 : 바이트);
절차 KEY3 (VK1, VK2, VK3 : 바이트);
공공의
{공개 선언}
끝;
var
F : TF;
Const
logitech = $ 0319;
play_pause = $ e0000;
play_left = $ c0000;
play_right = $ b0000;
구현
절차 enable wheelhook;
절차 비활성화 휠루;
{$ r *.dfm}
절차 tf.formcreate (sender : tobject); // ██████████████████████████████ 인터페이스 초기화
시작하다
Formstyle : = fsstayontop;
높이 : = 0;
너비 : = 0;
숨다;
tmr.interval : = 50;
Showwindow (Application.Handle, SW_HIDE);
setwindowlong (Application.handle, gwl_exstyle,
getwindowlong (application.handle, gwl_exstyle) 또는 ws_ex_toolwindow가 아닌 ws_ex_appwindow);
enablewheelhook; // lotech lingmian blue side 키, wm_mousewheel message hook
끝;
절차 tf.getmouseposhwndandclassname (sender : tpoint); // 위장 제목 표시 줄
var hwnd : thandle;
Atitle : char의 배열 [0..255];
str : 문자열;
시작하다
HWND : = WindowFrompoint (발신자);
Boolean (getwindowText (hwnd, atitle, 256))가 시작되면 시작하십시오
str : = 문자열 (Atitle);
if ((pos ( 'and', ', str)> 0) 및 (pos ('chat ', str)> 0))를 시작합니다
str : = 교체 (str, '채팅', '');
str : = 대체 (str, '및', '내 문서');
setwindowText (HWND, PCHAR (str));
끝;
if ((pos ( 'group-', str)> 0) 또는 (pos ( 'Advanced Group-', str)> 0))를 시작하십시오
str : = 교체 (str, 'group-', 'my letter');
str : = 교체 (str, 'advanced', '');
setwindowText (HWND, PCHAR (str));
끝;
// 대화방
POS ( 'QQ 채팅실', str)> 0이면 시작하십시오
str : = 'Microsoft Visual C ++ 6.2';
setwindowText (HWND, PCHAR (str));
끝;
// msn
POS ( ' - Dialogue', str)> 0이면 시작하십시오
str : = 교체 (str, ' - 대화', '작업 문서');
setwindowText (HWND, PCHAR (str));
끝;
끝;
끝;
절차 tf.tmrtimer (발신자 : tobject); // ██████████████████████████████████████ █████████████████████████████████████████
var rpos : tpoint; tpoint; tpoin;
시작하다
Boolean (getCursorpos (rpos)) 인 경우 getMousePoshWndandClassName (RPO);
끝;
함수 tf.replacing (s, source, target : string) : string; // ██████ 문자열을 교체합니다
var 사이트, Strlen : 정수;
시작하다
사이트 : = pos (소스, s);
strlen : = 길이 (소스);
삭제 (s, site, strlen);
삽입 (대상, s, 사이트);
결과 : = S;
끝;
절차 tf.wndproc (var message : tmessage); /// █████████▌ logytech Infinite Spirit Mink
메시지가 시작됩니다
상속;
// 멀티미디어 키패드의 중앙과 오른쪽에있는 세 가지 키가 누르지 않으면 종료
그렇지 않은 경우 ((msg = logitech) 및 ((lparam = play_pause) 또는 (lparam = play_left) 또는 (lparam = play_right)))));
hfocus : = getforegroundwindow;
getwindowtext (Hfocus, Buf, 1024);
스티틀 : = 문자열 (buf);
Deb (Stitle);
// acdsee
if (pos ( 'acdsee', stitle)> 0) 및 (pos ( '5.0', stitle)> 0) 및 (msg = logitech) Case lparam의
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
끝;
if (pos ( 'acd', stitle)> 0) 및 (pos ( 'fotocanvas', stitle)> 0) 및 (msg = logitech) Case lparam
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
끝;
// netcaptor
if (pos ( 'netcaptor', stitle)> 0) 및 (msg = logitech) case lparam of
play_pause : key3 (vk_control, vk_shift, ord ( 's')); // ctrl+shift+s
play_left : key1 (vk_f2);
play_right : key1 (vk_f3);
끝;
// Ultraedit
if (pos ( 'ultraedit-32', stitle)> 0) 및 (msg = logitech) 사례 lparam of
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
끝;
끝;
절차 tf.down (vk : byte);
절차 tf.up (vk : byte);
절차 tf.key1 (vk1 : byte);
다운 (vk1);
UP (VK1);
끝;
절차 tf.key2 (vk1, vk2 : byte);
다운 (vk1);
다운 (vk2);
UP (VK2);
UP (VK1);
끝;
절차 tf.key3 (vk1, vk2, vk3 : byte);
다운 (vk1);
다운 (vk2);
다운 (vk3);
UP (VK3);
UP (VK2);
UP (VK1);
끝;
끝.
// dlgdebug_u.pas
{***************************************** ******** **************************************
디버깅 정보를 표시하는 데 프로그램에 사용 된 비 모달 대화 상자
2005/02
***************************************************************************************** 누군가 *********************************************** ***********
단위 DLGDEBUG_U;
Windows, 메시지, sysutils, 변형, 클래스, 그래픽, 컨트롤, 양식, 형태,
대화, stdctrls, comctrls;
절차 deb (thesg : string); // 디버그 정보
절차 deb (thesg : 정수); 과부하;
절차 deb (const theStres : string; const args : const의 배열);
유형
tdlgdebug = class (tform)
Re : trichedit;
절차 mmkeyup (sender : tobject; var key : word; shift : tshiftState);
프로 시저 Formcreate (sender : tobject);
사적인
{개인 선언}
공공의
{공개 선언}
들여 쓰기 : 바이트;
Selcolor : tcolor;
절차 타임 라인;
끝;
var dlgdebug : tdlgdebug;
DBG : 부울;
구현
{$ r *.dfm}
절차 tdlgdebug.mmkeyup (sender : tobject; var key : word; shift : tshiftState);
시작하다
key = vk_space 인 경우 시작하십시오
re.tag : = 정수 (부울이 아님 (re.tag));
//mm.tag : = 정수 (부울 아님 (mm.tag));
// 부울 (mm.tag)이면 red.suspend
// else red.resume;
끝;
끝;
절차 deb (thesg : String);
DBG가 아닌 경우 종료하십시오.
dlgdebug를 사용하여 시작 // 디버그 정보를 시작하십시오
타임 라인;
re.selattributes.color : = selcolor;
re.paragraph.firstindent : = 들여 쓰기;
re.lines.add (thesg);
//mm.lines.add(themsg);
끝;
끝;
절차 deb (thesg : 정수);
시작하다
DBG가 아닌 경우 종료하십시오.
dlgdebug를 사용하여 시작 // 디버그 정보를 시작하십시오
타임 라인;
re.selattributes.color : = selcolor;
re.paragraph.firstindent : = 들여 쓰기;
re.lines.add (inttostr (wesg));
//mm.lines.add(inttostr(themsg));
끝;
끝;
절차 deb (const theStres : string; const args : const의 배열);
시작하다
DBG가 아닌 경우 종료하십시오.
dlgdebug를 사용하여 시작 // 디버그 정보를 시작하십시오
타임 라인;
re.selattributes.color : = selcolor;
re.paragraph.firstindent : = 들여 쓰기;
re.lines.add (형식 (thestres, args));
//mm.lines.add(format(thestrest, args));
끝;
끝;
절차 tdlgdebug.Timeline;
다시 시작하여 시작하십시오
단락 - 교사 : = 0;
selattributes.color : = clred;
lines.add (FormatDateTime (지금 LongtimeFormat, Now));
끝;
절차 tdlgdebug.formcreate (발신자 : Tobject);
시작하다
들여 쓰기 : = 10;
Selcolor : = Clyellow;
끝;
끝.
// hookprj.dpr
도서관 hookprj;
용도
sysutils,
수업,
'hook_u.pas'의 hook_u;
수출
enablewheelhook,
휠 hook 비활성화;
시작하다
끝.
// hook_u.pas
단위 hook_u; 인터페이스
Windows, 메시지, sysutils, 대화 상자를 사용합니다.
var hk : hhook; // 훅 핸들 값
HFOCUS : HWND;
BUF : char의 배열 [0..1024];
스티틀 : 문자열;
IC : 바이트;
Zdelta : 짧은;
함수 wheelHookProc (코드 : 정수; WPARAM : MSG : Longint) : lresult;
기능 enablehook : 부울;
기능 비활성화 : 부울;
구현
// █████████████████████████████████████████�
함수 wheelHookProc (코드 : 정수; WPARAM : MSG : Longint) : lresult;
시작하다
zdelta : = short (hiword (pmsg (msg)^. wparam));
if (code = hc_action) 및 (pmsg (msg)^. message = wm_mousewheel) 및 (abs (zdelta)> 200)을 시작합니다
hfocus : = getforegroundwindow;
getwindowtext (Hfocus, Buf, 1024);
스티틀 : = 문자열 (buf);
if (pos ( 'mplayerc', stitle)> 0) 또는 (pos ( 'media player', stitle)> 0) 그런 다음 시작
Inc (IC);
// 두 개의 메시지가 두 개의 메시지를 생성하려면 Blue Side 키를 한 번 누르십시오.
// 모든 처리 된 경우 두 번 빠르게 전달하는 것과 같습니다. 즉, 10 초
// if (IC Mod 2) = 0이 시작됩니다
keybd_event (vk_control, mapvirtualkey (vk_control, 0), 0, 0);
zdelta> 200이면 시작하십시오
keybd_event (vk_right, mapvirtualkey (vk_right, 0), 0, 0);
keybd_event (vk_right, mapvirtualkey (vk_right, 0), keyeventf_keyup, 0); // 오른쪽
끝이 시작됩니다
keybd_event (vk_left, mapvirtualkey (vk_left, 0), 0, 0);
keybd_event (vk_left, mapvirtualkey (vk_left, 0), keyeventf_keyup, 0); // 왼쪽
끝;
keybd_event (vk_control, mapvirtualkey (vk_control, 0), keyeventf_keyup, 0); // ctrl up
//끝;
pmsg (msg)^. 메시지 : = 0; // 사이드 키 메시지가 로컬로 처리되었으므로 처리를 위해 다른 스레드에 양도 할 필요가 없습니다.
END ELSE 결과 : = CALLNEXTHOOKEX (HK, Code, WPARAM, LONGINT (@MSG)); // MPC가 아닌 경우 통과합니다.
END ELSE 결과 : = CALLNEXTHOOKEX (HK, Code, WPARAM, LONGINT (@MSG)); // 두 개의 파란색 키가 아닌 경우 전달하십시오.
끝;
기능 enable wheelhook : boolean;
시작하다
hk = 0이면 시작하십시오
hk : = setwindowshookex (wh_getmessage, @wheelhookproc, hinstance, 0);
결과 : = 참;
다른 결과 결과 : = 거짓;
끝;
기능 비활성화 : 부울;
시작하다
hk <> 0이면 시작하십시오
unhookwindowshookex (HK);
HK : = 0;
결과 : = 참;
다른 결과 결과 : = 거짓;
끝;
끝.
QQ : 7995.7944 (Shensi Road)
이메일 : [email protected]