[Delphiバージョン] Logitech Infinite Spirit Sable、Driver Patch-実際のマルチメディアプレーヤーの実装! QQアイコンカモフラージュプログラムが添付されています
██████████████QQアイコンカモフラージュプログラム
QQチャットウィンドウのタイトルバーで「SO-and-soとチャット」を「私のドキュメントソー」にターンし、チャットウィンドウのアイコンがWordドキュメントのアイコンとトレイのアイコンになりますまた、さまざまな状態の他のアイコンになります。たとえば、オンライン=ネットワークドライブ=フロッピーディスクドライブ、ステルス=ハードディスクドライブ、オフライン=ネットワークドライブを切断します。
変更アイコンはプログラミングを必要とせず、QQ2004のQQRES.DLLファイルを変更するだけです。
████████████LogitechInfinite Spiritセーブル、ドライバーパッチ - 本物のマルチメディアプレーヤーを実現
Logitech Infinite Spirit Minkは、Logitechによって発売された多機能ワイヤレスマウスです。名前が示すように、マルチメディアリモートコントロールです。
このマウスの最大の特徴は、多くの機能キーが埋め込まれており、スクロールホイールに加えて8つのキーがあることです。側面の2つのキーには、Logitechの多くのミッドエンドマウスが装備されています。機能は、主に上下の6つのキーがマルチメディアキーパッドを形成します。 、前方、後方、 +、 - "。さらに、スクロールホイールはクロスナビゲーションを実行できます。つまり、追加の左右のブラウジング機能があります。
しかし、実際には、マルチメディアキーの機能は本当に限られています。なぜそう言うのですか?
私が使用するメディアプレーヤーは、MPC(MS Windows Media Player Classic)です。これは、短く、簡潔で高速なスタートアップ、小さなショートカットキーです。
以下は、MPCの欠点に関する質問です。
再生/一時停止して、左ボタンまたはスペースをクリックするだけで、左ボタンがマウス上にあるため、再生/一時停止ボタンが冗長になります。
次の/前のマウスでpgup/pgdownをクリックしますが、映画やビデオクリップを視聴するときに、前または次のファイルを視聴する必要がありますか? 10分以上のビデオファイルを探している場合でも、1つを視聴した後、次のファイルを手動でクリックすることは大きな問題ではないので、これら2つのキーは不要です。
Logitechの最新のドライバーは、上記の3つのキーのカスタマイズ関数を提供していないため、マウス上の多くの機能キーを完全に使用するために、これら3つのキーを実装するために新しいコードを追加する必要がありました。また、同じマウスボタンを使用して、さまざまなアプリケーションで異なるカスタマイズ関数を実装できるようにすることもできます。
公式ドライバーセットアッププログラムを使用してセットアップします。
メディアキーの機能はキーの組み合わせです:CTRL+F4、およびズームの機能はプログラムを閉じることです(非常に効率的)。
後続のプログラムは、次の機能を実装できます(主に重要な組み合わせ):
◎mpc
閲覧:10秒間前進します。
acdsee
再生/一時停止:ctrl+del;
acd fotocanvas
再生/一時停止:ctrl+s;
netcaptor
再生/一時停止:ctrl+shift+s;
ultraedit
再生/一時停止:ctrl+s;
最後に、Logitech Infinite Spirit Minkドライバーの開発者を軽spしたいです!
マウスドライバーのコア機能は、マウスから送信される変位信号の変換と処理、およびさまざまなキーの定義や加速の処理などの問題にありますが、これらは処理と分析と比較して小さな問題です。モバイル信号。あなたは非常に多くの中から高さのマウス、特に私がRMB 360で購入したこのlingsieを作ったので、なぜもっとコードを入力してマルチメディアキーパッドにいくつかのキーを追加してカスタマイズしてみませんか。結局のところ、コンピューターはテレビ、レコーダー、VCDマシン、DVDマシン、合計オーディオではありません。より多くのアプリケーションソフトウェアで使用されます。そのため、現在の価格は400元と多数のマウスボタンで、間違いなく大きなマウスです。
Delphiのコードは次のとおりです。その中には、MPCのみがフックを使用します。これは、メディア再生ソフトウェアでは、マルチメディアキーパッドと2つのサイドキーによって生成されるメッセージがLogitechのドライバーフックによって誘ductされるためです。したがって、Logitechのフックが必要な情報をフックできないように、事前にニュースを止めるためにグローバルなフックを自分で作らなければなりません。
//▓▓▓▓▓▓▓▓▓▓▓▓retitle.dpr
プログラムリターン;
用途
フォーム、
sysutils、
窓、
'unit1.pas' {f}のunit1
dlgdebug_u in 'dlgdebug_u.pas' {dlgdebug};
{$ r *.res}
始める
Application.Initialize;
//デバッグステータス
dbg:= findcmdlineswitch( 'debug'、['/'、 ' - ']、true);
dbgの場合、dlgdebugで開始します
dlgdebug:= tdlgdebug.create(アプリケーション);
左:= getSystemMetrics(SM_CXSCREEN)-WIDTH;
TOP:= getSystemMetrics(SM_CYSCREEN)-Height-60;
終わり;
Application.CreateForm(TF、F);
application.run;
終わり。
//▓▓▓▓▓▓▓▓▓unit1.pas
ユニットユニット1;
インタフェース
用途
窓、メッセージ、sysutils、バリアント、クラス、グラフィック、コントロール、フォーム、
ダイアログ、stdctrls、extctrls、dlgdebug_u;
タイプ
tf = class(tform)
TMR:Ttimer;
手順formcreate(sender:tobject);
手順tmrtimer(sender:tobject);
手順wndproc(varメッセージ:tmessage);
プライベート
{プライベート宣言}
hfocus:hwnd;
buf:charの配列[0..1024]。
Stitle:文字列;
手順getMouseposhwndandclassname(sender:tpoint);
関数置換(S、ソース、ターゲット:文字列):文字列;
// logichi Infinite Spirity Sable
手順ダウン(VK:BYTE);
手順UP(VK:BYTE);
手順key1(vk1:byte);
手順Key2(VK1、VK2:BYTE);
手順Key3(VK1、VK2、VK3:BYTE);
公共
{公開宣言}
終わり;
var
F:TF;
const
logitech = $ 0319;
play_pause = $ e0000;
play_left = $ c0000;
play_right = $ b0000;
実装
手順EnableWheelHook;
手順disablewheelhook;
{$ 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 and not ws_ex_appwindow);
EnableWheelhook; // Lotech Lingmian Blue Side Key、wm_mousewheelメッセージフック
終わり;
手順tf.getMousePoshwndandClassName(sender:tpoint); // camouflageタイトルバー
var hwnd:thandle;
atitle:charの配列[0..255];
str:文字列;
始める
hwnd:= windowfrompoint(sender);
Boolean(getWindowText(hwnd、atitle、256))の場合、開始します
str:= string(atitle);
if((pos( 'and'、str)> 0)および(pos( 'chat'、str)> 0))から始まります
str:=交換(str、 'チャット'、 '');
str:=交換(str、 'and'、 '私のドキュメント');
setWindowText(hwnd、pchar(str));
終わり;
if((pos( 'group-'、str)> 0)または(pos( 'advanced group-'、str)> 0))から始まります
str:=交換(str、 'group-'、 '私の手紙');
str:=交換(str、 'advanced'、 '');
setWindowText(hwnd、pchar(str));
終わり;
//チャットルーム
pos( 'qqチャットルーム'、str)> 0の場合、開始します
STR:= 'Microsoft Visual C ++ 6.2';
setWindowText(hwnd、pchar(str));
終わり;
// msn
pos( ' - ダイアログ'、str)> 0の場合、開始します
str:=交換(str、 ' - ダイアログ'、「作業文書」);
setWindowText(hwnd、pchar(str));
終わり;
終わり;
終わり;
手順tf.tmrtimer(sender:tobject); //██████████████████████████████████████ █████████████████████████████████████████
var rpos:tpoint;
始める
boolean(getCursorpos(rpos))の場合、getMousePoshwndandClassName(rpos);
終わり;
関数TF.Replacing(s、source、ターゲット:文字列):文字列; //██████文字列を交換します
var Site、strlen:整数;
始める
サイト:= pos(source、s);
strlen:= length(source);
delete(s、site、strlen);
挿入(ターゲット、s、サイト);
結果:= s;
終わり;
手順tf.wndproc(var message:tmessage); ////
メッセージから始めることから始めます
継承;
//マルチメディアキーパッドの中心と右側の3つのキーが押されていない場合は、終了します
(((msg = logitech)および(lparam = play_pause)または(lparam = play_left)または(lparam = play_right)))の場合、exit;
hfocus:= getForeGroundWindow;
getWindowText(hfocus、buf、1024);
stitle:= string(buf);
Deb(Stitle);
// acdsee
if(pos( 'acdsee'、stitle)> 0)and(pos( '5.0'、stitle)> 0)and(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)and(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)and(msg = logitech)then 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)and(msg = logitech)then 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);
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(Themsg:文字列); //デバッグ情報
手順Deb(Themsg:Integer);オーバーロード;
手順Deb(const thestr: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:Boolean;
実装
{$ r *.dfm}
手順tdlgdebug.mmkeyup(sender:tobject; var key:word; shift:tshiftstate);
始める
key = vk_spaceの場合、開始します
re.tag:= integer(boolean(re.tag));
//mm.tag:= integer(boolean(mm.tag));
// boolean(mm.tag)の場合、red.suspend
// else red.resume;
終わり;
終わり;
手順deb(themsg:string);
DBGではない場合は、終了します。
dlgdebugを使用して、//デバッグ情報を開始します
タイムライン;
re.selattributes.color:= selcolor;
re.paragraph.firstindent:= indent;
re.lines.add(themsg);
//mm.lines.add(themsg);
終わり;
終わり;
手順Deb(Themsg:Integer);
始める
DBGではない場合は、終了します。
dlgdebugを使用して、//デバッグ情報を開始します
タイムライン;
re.selattributes.color:= selcolor;
re.paragraph.firstindent:= indent;
re.lines.add(inttostr(himsg));
//mm.lines.add(inttostr(themsg));
終わり;
終わり;
手順Deb(const thestr:string; const args:constの配列);
始める
DBGではない場合は、終了します。
dlgdebugを使用して、//デバッグ情報を開始します
タイムライン;
re.selattributes.color:= selcolor;
re.paragraph.firstindent:= indent;
re.lines.add(format(thestr、args));
//mm.lines.add(format(thestr、args));
終わり;
終わり;
手順tdlgdebug.timeline;
re do beginから始めます
パラグラフ。firstindent:= 0;
selattributes.color:= clred;
lines.add(formatdateTime(longtimeformat、now));
終了;
手順tdlgdebug.formcreate(sender:tobject);
始める
インデント:= 10;
selcolor:= Clyellow;
終わり;
終わり。
// hookprj.dpr
ライブラリhookprj;
用途
sysutils、
クラス、
hook_u in 'hook_u.pas';
輸出
enablewheelhook、
disablewheelhook;
始める
終わり。
// hook_u.pas
ユニットhook_u;
ウィンドウ、メッセージ、sysutils、ダイアログを使用します。
var hk:hhook; //フックハンドル値
hfocus:hwnd;
buf:charの配列[0..1024]。
Stitle:文字列;
IC:BYTE;
Zdelta:ショート;
function wheelhookproc(code:integer; wparam:longint; msg:longint):lresult;
function enablewhook:stdcall;
function disablewheelhook:stdcall;
実装
//█████████████████████████████████████████�
function wheelhookproc(code:integer; wparam:longint; msg:longint):lresult;
始める
zdelta:= short(hidword(pmsg(msg)^。wparam));
if(code = hc_action)および(pmsg(msg)^。メッセージ= 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)> 0)
Inc(ic);
//青いサイドキーを1回押して、2つのメッセージを生成します。
//すべてが処理された場合、それは2回、つまり10秒で早送りすることに相当します
// if(ic mod 2)= 0 then beginします
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); // left up
終わり;
keybd_event(vk_control、mapvirtualkey(vk_control、0)、keyeventf_keyup、0); // ctrl up
//終わり;
PMSG(MSG)^。メッセージ:= 0; //サイドキーメッセージはローカルで処理されているため、処理のために他のスレッドに引き渡す必要はありません
End Else result:= callnexthookex(hk、code、wparam、longint(@msg)); // mpcではない場合はパスダウンします
End Else result:= callnexthookex(hk、code、wparam、longint(@msg)); // 2つの青いサイドキーではない場合は、渡します
終わり;
function enablewheelhook:stdcall;
始める
HK = 0の場合、開始します
hk:= setWindowshookex(wh_getMessage、@wheelhookproc、hinstance、0);
結果:= true;
End Else result:= false;
終わり;
function disablewheelhook:stdcall;
始める
HK <> 0の場合、開始します
ushookwindowshookex(hk);
HK:= 0;
結果:= true;
End Else result:= false;
終わり;
終わり。
QQ:7995.7944(Shensi Road)
電子メール:[email protected]