■69548 / inTopicNo.4) |
Re[3]: ウィンドウクラス |
□投稿者/ とっちゃん (185回)-(2014/01/07(Tue) 16:20:02)
|
■No69536 (魔界の仮面弁士 さん) に返信 > ■No69535 (とっちゃん さん) に返信 > >>FindWindow("WindowsForms10.Window.8.app.0.378734a", null); >>Form クラスのウィンドウクラス名は固定されていません。 >>実行環境にインストールされている .NET Framework のバージョンや >>実行時の動作状況などによって、先頭あるいは末尾2つが変化します。 > > 公式資料は見当たりませんでしたが、一説によれば > WindowsForms10.<character sequence>.app<hash code of appdomain> > というルールだそうで。 > http://www.codeproject.com/Articles/4814/A-simple-Windows-forms-properties-spy
おっと。。。実は、先のコメントを書くときに、手持ちのソースをチェックしていたりします。
手持ちのソース(NativeWindow.cs)では、 StringBuilder b = new StringBuilder(50);
b.Append(Application.WindowsFormsVersion); b.Append('.'); b.Append(className); b.Append(".app."); b.Append(domainQualifier); b.Append('.'); String appDomain = Convert.ToString(AppDomain.CurrentDomain.GetHashCode(), 16); b.Append(VersioningHelper.MakeVersionSafeName(appDomain, ResourceScope.Process, ResourceScope.AppDomain));
b.ToString();
となっています。
Application.WindowsFormsVersion はinternal 属性の付いたプロパティ(文字列を返す)で実装は return "WindowsForms10"; となっています。 固定なのは、互換性の問題だそうです(ソースのコメント(超絶意訳モード)に、書き換えたやつは死刑って書いてありましたw)。
className は、デフォルトではこの部分の手前で "Window." + Convert.ToString( CreateParams.ClassStyle, 16 ); という値で作成されたものです。 CreateParams.ClassStyle はデフォルトでは、8(CS_DBLCLKS という定義値)です。
domainQualifier は、内部的にカウンタになっている値で、ウィンドウクラスの登録に失敗した場合にカウントアップするように作られています。
あとは、ヘルプを見ればわかるものなので割愛(値に意味があるわけではないので)。
さて。。。このウィンドウクラス名ですが、これで検索は全く意味をなさないということが改めて調査した結果わかりました。
実験は、 App1(2010/5/5 に作成したアプリケーション)と、App2(11月のわんくま勉強会のために作成したデモアプリ)を両方起動した状態でSpy++ でクラス名を取得しただけですが。 実行環境ではどちらのクラス名も WindowsForms10.Window.8.app.0.2bf8098_r9_ad1 となっており、FindWindow の結果からはこれがどのプログラムであるかを特定することが不可能であることを立証してしまいました。
一応。。。実行環境を記載しておきます。 Windows 8.1 Pro 64bit版でActiveDirectoryドメイン環境です。 インストールされているVSは、2010/2012 で、アップデートは現時点で最新の状態です。 #2013が入ってないのは、もうじき新マシンに乗り換えるため
ちなみに、ほかにどこかで使われていないか?と調査したところ、VSの子ウィンドウなどいろいろなところで使われていることもわかりました。 まぁ、おまけの部分については何の意味もありませんが。。。
ということで、クラス名を特殊化するなどの特別な行為を行っていない場合 FindWindow にウィンドウクラス名を与えて検索する行為は事実上不可能であるということを追記しておきます。
じゃぁどうするか?については、なぜ検索するのかという部分がないと適切な回答を得ることは難しいのでとりあえず割愛します。
|
|