============================================================================= MXHook.dll Ver.3.4 by [主]@[またーり] Web: http://mypage.odn.ne.jp/home/ysoft =============================================================================  ※これはWinMX補助ツールの開発者向けのモジュールです。  ※一般ユーザーには何の役にも立ちません。 [モジュールの概要]   ・このモジュールはWinMX3.Xのオーナードローかつ仮想リストコントロールから    任意のアイテムを取得する機能を提供します。   ・WinMXのテキスト描画をフックし、任意に色を設定することを可能にします。 [モジュールの使用条件]   ・このモジュールはフリーですが、ツールで使用するには以下の条件に同意する    必要があります。1つでも同意いただけない場合は使用を許可できません。    同意いただけるのならば、ツールと共に再配布することが可能です。     1.組み込むツールのバージョン情報、及びReadmeまたはヘルプなどの付属       ドキュメントに本モジュールを使用していることを明記する。       (最低でも「MXHook.dll」と「[主]@[またーり]」を含めること。)       (バージョン情報には GetMXHookLicenseText() の使用を推奨する。 )     2.「MXHook.dll」のファイル名を一切変更せずに使用、再配布すること。     3.WinMXの補助ツールに組み込み、共に配布する目的のみに使用すること。     4.ツールの製作者の責任においてのみ使用すること。       (モジュール製作者[主]@[またーり]にいかなる責任も求めない。)   ・以上4つの条件に同意頂けた場合にのみ、使用及び再配布を許可いたします。 [モジュールの仕様]   ・このモジュールはWin32APIのみを使用したDLLとして提供されています。   ・ツールに組み込むには、ツールのソース中で「MXHook.h」をインクルードし、    「MXHook.lib」をリンクしてください。    (関数名を用いて動的にDLLをロードする場合は「MXHook.lib」は不要です。)   ・WinMXのリストコントロールのアイテム情報はWindowメッセージとして指定した    ウィンドウに送信されます。   ・テキスト描画のフックもメッセージとしてホスト(ツール)に通知されます。   ・このモジュールでWinMXにフックを仕掛けたプロセスは、全てのWinMXのプロセス    が終了するまでは、終了することは出来ません。   ・WinMXのプロセスであるかどうかはモジュールのファイル名(WinMX.exe)で判断    していますので、WinMXのファイル名が変更されていると動作しません。 [関数リファレンス] ――――――――――――――――――――――――――――――――――――――   void InstallMXHook(void);   [引数]なし   [戻値]なし   ・WinMXへのフックを開始します。    このモジュールの関数を使用する前に、ツールのプロセス内から一度だけ実行    してください。 ――――――――――――――――――――――――――――――――――――――   void RemoveMXHook(void);   [引数]なし   [戻値]なし   ・WinMXへのフックを解除します。    InstallMXHook()を実行したツールを終了する前に一度だけ実行してください。    WinMXのプロセスが1つでも起動している場合にこの関数を実行するとWinMXが    異常終了します。ですのでGetMXLoadNum()で0が帰ってくるようになってから    RemoveMXHook()を実行するようにしてください。   ――――――――――――――――――――――――――――――――――――――   int GetMXListItem(HWND hHost, HWND hTarget, int iItem, int iSubItem);   [引数]     hHost  :アイテム情報を受け取るウィンドのハンドル     hTarget :アイテム情報を取得するWinMXのリストコントロールのハンドル     iItem  :取得するアイテムのインデックス(行)     iSubItem :取得するアイテムのサブインデックス(列)   [戻値]     ・iItem で -1 を指定した場合:   取得したアイテムの行数(総数)     ・iItem で -1 以外を指定した場合: 取得したアイテムのインデックス     ・アイテムの取得に失敗した場合は -1 が返ります。   ・hTarget で指定したリストコントロールからアイテム情報を取得します。    この関数を呼び出し、戻るまでの間にアイテム情報がメッセージとして hHost    に送られて来ます。(メッセージハンドラは下記及びMSDNのWM_COPYDATAを参照)    メッセージ :WM_COPYDATA    wParam    :hTarget で指定したハンドル(HWND)    lParam   :コピーデータへのポインタ (PCOPYDATASTRUCT)    PCOPYDATASTRUCT のメンバ      dwData :アイテム情報の識別子  (= MXHOOK_MXLISTITEM)      cbData :アイテム情報のサイズ  (バイト)      lpData :アイテム情報へのポインタ(PMXLISTITEMDATA)    PMXLISTITEMDATA のメンバ      hDC   :リストコントロールのデバイスコンテキスト(HDC)      Rect  :アイテムの外形領域    (RECT)      Col   :アイテムの色       (COLORREF)      wItem  :アイテムのインデックス  (WORD)      wSubItem:アイテムのサブインデックス(WORD)      szText :アイテムの文字列     (TCHAR[])   ・アイテムのインデックスとサブインデックスは空欄も含んだインデックスが    返ってきます。(インデックスは完全にリストコントロールの仕様に準拠)    なお、ユーザーによって列の順序が変更されている場合でもオリジナルの    サブインデックスが返ってきます。   ・iItem と iSubItem で指定したアイテムだけを取得することが出来ます。    -1 を指定すると全てのアイテムを取得します。    [例1]全てのアイテムを取得する     iItme = -1; iSubItem = -1;    [例2]全ての行の最初の列だけを取得する iItme = -1; iSubItem = 0;    [例3]2行目だけを取得する場合     iItme = 1; iSubItem = -1;    [例4]3行目の2列目だけを取得する場合 iItme = 2; iSubItem = 1;   ・iItemでリストコントロールの行数を超えた値を指定すると関数は失敗します。    iSubItem でリストコントロールの列数を超えた値を指定したときの戻り値は    不定です。(メッセージが来ない場合もあります。)   ・アイテム情報取得ハンドラ中から SetHookerWnd(NULL) を実行することにより    アイテム情報の取得をそこで終了することが出来ます。   ・この関数はWinMXが最小化状態や他のウィンドウの背面にあるときでも正常に    動作します。   ・リストアイテムをサーチするときは出来るだけ全てのアイテムを取得してから    検索するようにしてください。iItme 、iSubItem にそれぞれインデックスを    設定して1アイテムずつ検索するとパフォーマンスが低下します。   ・必ず PCOPYDATASTRUCT の dwData メンバが MXHOOK_MXLISTITEM であるか    チェックしてから処理を行ってください。描画フックのメッセージと混同する    恐れがあります。 ――――――――――――――――――――――――――――――――――――――   void SetHookerWnd(HWND hWnd);   [引数]hWnd :アイテム情報を受け取るウィンドのハンドル   [戻値]なし   ・アイテム情報取得ハンドラの中から呼び出して情報取得を終了するときにのみ    使用します。(hWnd に NULL を指定して呼び出す。) ――――――――――――――――――――――――――――――――――――――   DWORD GetMXLoadNum(void);   [引数]なし   [戻値]フックしているWinMXのプロセス数   ・RemoveMXHook() 実行してツールを終了するときは必ずこの関数を呼び出して    WinMXのプロセス数が 0 であることを確認してから終了してください。   ・まだWinMXが起動しているときにツールを終了しようとするとユーザーに注意を    促すか、ツールを非表示にして、タイマーでこの関数を監視し、0 が返るまで    待ってから終了するなどの対策をとって下さい。 ――――――――――――――――――――――――――――――――――――――   void GetMXHookLicenseText(LPSTR lpszText);   [引数]lpszText :ライセンス情報を受け取るバッファ   [戻値]なし   ・このモジュールのライセンス情報の文字列を取得します。    バッファには最低 64 バイトは用意してください。     ・以下のようなフォーマットの文字列が返ります    "MXHook.dll Ver.3.3 Licensed by [主]@[またーり]"   ・モジュールを使用するツールのバージョン情報で使用することを推奨します。 ――――――――――――――――――――――――――――――――――――――   void SetDrawHookerWnd(HWND hWnd);   [引数]hWnd :描画フックの情報を受け取るウィンドウのハンドル   [戻値]なし   ・WinMXへのテキスト描画フックを開始します。   ・hWnd に NULL を指定することでいつでも描画フックの解除が出来ます。   ・描画フックを開始するとWinMXでテキストの描画が発生する度に hWnd で指定    したウィンドウに描画に関する情報がメッセージとして送られて来ます。   ・このメッセージハンドラの中から SetDrawHookColor() を呼び出すことで    テキストの描画色を設定します。(変更しないときは呼び出す必要はない。)    メッセージ :WM_COPYDATA    wParam    :描画を行おうとしているウィンドウのハンドル(HWND)    lParam   :コピーデータへのポインタ (PCOPYDATASTRUCT)    PCOPYDATASTRUCT のメンバ      dwData :アイテム情報の識別子  (= MXHOOK_DRAWHOOK)      cbData :アイテム情報のサイズ  (バイト)      lpData :アイテム情報へのポインタ(PMXLISTITEMDATA)    PMXLISTITEMDATA のメンバ      hDC   :リストコントロールのデバイスコンテキスト(HDC)      Rect  :アイテムの外形領域    (RECT)      Col   :アイテムの色       (COLORREF)      wItem  :不使用(常に 0 )      wSubItem:不使用(常に 0 )      szText :アイテムの文字列     (TCHAR[])   ・必ず PCOPYDATASTRUCT の dwData メンバが MXHOOK_DRAWHOOK であるかを    チェックしてから処理を行ってください。リストアイテム情報取得の    メッセージと混同する恐れがあります。 ――――――――――――――――――――――――――――――――――――――   void SetDrawHookColor(COLORREF Col);   [引数]Col :テキストの描画色   [戻値]なし   ・描画フックのメッセージハンドラの中から呼び出すことでテキストの描画色を    設定します。(それ以外の場所から呼び出しても何も機能しません。)   ・描画色を変更しないときはこの関数を呼び出す必要はありません。 ――――――――――――――――――――――――――――――――――――――   ・これら以外の関数もエクスポートされていますが、将来の拡張及びデバッグ用    ですので、使用しないで下さい。WinMXの動作に影響を及ぼすことがあります。 [サンプルプログラム]   ・このモジュールを使用したツールとそのソースを添付しています。   ・モジュールの使用方法を理解するためにぜひ目を通すことをお勧めします。   ・なお、サンプルプログラムは自由にして頂いても構いません。 [サポート等について]   ・最新版の配布、技術的な相談等は以下の場所で行っています。    WinMX3.X WPNチャット「2ch専用[またーり]」部屋公式ページ      http://mypage.odn.ne.jp/home/ysoft    WinMX3.X WPNチャット「2ch専用[またーり]」部屋(チャット)   ・このモジュールは不定期にバージョンアップされる可能性があります。   ・出来る限りバグ修正に努めますが、作者はその義務を負わないものとします。   ・機能の要望等も参考にはしますが、必ず採用するとは限りません。 [著作権等について]   ・このモジュールの著作権は[主]@[またーり]にあります。   ・よって使用条件に同意した場合にのみ本モジュールの使用を許可いたします。   ・使用条件に基づき、開発した補助ツールの著作権はそのツールの作者にあります。   ・本モジュールのリバースエンジニアリングは禁止します。(ソースは非公開です。)    (ツールのデバッグの範囲を超えない場合は許可します。) [配布及び転載について]   ・配布はいかなる手段においてもパッケージの内容を変更しない限り完全に自由です。   ・出来る限り最新版を配布するように心がけてください。   ・本モジュールを使用したツール等の配布条件はそのツールの配布条件によります。   ・使用条件に同意し、かつ完全に動作する形のツールに添付する場合のにみ再配布    (ツールのパッケージに含めての配布)が可能です。   ・このモジュール、及びそれを使用したツール等を雑誌等に掲載及び収録する場合、    [主]@[またーり]の許可を得る必要はありません。 [更新履歴]   2002/08/09 Ver.3.31 → 3.4     ・インデックスが元のリストコントロールと完全に一致するように仕様変更。      これにより空欄があっても列がずれないようになった。     ・列方向のアイテムが重複する不具合を修正。     ・アイテム情報取得時のちらつきを完全に克服した。     ・アイテム情報取得時のパフォーマンスの改善。   2002/08/08 Ver.3.3 → 3.31     ・WinMXの転送ウィンドウのリストコントロールのアイテムが複数行に分割される      不具合を修正。   2002/10/08 Ver.3.2 → 3.3     ・描画フックでテキストの描画色を変える機能を提供。      SetDrawHookerWnd()、SetDrawHookColor() 関数を追加。     ・それに伴いメッセージの PCOPYDATASTRUCT の dwData メンバの仕様を変更。      ホストハンドルからアイテム情報の識別子に変更。(MXHOOK_XXXXXXXXXX)     ・リストコントロールのアイテム情報取得時のパフォーマンスを若干改善。 2002/10/09 [主]@[またーり]