C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: ウインドウの重なり判定


(過去ログ 120 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■70289 / inTopicNo.1)  ウインドウの重なり判定
  
□投稿者/ C#研究者 (62回)-(2014/03/07(Fri) 15:44:42)

分類:[C#] 

実行環境 Windows7 32bit 64bit
開発環境 Windows7 32bit VisualStudio C#2010

フォームの上に他のウインドウが被さっていないかを判定するために
WinAPIのWindowFromPointという関数を使ってカーソルの上のウインドウハンドルを捕まえて、
うえに被さっているか動かを判定しようとしているのですが、
WindowFromPointからは自身のフォームハンドらしか返ってきません。
どのようにすればこのような処理は実現できるのでしょうか。

※もしWinAPIを使わずにできる方法があればなおよしです。

引用返信 編集キー/
■70290 / inTopicNo.2)  Re[1]: ウインドウの重なり判定
□投稿者/ とっちゃん (206回)-(2014/03/07(Fri) 16:37:20)
とっちゃん さんの Web サイト
No70289 (C#研究者 さん) に返信

> フォームの上に他のウインドウが被さっていないかを判定するために
> WinAPIのWindowFromPointという関数を使ってカーソルの上のウインドウハンドルを捕まえて、
> うえに被さっているか動かを判定しようとしているのですが、
> WindowFromPointからは自身のフォームハンドらしか返ってきません。

WindowFormPoint は、渡した座標点(スクリーン座標)の場所にある一番上のウィンドウ(トップレベルウィンドウ)を返してくるはずです。
子ウィンドウ(コントロール)がそこにあってもチェック対象にはなっていないと思います。
自分の子ウィンドウをチェック対象にしたいなら、ChildWindowFromPoint や ChildWindowFromPointEx (どちらもAPI) または
System.Windows.Forms.Control.GetChildAtPoint() メソッドですかね。

> うえに被さっているか動かを判定しようとしているのですが、
> WindowFromPointからは自身のフォームハンドらしか返ってきません。

という部分から、かなりエスパー働かせてみました。

引用返信 編集キー/
■70311 / inTopicNo.3)  Re[2]: ウインドウの重なり判定
□投稿者/ C#研究者 (63回)-(2014/03/10(Mon) 12:49:16)
すみません。ありがとうございます。
助かりました。
解決済み
引用返信 編集キー/
■70324 / inTopicNo.4)  Re[3]: ウインドウの重なり判定
□投稿者/ C#研究者 (67回)-(2014/03/11(Tue) 14:36:01)
今度はプロセス名で画面のフィルタリングしたいと思い、
このようなコードを作りました。

IntPtr ptr = WindowFromPoint(Cursor.Position);
int nProcessID;
GetWindowThreadProcessId(ptr, out nProcessID);
Process hProcess = System.Diagnostics.Process.GetProcessById(nProcessID);
MessageBox.Show(nProcessID.ToString());

ところが、この処理を複数のアプリに別々に入れて実行をしたところ、
あるプログラムではカーソルが指しているウインドウで変わりますが、
あるプログラムでは表示されるプロセスが自分自身のプロセスIDで固定になってしまいます。
どこの記述に原因があるのでしょうか。

今はプロセス名をテストで表示しているだけなのですが、
これを元にプロセスIDからプロセス名を割り出して表示のフィルタリングをするつもりです。




引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -