0

フォームを呼び出す前に初期作業を行う必要があるプログラムがあるため、アプリケーション フレームワークの設定を無効にし、フォームを実行するときに Application.Run(myForm) を呼び出す独自の Main 関数を作成しました。

すべてが問題なく機能していましたが、フォームを開く前に他のサービスが必要になりました。すべてのコードをこのプログラムに追加するのではなく、すべて独自の実行可能ファイルに移動しました。この 2 番目のプログラムは、最初のプログラムが使用するファイルを編集できるため、最初のプログラムがそれらの変更 (変更が行われた場合) を読み取るまで待機する必要があります。Shell 関数を簡単に使用できると思いますが、さまざまな理由で、独自の Process オブジェクトを作成し、それを呼び出して/待機しています。

とにかく、Application.Run 呼び出しの少し前に、この呼び出しを 2 番目のプログラムに行います。最初のプログラムはその順番を待ち、2 番目のプログラムとはまったく問題なく対話できます。しかし、それが完了すると、最初のプログラムのウィンドウは、画面上にある他のウィンドウの背後に隠れます。これは XP では発生せず、Vista でのみ発生します (7 でも発生する可能性がありますが、まだ確認していません)。フォームを前面に表示する、最小化してから最大化する、フォーカスを取得するなどを手動で強制しようとしましたが、ユーザーがマウスで手動でクリックしない限り、フォームを前面に表示することはできません。

私は何を間違っていますか?なぜこの動作が発生するのですか? 実行可能ファイルが終了するのを待つことと関係があることはわかっています。最初のプログラムを強制的に待機させなければ、すべてがうまくいくからです(待機していないことを除く)。フォームの Load イベントで 2 番目のプログラムを呼び出すことで問題を回避できますが、ファイルを 1 回読み取るのではなく、変更をキャッチするために 2 回目にファイルを読み取る必要があります。また、フォームが描画されているため、見た目も悪くなります。 2番目のプログラムがそこに座っている間、本当にゆっくりと。

誰かが何か意見があれば、私はそれを感謝します。

4

2 に答える 2

2

これは、この動作が発生している理由に対する実際の回答ではありませんが、単純な回避策は、load イベントでフォームのTopMostプロパティを一時的に に設定することです。True次に、どれだけ邪魔になりたいかに応じて、短いタイマーでリセットするか、MouseEnterイベントが発生するのを待つことができます。

于 2012-07-17T16:11:30.193 に答える
1

このサイトにはそれに関する別のトピックがありますが、リンクがありませんでした。この問題は、.NET フレームワークのバグのようです。以下の API (VB.NET の例) は、Windows XP および 8.1 で動作します。他のバージョンの Windows ではテストしないでください。

<Runtime.InteropServices.DllImport("user32")> _
Public Shared Function SetForegroundWindow(hwnd As IntPtr) As Integer
End Function

Private Sub Form_Load(sender As Object, e As EventArgs) Handles Me.Load
    SetForegroundWindow(Handle)
End Sub
于 2014-01-08T19:33:50.813 に答える