2012-02-18 5 views
2

今、Windows用のユーザーは誰でも、アプリケーションが(正式に)フォアグラウンドプロセスからフォーカスを奪うことができないことを知っている可能性があります。why。しかし、私は不注意にフォーカスを奪ってしまっただけで、これがどのように可能であるかを理解していません。私のWindowsアプリは、ルールではいけないときにフォーカスを得るのはなぜですか?

私は、ユーザーが(あるいはマウスクリックによって、またはAlt + Tabキーで)ホットキーで起動されますDelphiのアプリを持って、テキストの一部を選択し、ヒットを入力します。私のアプリは最小化して(トレイに隠れていても)、選択したテキストユーザーをアクティブなウィンドウにペーストします。ここには何もありません。クリップボードのエクステンダ、用語集、マクロプログラムなどもあります。

私にとって困惑は、上記のことをすべて行い、1500ミリ秒間眠った後、 フォーカスが戻る! 1500 ms前(テスト済み、Windows 7 32ビット)であったにもかかわらず、フォアグラウンドウィンドウになります。

実際に、私はすべてで、そのウィンドウが最前面に持っている私のメインフォームIのレコードを復元する前にこれをしたくないし、それが私に与えられていた後、私は戻ってそのウィンドウにそれを与えます。なぜ私のアプリは、ルールではならないときにフォアグラウンドになるのか不思議です。たぶん私は私が思ったように完全にルールを理解していないでしょうか?

+1

...あなたはあなたのウィンドウを復元する方法を知りませんが、ShowWindowSW_SHOWNOACTIVATEを使用することが役立つかもしれないそれが1500ミリ秒のためのあなたのプログラムの睡眠とは何の関係もありません、それはどのくらいのユーザーに依存します眠っている。ユーザーが入力イベントを生成していない場合、アプリはフォアグラウンドを盗むことができます。 –

+0

スリープは、すべてのウィンドウに順番に自分のものを取得する時間を与えるだけです。それは、私を離れてフォーカスを取る必要があるメインフォームの最小化と隠蔽です(GetForegroundWindowは自分以外のウィンドウを返します)。だから、私の窓には焦点がないと確信していますが、復元時にはそれが戻ってくるという点があります。私は入力事象への依存性について知らなかった。あなたがそれを1つとして投稿すれば答えのように聞こえる。もっと言えますか?ユーザーがキーボードやマウスにしばらく触れていないと、プロセスが前景になることはありますか? –

答えて

2

SetForegroundWindowのドキュメントを見ると、成功するための条件のリストが表示されます。その1つは「プロセスは最後の入力イベントを受信しました」です。したがって、ユーザーがあなたのアプリでenterを押した後に何もしないと、まだフォーカスを奪う権利があります。ウィンドウが復元されたときにDelphiがSetForegroundWindowを呼び出すかどうかはわかりませんが、調べる対象になる可能性があります。

私は

関連する問題