- ベストアンサー
SetWindowPosについて
初心者です。 メインのFormのLoad時に、他のアプリケーションも起動させるプログラムを 作っています。問題は、他のアプリケーション起動時に、フォーカスが そちらへ移ってしまうことです。そこで、メインのFormを常に前面に 表示し、フォーカスを持たせる為に、SetWindowPos関数を使おうと考えて います。が、どのようなパラメータを与えてやればよいのか分かりません。 また、もしこれよりもよい方法があれば教えて頂きたいのです。m(_ _)m 環境:VB6SP5, Win2000Pro
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>他アプリケーションの起動にはCreateProcess関数を使っていますが・・・。 CreateProcess関数のpStartupInfoに指定するSTARTUPINFO構造体のdwFlagsメンバにSTARTF_USESHOWWINDOWを指定すると、wShowWindowメンバの値が有効になります。 これはShowWindowやShellExecuteで指定するウィンドウのスタイルと同じ値です。 こうすれば、起動時のウィンドウのスタイルを指定できます。 ちなみにCreateProcessでアプリケーションを起動した場合、pProcessInformationで指定した構造体にプロセスとスレッドのハンドルを受け取ります。 これらが必要ない場合は、即座にハンドルを閉じましょう。 さもないと、プログラム終了時までそのハンドルが残り、これを繰り返すとパフォーマンスが低下します。
その他の回答 (4)
- sssohei
- ベストアンサー率33% (33/98)
無理にAPIを使わなくても、 他のアプリケーション起動時にフォーカスを持たないようにすることは可能です。 Shell 関数の第二引数を調べてみてください。 vbNormalNoFocus というのがそれにあたると思います。
お礼
回答ありがとうございます。 他アプリケーションの起動にはCreateProcess関数を使っていますが、 そちらの引数wShowWindowでフォーカスを持たせずに起動することも 可能なことが分かりました。Shell関数を用いた方法も調べてみよう と思います。大変参考になりました。重ねて御礼申し上げます。
- haporun
- ベストアンサー率40% (230/562)
追記 "常に手前に表示" にしたとしても、どのウィンドウがアクティブになるかは変わらないでしょう。
- osaosa42
- ベストアンサー率60% (20/33)
最前面表示は、次のソースで実現できます。 APIの定義および定数は、自分で調べてください。 Private Sub Form_Load() '最前面表示 SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE End Sub
お礼
回答ありがとうございます。 SetWindowPos関数の最後の引数に適切な値を指定してやれば よいのですね。でも具体的に何を指定すればよいのか分から なかったのです。もう少し自分で調べてみます。 大変参考になりました。重ねて御礼申し上げます。
- haporun
- ベストアンサー率40% (230/562)
APIのShellExecute関数の最後の引数にSW_SHOWNOACTIVATEを指定すると、起動したアプリケーションがアクティブにならずに起動しますよ。
お礼
回答ありがとうございます。 他アプリケーションの起動にはCreateProcess関数を使っていますが、 そちらの引数wShowWindowでフォーカスを持たせずに起動することも 可能なことが分かりました。Shell関数を用いた方法も調べてみよう と思います。大変参考になりました。重ねて御礼申し上げます。
お礼
再度回答ありがとうございます。 >これらが必要ない場合は、即座にハンドルを閉じましょう。 CloseHandle関数で閉じるのですね?(たぶん)勉強します。 重ねて御礼申し上げます。