[Delphi Version] Logitech Infinite Spirit Sable, Patch Driver - ใช้เครื่องเล่นมัลติมีเดียจริง! โปรแกรมลายพรางไอคอน QQ ที่แนบมา
██████████████โปรแกรมลายพรางไอคอน QQ
เปลี่ยน "แชทด้วย So-and-So" ในแถบชื่อเรื่องของหน้าต่างแชท QQ เป็น "เอกสารของฉัน So-and-so" และไอคอนในหน้าต่างแชทกลายเป็นไอคอนของเอกสาร Word และไอคอนในถาด ยังกลายเป็นไอคอนอื่น ๆ ในสถานะต่าง ๆ
การเปลี่ยนไอคอนไม่จำเป็นต้องมีการเขียนโปรแกรมเพียงแค่แก้ไขไฟล์ qqres.dll ของ QQ2004
████████████ Logitech Infinite Spirit Sable, Patch Driver - ตระหนักถึงผู้เล่นมัลติมีเดียที่แท้จริง
Logitech Infinite Spirit Mink เป็นเมาส์ไร้สายแบบมัลติฟังก์ชั่นที่เปิดตัวโดย Logitech
คุณลักษณะที่ใหญ่ที่สุดของเมาส์นี้คือมันมีคีย์ฟังก์ชั่นมากมายที่ฝังอยู่และนอกเหนือจากล้อเลื่อนแล้วยังมี 8 ปุ่ม ทั้งสองคีย์ที่อยู่ด้านข้างมีการติดตั้งหนูกลางถึงสูงของ Logitech และฟังก์ชั่นส่วนใหญ่จะเรียกดูขึ้นและลง , ไปข้างหน้า, ย้อนกลับ, +, -" นอกจากนี้ล้อเลื่อนสามารถดำเนินการข้ามการนำทางซึ่งหมายความว่ามีฟังก์ชั่นการท่องเว็บซ้ายและขวาเพิ่มเติม
แต่ในการใช้งานจริงฟังก์ชั่นของคีย์มัลติมีเดียนั้นมี จำกัด จริงๆ ทำไมคุณถึงพูดอย่างนั้น?
เครื่องเล่นสื่อที่ฉันชอบคือ MPC (MS Windows Media Player Classic)
ต่อไปนี้เป็นคำถามเกี่ยวกับข้อบกพร่องของ MPC:
เพียงแค่เล่น/หยุดชั่วคราวและคลิกปุ่มซ้ายหรือพื้นที่และปุ่มซ้ายอยู่บนเมาส์ดังนั้นปุ่มเล่น/หยุดชั่วคราวจะซ้ำซ้อน
คลิก PGUP/PGDOWN ในรายการถัดไป/ก่อนหน้า แม้ว่าคุณกำลังมองหาไฟล์วิดีโอที่ใช้เวลานานกว่า 10 นาที แต่ก็ไม่ใช่ปัญหาใหญ่ที่จะคลิกที่ไฟล์ถัดไปด้วยตนเองหลังจากดูไฟล์ดังนั้นคีย์ทั้งสองนี้จึงไม่จำเป็น
ไดรเวอร์ล่าสุดของ Logitech ไม่ได้ให้ฟังก์ชั่นการปรับแต่งสำหรับสามคีย์ข้างต้นดังนั้นเพื่อใช้ประโยชน์จากปุ่มฟังก์ชั่นจำนวนมากบนเมาส์ฉันต้องเพิ่มรหัสใหม่ลงในโปรแกรม QQ เพื่อใช้ฟังก์ชันการปรับแต่งทั้งสามนี้ และยังสามารถเปิดใช้งานปุ่มเมาส์เดียวกันเพื่อใช้ฟังก์ชั่นการปรับแต่งที่แตกต่างกันในแอปพลิเคชันที่แตกต่างกัน
ใช้โปรแกรมการตั้งค่าไดรเวอร์อย่างเป็นทางการเพื่อตั้งค่า:
ฟังก์ชั่นของคีย์สื่อคือการผสมผสานคีย์: Ctrl+F4 และฟังก์ชั่นของการซูมคือการปิดโปรแกรม (มีประสิทธิภาพมาก)
โปรแกรมที่ตามมาสามารถใช้ฟังก์ชั่นต่อไปนี้ (ส่วนใหญ่เป็นการรวมคีย์):
◎mpc
เรียกดู: ไปข้างหน้าเป็นเวลา 10 วินาที;
◎ acdsee
Play/Pause: Ctrl+Del;
◎ ACD fotocanvas
Play/Pause: Ctrl+S;
◎ netcaptor
Play/Pause: Ctrl+Shift+S;
◎ UltraEdit
Play/Pause: Ctrl+S;
ในที่สุดฉันต้องการดูถูกนักพัฒนาของไดรเวอร์ Mink Spirit Mink ของ Logitech!
ฟังก์ชั่นหลักของไดรเวอร์เมาส์อยู่ในการแปลงและการประมวลผลสัญญาณการเคลื่อนที่ที่ส่งมาจากเมาส์รวมถึงปัญหาเช่นคำจำกัดความของคีย์ต่างๆและการประมวลผลการเร่งความเร็ว แต่สิ่งเหล่านี้เป็นปัญหาเล็ก ๆ น้อย ๆ เมื่อเทียบกับการประมวลผลและการวิเคราะห์ของ สัญญาณมือถือ เนื่องจากคุณสร้างหนูกลางถึงสูงจำนวนมากโดยเฉพาะอย่างยิ่ง lingsie ตัวนี้ฉันซื้อสำหรับ RMB 360 ทำไมคุณไม่พิมพ์รหัสเพิ่มเติมและเพิ่มปุ่มสองสามปุ่มในปุ่มกดมัลติมีเดียเพื่อปรับแต่ง ท้ายที่สุดคอมพิวเตอร์ไม่ใช่ทีวีเครื่องบันทึกเครื่อง VCD เครื่องจักรดีวีดีเครื่องรวมเสียง ... ฟังก์ชั่นมัลติมีเดียเป็นเพียงส่วนหนึ่งของฟังก์ชั่นของคอมพิวเตอร์ ใช้ในซอฟต์แวร์แอปพลิเคชันเพิ่มเติม
รหัสของ██████████ Delphi มีดังนี้ซึ่งมีเพียง MPC เท่านั้นที่ใช้ hooks เพราะในซอฟต์แวร์การเล่นสื่อข้อความที่สร้างโดยปุ่มกดมัลติมีเดียและปุ่มสองด้านถูกลักพาตัวโดยตะขอไดรเวอร์ของ Logitech ดังนั้นฉันต้องสร้างตะขอทั่วโลกเพื่อหยุดข่าวล่วงหน้าเพื่อให้ตะขอของ Logitech ไม่สามารถขอข้อมูลที่ฉันต้องการได้
// ▓▓▓▓▓▓▓▓▓▓▓▓ retitle.dpr
โปรแกรม retitle;
ใช้
แบบฟอร์ม
Sysutils
หน้าต่าง
UNIT1 ใน 'UNIT1.PAS' {F}
dlgdebug_u ใน 'dlgdebug_u.pas' {dlgdebug};
{$ 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;
จบ.
// ▓▓▓▓▓▓▓▓▓ UNIT1.PAS
บทที่หน่วย 1;
ส่วนต่อประสาน
ใช้
Windows, ข้อความ, sysutils, ตัวแปร, คลาส, กราฟิก, การควบคุม, รูปแบบ,
กล่องโต้ตอบ, stdctrls, extctrls, dlgdebug_u;
พิมพ์
tf = คลาส (tform)
TMR: ttimer;
โพรซีเดอร์แบบฟอร์ม (ผู้ส่ง: tobject);
ขั้นตอน tmrtimer (ผู้ส่ง: tobject);
โพรซีเดอร์ WNDPROC (ข้อความ var: tmessage);
ส่วนตัว
{ประกาศส่วนตัว}
HFOCUS: HWND;
buf: อาร์เรย์ [0..1024] ของถ่าน;
Stitle: String;
ขั้นตอน getMousePoshwndandclassName (ผู้ส่ง: tpoint);
การแทนที่ฟังก์ชั่น (s, แหล่งที่มา, เป้าหมาย: สตริง): สตริง;
// logichi sable จิตวิญญาณที่ไม่มีที่สิ้นสุด
ขั้นตอนลง (VK: ไบต์);
ขั้นตอนขึ้น (VK: BYTE);
ขั้นตอน KEY1 (VK1: BYTE);
ขั้นตอน KEY2 (VK1, VK2: BYTE);
ขั้นตอน KEY3 (VK1, VK2, VK3: BYTE);
สาธารณะ
{ประกาศสาธารณะ}
จบ;
วาจา
F: TF;
const
logitech = $ 0319;
play_pause = $ e0000;
play_left = $ c0000;
play_right = $ b0000;
การดำเนินการ
ขั้นตอน enablewheelhook;
ขั้นตอน DisableWheelHook;
{$ r *.dfm}
โพรซีเดอร์ tf.formcreate (ผู้ส่ง: 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 key, wm_mousewheel hook
จบ;
ขั้นตอน tf.getmouseposhwndandclassname (ผู้ส่ง: tpoint); // ████ชื่อชื่อลายพราง
var hwnd: thandle;
Atitle: Array [0..255] ของ Char;
Str: String;
เริ่ม
hwnd: = windowfrompoint (ผู้ส่ง);
ถ้าบูลีน (getWindowText (hwnd, atitle, 256)) จากนั้นเริ่มต้น
str: = สตริง (atitle);
if ((pos ('และ', str)> 0) และ (pos ('แชท', str)> 0)) จากนั้นเริ่มต้น
str: = การแทนที่ (str, 'แชท', '');
str: = การแทนที่ (str, 'และ', 'เอกสารของฉัน');
setWindowText (hwnd, pchar (str));
จบ;
if ((pos ('กลุ่ม-', str)> 0) หรือ (pos ('กลุ่มขั้นสูง-', str)> 0)) จากนั้นเริ่มต้น
str: = การแทนที่ (str, 'กลุ่ม-', 'ตัวอักษรของฉัน');
str: = การแทนที่ (str, 'ขั้นสูง', '');
setWindowText (hwnd, pchar (str));
จบ;
// ห้องสนทนา
ถ้า POS ('QQ Chat Room', str)> 0 แล้วเริ่มต้น
str: = 'Microsoft Visual C ++ 6.2';
setWindowText (hwnd, pchar (str));
จบ;
// msn
ถ้า pos (' - บทสนทนา', str)> 0 แล้วเริ่มต้น
str: = การแทนที่ (str, ' - บทสนทนา', 'เอกสารการทำงาน');
setWindowText (hwnd, pchar (str));
จบ;
จบ;
จบ;
ขั้นตอน tf.tmrtimer (ผู้ส่ง: tobject); // ██████████████████████████████████████ █████████████████████████████████████████
var rpos: tpoint;
เริ่ม
ถ้าบูลีน (getCursorpos (RPOS)) จากนั้น getMousePoshwndandClassName (RPOS);
จบ;
ฟังก์ชั่น tf.replacing (s, แหล่งที่มา, เป้าหมาย: สตริง): สตริง; // ██████แทนที่สตริง
var site, strlen: จำนวนเต็ม;
เริ่ม
ไซต์: = pos (แหล่งที่มา, s);
strlen: = ความยาว (แหล่งที่มา);
ลบ (s, ไซต์, strlen);
แทรก (เป้าหมาย, s, ไซต์);
ผลลัพธ์: = s;
จบ;
ขั้นตอน tf.wndproc (ข้อความ var: tmessage); //// █████████▌logytech Infinite Spirit Mink
เริ่มต้นด้วยข้อความเริ่มต้น
สืบทอด;
// ถ้าสามปุ่มที่อยู่ตรงกลางและขวาของปุ่มกดมัลติมีเดียจะไม่ถูกกดออกจาก
ถ้าไม่ใช่ ((msg = logitech) และ ((lparam = play_pause) หรือ (lparam = play_left) หรือ (lparam = play_right))) จากนั้นออกจาก;
hfocus: = getforegroundwindow;
GetWindowText (HFOCUS, BUF, 1024);
Stitle: = String (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 ของ
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) จากนั้น case lparam ของ
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);
ขึ้น (vk1);
จบ;
ขั้นตอน TF.KEY2 (VK1, VK2: BYTE);
ลง (VK1);
ลง (VK2);
ขึ้น (VK2);
ขึ้น (vk1);
จบ;
ขั้นตอน TF.KEY3 (VK1, VK2, VK3: BYTE);
ลง (VK1);
ลง (VK2);
ลง (VK3);
ขึ้น (VK3);
ขึ้น (VK2);
ขึ้น (vk1);
จบ;
จบ.
// ▓▓▓▓▓▓▓▓▓▓▓▓ dlgdebug_u.pas
{********************************************************* ******** *****************************************
กล่องโต้ตอบที่ไม่ใช่โมดอลที่ใช้ในโปรแกรมเพื่อแสดงข้อมูลการดีบัก
2005/02
******************************************************** ******* ******************************************************* *****
UNIT DLGDEBUG_U;
ใช้ windows, ข้อความ, sysutils, ตัวแปร, คลาส, กราฟิก, การควบคุม, รูปแบบ,
กล่องโต้ตอบ, stdctrls, comctrls;
ขั้นตอน DEB (Themsg: String);
ขั้นตอน deb (Themsg: จำนวนเต็ม); โอเวอร์โหลด;
ขั้นตอน deb (const thestr: string; const args: อาร์เรย์ของ const);
พิมพ์
tdlgdebug = คลาส (tform)
Re: TRICHEDIT;
โพรซีเดอร์ mmkeyup (ผู้ส่ง: tobject; var key: word; shift: tshiftstate);
โพรซีเดอร์แบบฟอร์ม (ผู้ส่ง: tobject);
ส่วนตัว
{ประกาศส่วนตัว}
สาธารณะ
{ประกาศสาธารณะ}
เยื้อง: ไบต์;
Selcolor: tcolor;
ไทม์ไลน์ขั้นตอน;
จบ;
var dlgdebug: tdlgdebug;
DBG: บูลีน;
การดำเนินการ
{$ r *.dfm}
โพรซีเดอร์ tdlgdebug.mmkeyup (ผู้ส่ง: 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 (Themsg: String);
ถ้าไม่ใช่ DBG ออกจาก;
ด้วย dlgdebug do เริ่มต้น // debug ข้อมูล
ไทม์ไลน์;
re.selattributes.color: = Selcolor;
re.paragraph.firstindent: = เยื้อง;
re.lines.add (Themsg);
//mm.lines.add(themsg);
จบ;
จบ;
ขั้นตอน deb (Themsg: จำนวนเต็ม);
เริ่ม
ถ้าไม่ใช่ DBG ออกจาก;
ด้วย dlgdebug do เริ่มต้น // debug ข้อมูล
ไทม์ไลน์;
re.selattributes.color: = Selcolor;
re.paragraph.firstindent: = เยื้อง;
re.lines.add (inttoStr (Themsg));
//mm.lines.add(inttoStr(themsg));
จบ;
จบ;
ขั้นตอน deb (const thestr: string; const args: อาร์เรย์ของ const);
เริ่ม
ถ้าไม่ใช่ DBG ออกจาก;
ด้วย dlgdebug do เริ่มต้น // debug ข้อมูล
ไทม์ไลน์;
re.selattributes.color: = Selcolor;
re.paragraph.firstindent: = เยื้อง;
re.lines.add (รูปแบบ (thestr, args));
//mm.lines.add(format( Thest, args));
จบ;
จบ;
ขั้นตอน tdlgdebug.timeline;
เริ่มต้นด้วยการเริ่มต้นใหม่
ย่อหน้าที่ห้า: = 0;
Selattributes.Color: = clred;
lines.add (FormatDateTime (LongTimeFormat ตอนนี้));
สิ้นสุด;
ขั้นตอน tdlgdebug.formcreate (ผู้ส่ง: tobject);
เริ่ม
เยื้อง: = 10;
Selcolor: = clyellow;
จบ;
จบ.
// ▓▓▓▓▓▓▓▓▓▓▓▓ hookprj.dpr
Library hookprj;
ใช้
Sysutils
ชั้นเรียน
hook_u ใน 'hook_u.pas';
การส่งออก
เปิดใช้งาน wheelhook
disablewheelhook;
เริ่ม
จบ.
// ▓▓▓▓▓▓▓▓▓ hook_u.pas
hook_u หน่วย;
ใช้ windows, ข้อความ, sysutils, กล่องโต้ตอบ;
var hk: hhook; // hand handle ค่า
HFOCUS: HWND;
buf: อาร์เรย์ [0..1024] ของถ่าน;
Stitle: String;
IC: ไบต์;
Zdelta: สั้น;
ฟังก์ชั่น WheelHookProc (รหัส: จำนวนเต็ม; WPARAM: Longint; MSG: Longint): LRESULT;
ฟังก์ชั่น enablewheelhook: บูลีน;
ฟังก์ชั่น disablewheelhook: บูลีน;
การดำเนินการ
//
ฟังก์ชั่น WheelHookProc (รหัส: จำนวนเต็ม; WPARAM: Longint; MSG: Longint): LRESULT;
เริ่ม
zdelta: = สั้น (hiword (pmsg (msg)^. wparam));
if (code = hc_action) และ (pmsg (msg)^. message = wm_mousewheel) และ (abs (zdelta)> 200) จากนั้นเริ่มต้น
hfocus: = getforegroundwindow;
GetWindowText (HFOCUS, BUF, 1024);
Stitle: = String (buf);
if (pos ('mplayerc', stitle)> 0) หรือ (pos ('Media Player Classic', stitle)> 0) จากนั้นเริ่มต้น
Inc (IC);
// กดปุ่ม Blue Side หนึ่งครั้งเพื่อสร้างสองข้อความ
// ถ้าประมวลผลทั้งหมดมันจะเทียบเท่ากับการส่งต่ออย่างรวดเร็วสองครั้งนั่นคือ 10 วินาที
// ถ้า (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_righ
จุดเริ่มต้นเริ่มต้น
keybd_event (vk_left, mapvirtualkey (vk_left, 0), 0, 0);
keybd_event (vk_left, mapvirtualkey (vk_left, 0), keyeventf_keyup, 0); // left up
จบ;
keybd_event (vk_control, mapvirtualkey (vk_control, 0), keyeventf_keyup, 0); // ctrl up
//จบ;
pmsg (msg)^. ข้อความ: = 0; // เนื่องจากข้อความสำคัญด้านข้างได้รับการประมวลผลในเครื่องไม่จำเป็นต้องส่งไปยังเธรดอื่น ๆ สำหรับการประมวลผล
ผลลัพธ์อื่น ๆ : = callnexthookex (hk, code, wparam, longint (@msg)); // ถ้าไม่ใช่ MPC ให้ส่งผ่านลง
ผลลัพธ์อื่น ๆ : = callnexthookex (hk, code, wparam, longint (@msg)); // ถ้าไม่ใช่ปุ่มด้านสีน้ำเงินสองปุ่มให้ส่งผ่านลงไป
จบ;
ฟังก์ชั่น enablewheelhook: บูลีน;
เริ่ม
ถ้า hk = 0 แล้วเริ่มต้น
HK: = SetWindowShookex (wh_getMessage, @wheelhookproc, Hinstance, 0);
ผลลัพธ์: = จริง;
ท้ายผลลัพธ์อื่น: = false;
จบ;
ฟังก์ชั่น disablewheelhook: บูลีน;
เริ่ม
ถ้าฮ่องกง <> 0 เริ่ม
UNHOOKWINDOWSHOOKEX (HK);
HK: = 0;
ผลลัพธ์: = จริง;
ท้ายผลลัพธ์อื่น: = false;
จบ;
จบ.
QQ: 7995.7944 (ถนน Shensi)
อีเมล: [email protected]