デスクトップのハンドル取得 – プログラミング – Home

デスクトップのハンドル取得
 
通知
すべてクリア

[解決済] デスクトップのハンドル取得


まま
 まま
(@まま)
ゲスト
結合: 20年前
投稿: 17
Topic starter  

はじめまして。
グローバルフックを使用してマウスのイベントを拾うアプリを作っているのですが、
デスクトップをクリックしたとき、フックプロシージャにて
MOUSEHOOKSTRUCT構造体のhwndメンバのアドレスとGetDesktopWindow()で取得した
アドレスが微妙に違います。
知りたいのはデスクトップをクリックしたのかどうかってだけなんですが、
どなたかご存知の方いらっしゃいましたらご教示ください。
よろしくお願いいたします。


引用未解決
トピックタグ
まま
 まま
(@まま)
ゲスト
結合: 20年前
投稿: 17
Topic starter  

すいません、開発環境はVC6.0です。


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

Spy++で見てみるとよく分かります。
いわゆるデスクトップウィンドウは裏に隠れているようで、
デスクトップとして見えているのは別のウィンドウのようです。

ウィンドウクラス名でいうと、下記の子ウィンドウをたどって、
Progman - SHELLDLL_DefView
[SysListView32]というクラス名のウィンドウのようです。
(WindowsXP - SP3 の場合)


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

自分で納得(^^)

> [SysListView32]というクラス名のウィンドウのようです。
そうか、デスクトップ自体もいわゆるリストコントロールだったのね。


返信引用
まま
 まま
(@まま)
ゲスト
結合: 20年前
投稿: 17
Topic starter  

早速のご回答ありがとうございますm(_ _)m

なるほど、GetDesktopWindow()では普段見えているデスクトップのハンドルは
取得できないということですね。

教えてもらったことを参考に以下のようなコードで見えているデスクトップハンドルを
取得することができました。

HWND hWnd = ::GetWindow(::GetWindow(::FindWindow(Progman, NULL), GW_CHILD),
GW_CHILD);

こんなんで問題ないでしょうか?
他のWindows環境ではProgman以下の構成が違っててハンドルが取得できないとかないで
すよね。


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

> こんなんで問題ないでしょうか?
良さそうな気はしますが...(未確認)

> 他のWindows環境ではProgman以下の構成が違っててハンドルが取得できない
> とかないですよね。
十分あり得ると思います(^^;)
汎用的な方法となると、ちょっと思いつきませんねぇ。

ただ、私の記憶では、'Progman'というクラス名はWin3.1のころから変わらなか
ったような記憶があります。それだけを信じるなら、
MOUSEHOOKSTRUCT構造体のhwndメンバ
から、親ウィンドウをたどって、'Progman'というクラス名を探した方が信頼度
は高い気がします。


返信引用
まま
 まま
(@まま)
ゲスト
結合: 20年前
投稿: 17
Topic starter  

そうですかぁ、、、。
まぁひとまずこれでやってみます。

どうもありがとうございました!


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

>ままさん
>HWND hWnd = ::GetWindow(::GetWindow(::FindWindow(Progman, NULL), GW_CHILD),
>GW_CHILD);
>
>こんなんで問題ないでしょうか?
>他のWindows環境ではProgman以下の構成が違っててハンドルが取得できないとかないで
>すよね。
XPでアクティブデスクトップを有効にすると、デスクトップ上にあるアイコン部分を
除いて[Internet Explorer_Server]というクラス名のウインドウになるようで、
環境によってはSysListView32だけをデスクトップと見なせない可能性があります。

なので、bunさんの
> MOUSEHOOKSTRUCT構造体のhwndメンバ
>から、親ウィンドウをたどって、'Progman'というクラス名を探した方が信頼度
>は高い気がします。
こちらの方法の方がまだ安全そうな感じです。

それから目的がわからないのでどの部分をデスクトップとみなすのか判断できませんが
Windows Vistaのサイドバー部分は独立したウインドウなのでタスクバー同様に
上記の方法ではデスクトップとみなすことはできません。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました