2

私はWindowsプログラミングに不慣れで、ほとんどがJava(Java SE、Java ME、Android、Java EE)で行われているので、詳細で穏やかです。

「デスクトップ上のファイルをクリックするように、Windowsでクリックされたファイル/パスの名前」をキャプチャしたいですか?

さらなる調査http://www.codeproject.com/Articles/6362/Global-System-Hooks-in-NETは、グローバルシステムフックを使用して座標やクリックなどのマウスイベントをキャプチャする小さなc#/c++の優れたアプリです。 、等。

では、ファイルアイコンのイベントをキャプチャする適切なAPIまたはグローバルシステムフックは何ですか?

4

1 に答える 1

4

そのレベルの詳細を提供する単一のAPIはありません。

WH_MOUSEandWH_MOUSE_LLフックSetWindowsHookEx()、またはWM_INPUTによって配信されるメッセージRegisterRawInputDevices()は、マウスが相互作用してGetCursorPos()いることを通知できます。また、関数は、クリック時にマウスカーソルが画面上のどこにあるかを通知できますが、クリックしている内容は通知できません。の上。あなたはそれを手動で理解しなければなりません。

たとえば、デスクトップはListViewコントロールとして実装されているため、WindowFromPoint()andGetDesktopWindow()関数を使用して、マウスがアプリケーションウィンドウではなくデスクトップウィンドウ自体に対応する座標にあるかどうかを確認できます。ある場合は、LVM_HITTESTandLVM_GETITEMメッセージを使用して決定します。デスクトップ上のどのアイコンをクリックして、その表示テキストを抽出します。次に、SHGetDesktopFolder()関数とIShellFolderインターフェイス、または関数を使用しSHParseDisplayName()てそのテキストを解析しPIDL、パス/ファイルを表すが返されるかどうかを確認します。返される場合は、を使用SHGetPathFromIDList()して実際のパス/ファイル名を取得します。

Windowsエクスプローラーアプリで同じことをしたい場合は、もう少し複雑になります。WindowFromPoint()、、、およびを使用してGetWindowThreadProcessId()、マウスがWindowsエクスプローラーアプリ上にあるかどうかを確認します。ただし、そのUIはWindowsバージョンから次のバージョンに変わりますが、要点は、とを介してフォーカスされたコントロールを手動で見つけ、それがTreeView / ListViewコントロールであるかどうかを確認し、そうである場合は、コントロール固有のメッセージを使用して取得する必要があるということです。マウスカーソル座標の下にあるアイテム/アイコンに関する情報をもう一度使用して、そのアイテム/アイコンのテキストが実際に何を表しているかを把握します。OpenProcess()EnumProcessModules()AttachThreadInput()GetActiveWindow()IShellFolder

シェルプログラミングは非常に複雑なシステムであり、心の弱い人が相互作用するためのものではありません。それで、あなたは自分自身に尋ねる必要があります、なぜあなたはそもそもこの情報が必要なのですか?

于 2013-01-14T22:24:56.160 に答える