はじめまして。
グローバルフックを使用してマウスのイベントを拾うアプリを作っているのですが、
デスクトップをクリックしたとき、フックプロシージャにて
MOUSEHOOKSTRUCT構造体のhwndメンバのアドレスとGetDesktopWindow()で取得した
アドレスが微妙に違います。
知りたいのはデスクトップをクリックしたのかどうかってだけなんですが、
どなたかご存知の方いらっしゃいましたらご教示ください。
よろしくお願いいたします。
すいません、開発環境はVC6.0です。
Spy++で見てみるとよく分かります。
いわゆるデスクトップウィンドウは裏に隠れているようで、
デスクトップとして見えているのは別のウィンドウのようです。
ウィンドウクラス名でいうと、下記の子ウィンドウをたどって、
Progman - SHELLDLL_DefView
[SysListView32]というクラス名のウィンドウのようです。
(WindowsXP - SP3 の場合)
自分で納得(^^)
> [SysListView32]というクラス名のウィンドウのようです。
そうか、デスクトップ自体もいわゆるリストコントロールだったのね。
早速のご回答ありがとうございますm(_ _)m
なるほど、GetDesktopWindow()では普段見えているデスクトップのハンドルは
取得できないということですね。
教えてもらったことを参考に以下のようなコードで見えているデスクトップハンドルを
取得することができました。
HWND hWnd = ::GetWindow(::GetWindow(::FindWindow(Progman, NULL), GW_CHILD),
GW_CHILD);
こんなんで問題ないでしょうか?
他のWindows環境ではProgman以下の構成が違っててハンドルが取得できないとかないで
すよね。
> こんなんで問題ないでしょうか?
良さそうな気はしますが...(未確認)
> 他のWindows環境ではProgman以下の構成が違っててハンドルが取得できない
> とかないですよね。
十分あり得ると思います(^^;)
汎用的な方法となると、ちょっと思いつきませんねぇ。
ただ、私の記憶では、'Progman'というクラス名はWin3.1のころから変わらなか
ったような記憶があります。それだけを信じるなら、
MOUSEHOOKSTRUCT構造体のhwndメンバ
から、親ウィンドウをたどって、'Progman'というクラス名を探した方が信頼度
は高い気がします。
そうですかぁ、、、。
まぁひとまずこれでやってみます。
どうもありがとうございました!
>ままさん
>HWND hWnd = ::GetWindow(::GetWindow(::FindWindow(Progman, NULL), GW_CHILD),
>GW_CHILD);
>
>こんなんで問題ないでしょうか?
>他のWindows環境ではProgman以下の構成が違っててハンドルが取得できないとかないで
>すよね。
XPでアクティブデスクトップを有効にすると、デスクトップ上にあるアイコン部分を
除いて[Internet Explorer_Server]というクラス名のウインドウになるようで、
環境によってはSysListView32だけをデスクトップと見なせない可能性があります。
なので、bunさんの
> MOUSEHOOKSTRUCT構造体のhwndメンバ
>から、親ウィンドウをたどって、'Progman'というクラス名を探した方が信頼度
>は高い気がします。
こちらの方法の方がまだ安全そうな感じです。
それから目的がわからないのでどの部分をデスクトップとみなすのか判断できませんが
Windows Vistaのサイドバー部分は独立したウインドウなのでタスクバー同様に
上記の方法ではデスクトップとみなすことはできません。