QA@IT

unibon

レベル 28

サイト内ランキング 198

    ┗ 3位 (過去30日)

過去最高月間ランク 2

質問数 6件/回答数 10

投稿した質問の解決率 66% (4 / 6)

登録日 2012年5月30日

コメント
他者が Form を ShowDialog/Show した瞬間に、自分の処理を動かしたい
MonitorPluginForm には ParentAppForm のインスタンスは渡されませんが、MonitorPluginForm の中のコンテキストからは this.Parent == ParentAppForm となって見えます。これによりParentAppForm のインスタンスにアクセスできています。
コメント
他者が Form を ShowDialog/Show した瞬間に、自分の処理を動かしたい
ちなみに ParentAppForm が MessageBox を出す場合は、ParentAppForm が後面にあっても WM_ACTIVATE が発生するようです。Form の Show/ShowDialog だと発生しないことがあります。
コメント
他者が Form を ShowDialog/Show した瞬間に、自分の処理を動かしたい
先日書いた IDE というのは IDE ということにあまり意味はなく、メモ帳や IE などの別アプリケーションという意味にすぎませんでした。
コメント
他者が Form を ShowDialog/Show した瞬間に、自分の処理を動かしたい
WM_ACTIVATE が拾えないケースで IDE を使わずにできる再現方法を書きます。私の前回の MessageBox の質問のサンプルコードのようにタイマーで Form2 を Show/ShowDialog するようにします。そのタイマーが発動する前に画面上でメモ帳やIE などのアプリケーションをクリックして前面に出し、タイマーが発動するのを待ちます。
コメント
他者が Form を ShowDialog/Show した瞬間に、自分の処理を動かしたい
ChildPluginForm はプラグインではなく、親フォームから出される子フォームにすぎません。 MonitorPluginForm からは MonitorPluginForm.Parent にも ParentAppForm にも自由にアクセスできます。
コメント
他者が Form を ShowDialog/Show した瞬間に、自分の処理を動かしたい
3投稿の書き直しを完了しました。
コメント
他者が Form を ShowDialog/Show した瞬間に、自分の処理を動かしたい
WndProc のオーバーライドはコードをいじることが可能な MonitorPluginForm を対象とすることしかできないと思いますので、たぶん今回の目的には使えないと考えています。
コメント
他者が Form を ShowDialog/Show した瞬間に、自分の処理を動かしたい
ParentAppForm と ChildPluginForm のコードは変更できないし、ソースも見られません。 MonitorPluginForm の中でローカルフックを書いても、フックの対象は ParentAppForm(やその子ウィンドウ)や MonitorPluginForm 自身でも選べます。
コメント
他者が Form を ShowDialog/Show した瞬間に、自分の処理を動かしたい
そうやって調べてみると前回書いたように拾えないことがあり、自分でウィンドウメッセージを捉えるプログラムを MonitorPluginForm の中でローカルフックとして書いても同様に拾えませんでした。
コメント
他者が Form を ShowDialog/Show した瞬間に、自分の処理を動かしたい
名称を間違えました。直近の3投稿を破棄して書き直します。
コメント
他者が Form を ShowDialog/Show した瞬間に、自分の処理を動かしたい
WndProc のオーバーライドはコードをいじることが可能な ChildPluginForm を対象とすることしかできないと思いますので、たぶん今回の目的には使えないと考えています。
コメント
他者が Form を ShowDialog/Show した瞬間に、自分の処理を動かしたい
ParentAppForm と ChildPluginForm のコードは変更できないし、ソースも見られません。 ChildPluginForm の中でローカルフックを書いても、フックの対象は ParentAppForm(やその子ウィンドウ)や ChildPluginForm 自身でも選べます。
コメント
他者が Form を ShowDialog/Show した瞬間に、自分の処理を動かしたい
そうやって調べてみると前回書いたように拾えないことがあり、自分でウィンドウメッセージを捉えるプログラムを ChildPluginForm の中でローカルフックとして書いても同様に拾えませんでした。
コメント
他者が Form を ShowDialog/Show した瞬間に、自分の処理を動かしたい
自分でウィンドウメッセージを捉えるプログラムを書かなくても、ParentAppForm(あるいはその子ウィンドウ)を Spy++ でメッセージをトレースすれば、期待するイベントが起きているのかどうかが判断できると考えています。
コメント
他者が Form を ShowDialog/Show した瞬間に、自分の処理を動かしたい
その目的のために捉えるイベントはなんでもいいです。たまにイベントを捉えられなくても、あるいは誤認識して多めに捉えてしまっても、多少の誤差は構いません。間隔の長いポーリングを併用すれば、最悪の場合でも動き(反応)が遅いだけで済み、致命的な処理の誤りにはならないので。
コメント
他者が Form を ShowDialog/Show した瞬間に、自分の処理を動かしたい
最終目標は ChildPluginForm が出現したら、間を置かずにそのフォームにアクセスして、テキストボックスなどを読み取ったり書き込んだり、ボタンをクリックしたりということをしたいです。フォームにアクセスすることはできていて、残る課題は間を置かずにそのような処理を開始するということだけです。
コメント
他アプリの指定したテキストボックスへ値を渡す方法
あいまいな記憶ですが、WM_SETTEXT でできると思います。ただし、自分のプログラムを起動する際に「管理者としてこのプログラムを実行する」という特権レベルを付けて実行しないと弾かれるのではないかと思います。Visual Studio のデバッガー上で動かす時は、Visual Studio の起動時にこの特権レベルを付けるのが楽です。
コメント
他アプリの指定したテキストボックスへ値を渡す方法
回答の投稿時に「他アプリ」が .NET のアプリケーションだということを見落としていました。
コメント
他者が Form を ShowDialog/Show した瞬間に、自分の処理を動かしたい
たとえば Visual C# のデバッガー上で動かしていて、Visual C# の IDE のウィンドウが前面に出ていると、拾えなかったです。 それ以前に WM_CREATE が拾えないのもちょっと変な感じがするので、私のフックの使いかたがなにか間違っているのかもしれません。もうちょっと調べてみます。
コメント
他者が Form を ShowDialog/Show した瞬間に、自分の処理を動かしたい
フックするウィンドウメッセージとして WM_CREATE を指定すると、なぜか全く拾えませんでした。WM_ACTIVATE を指定すると、ほぼ期待どおりに拾えるのですが、メインのウィンドウが前面に出ていない時は拾えないみたいです。
コメント
他者が Form を ShowDialog/Show した瞬間に、自分の処理を動かしたい
両者とも .NET Compact Framework を対象としたサンプルらしいのですが、coredll.dll と書いてある箇所を user32.dll に書き換えるだけで動かせました。
コメント
他者が Form を ShowDialog/Show した瞬間に、自分の処理を動かしたい
方法 : WndProcHooker クラスを使用する http://msdn.microsoft.com/ja-jp/library/ms229658(v=vs.80).aspx 方法 : プラットフォーム呼び出しにヘルパー クラスを使用する http://msdn.microsoft.com/ja-jp/library/ms229683(v=vs.80).aspx
コメント
他者が Form を ShowDialog/Show した瞬間に、自分の処理を動かしたい
C# でローカルフックをおこなうサンプルとして、つぎの2つのページを参考にし、ローカルフックは実現できました。
回答
コメント
他者が Form を ShowDialog/Show した瞬間に、自分の処理を動かしたい
たしかにローカルフックでできそうな感じですね。グローバルフックではないので、C# だけでもコーディングできるのかなと思います。とはいえローカルフックでもかなり大変そうですね。