2011-11-11 3 views
1

数分前、私はTopMostで奇妙な問題に遭遇しました。私は一番上のフォームを作成しました(WinForms)いくつかのタブ移動し、すべてがうまくいた。タブ移動時にTopMostが機能しない

私はコンピュータゲーム(フルスクリーンウィンドウ)を開こうとしました。これはゲームがフルスクリーンですが、ウィンドウモードではフォームとオーバーレイできることを意味します。私のブラウザを開くまで、すべてのことがうまくいった(他のプログラム(エディタ)でもかまいません)。私は2台のモニターを持っています。

  1. 私は、私は戻って試合タブブラウザ(URL)
  2. のどこかにクリックしたゲーム内のどこかでクリックしたブラウザ
  3. に(私のフォームはTopMostのある場合)コンピュータゲームの外にタブ付き(私のフォームはまだTopMostです)
  4. 私は再びステップ1-3を行い、突然私のフォーム(一番上)が消えました。

これは私がこれを行うたびに発生し、この問題は少なくとも2台の他の マシンで再現できます。

EDITは:

は私が提案された解決策

public partial class Form1 : Form 
{ 
    const UInt32 SWP_NOSIZE = 0x0001; 
    const UInt32 SWP_NOMOVE = 0x0002; 
    const UInt32 SWP_NOACTIVATE = 0x0010; 

    [DllImport("user32.dll")] 
    static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); 

    public void setTOP() 
    { 
     SetWindowPos(this.Handle, new IntPtr(-1), 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE); 
    } 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     this.setTOP(); 
    } 
} 

を実装しようとした。しかし、これは動作しませんでした。

答えて

1

これは恐ろしい解決策ですが、これまでのところよりも優れています。

x秒ごとに最上位を呼び出すタイマーを実装しました。私が言ったように、それは良い解決策ではなく、私の心に来た唯一の解決策です。私はこれに取り組むつもりですが、その間に私は何をしています。

1

topMost APIはウィンドウの順序を設定しました。私は単に "TopMost"フラグを再度呼び出すことをお勧めします。 TopMost = FalseTopMost = True注文をリセットします。別のウィンドウでOSに同じコマンドを使用できるためです。

背景(単に情報のための)作業API

Declare Function SetWindowPos Lib "user32.dll" (_ 
       ByVal hwnd As integer, _ 
       ByVal hWndInsertAfter As integer, _ 
       ByVal x As integer, _ 
       ByVal y As integer, _ 
       ByVal cx As integer, _ 
       ByVal cy As integer, _ 
       ByVal wFlags As integer) As integer 

http://www.activevb.de/cgi-bin/apiwiki/SetWindowPos

よろしく

+0

もう一度最上部を呼び出す方法を知りますか?フォームがフォーカスされていないか、バックグラウンドに行くときに私が知らないものが消えてしまう/消える... SetWindowPosを使ってみると、何も変わらない。 –

+0

こんにちは。ここに私の場合はそれが動作します。 DirectXやグラフィックアクセラレータを使用したゲームなどがあれば教えてください。おそらく、ビデオのアクセラレーションが問題なのでしょうか?同じ問題がここ(ドイツ語)であり、以下のコードを使用して解決されました:http://www.activevb.de/tipps/vb6tipps/tipp0007.html – Nasenbaer

+0

私がテストしたゲームは、StarCraft 2です。それは正しくありましたが、このシナリオを除いて最上位だったので、私は間違いをしなかったと思います。 –

1

あなたの最善の策は、アプリケーションがフォーカスを取得したときに、再び最上位を呼び出すことかもしれません。

+0

1.表示されていなければ、どのようにフォーカスを得るべきでしょうか?2.ユーザーがタブをたてるたびにフォーカスを合わせるのはちょっと面倒です。 –

関連する問題