例えばデスクトップのアイコンをシングルクリックした時、
あるいはマウスメッセージ自体のイベントを取得するにはどうしたら良いのでしょうか?
一応
HWND hWnd = GetDesktopWinodow()
でデスクトップのハンドルを取得し、デバッグモードでhWndをみた所、0x00010014が
入ってました。
これをスパイで検索してメッセージログを見ようとした所、
「指定のウィンドウはスパイできません。Windowsは、このウィンドウに関するメッセー
ジストリームへのアクセスを許しません。」と出てしまいます。
考えられるやり方としてデスクトップをSetWindowLongPtr()でサブクラス化してしまい、
新たにセットしたウィンドウ関数からメッセージを取得すればいいかとも思ったのです
が、これってやってもいいのでしょうか?
とりあえず欲しい機能はアイコンのクリックとその対象アイコンのファイル名(アイコン
自体のファイル名じゃないですよ)の取得という機能です。
・・・ドラッグアンドドロップは簡単なんですけどね。
SunPacさんが言うデスクトップは、
GetDesktopWindow()が返すハンドルが指すものとは異なると思います。
Spy++でウィンドウのツリーを表示し、
メニューから[検索]-[ウィンドウの検索]から
ファインダーツールを使ってデスクトップに照準を合わせてください。
GetDesktopWindow()が返すハンドルが指すウィンドウとは異なるものが
検索されるはずです。
おや?
スパイ++でもツールバーのウンドウボタンを押して表示される一番上のデスクトップの
ハンドルは00010014となっておりますよ。
・・・どうなっているのでしょう?
では逆にGetDesktopWindow()の返り値は何なのでしょうか?
おっと、書き忘れましたが環境はVC6++Sp5でMFCは使っておりません。
> ・・・どうなっているのでしょう?
> では逆にGetDesktopWindow()の返り値は何なのでしょうか?
>
この件については以前から私も疑問に思っていることで、
色々ネットで検索をしてみたこともあるのですが、
明確に記述されたドキュメントは見つけられませんでした・・・。
例えば色々なアプリケーションの持つウィンドウも
ウィンドウ(コントロールも含む)が幾重にも重なっているように、
デスクトップもそのような構造になっていて、
GetDesktopWindow()は、そのトップレベルウィンドウ(に相当するもの)を
返しているのかなぁ、と。
これは私の推測に過ぎませんが。
他のプロセスに干渉できるのは dll だけだからのような気がします。
これが参考になるかもしれないです。
http://homepage1.nifty.com/kazubon/progdoc/tclock/gaiyo.html
デスクトップのアイコンなどを持っているウィンドウは、Spy++ では一番下の Progman以下に
あるリストビューではないでしょうか。
コイツをサブクラス化するには、(他プロセスが作ったウィンドウなので)グローバルフックを
インストールしてやらねばならないと思います。
詳しくは↑のsuzukaさんのURLにて。
皆さん、ありがとうございます。
なるほど、グローバルフックが必要なわけですね。
ProgramManagerのメッセージをスパイ++で見たところ、たしかにマウスイベントを
確認できました。