2011-06-19 11 views
2

これは実行できます...他のvb.net実行ファイルがそれを行うのを見てからです。私はSystemTrayに、プログラムのNotifyIconを打つときNotifyIconをクリックすると、3つの状態(2ではなく)の間で反転します

...私は、私だけを切り替える必要があるだろうと思った:

 
1> Show my form 
2> Hide my form 

しかし、私は本当にすべて3との間で反転する必要があります。

 
1> Show my form 
2> Hide my form 
3> If my form is visible... but behind other programs... 
    just bring it to the front. 

私は#1と#2を動かすことしかできないようだ。私はどのように3すべてをやりますか? (私は「常に手前に」永久に私のフォームを作成する必要はありません。)

 
' Flip between #1 and #2 
If (Me.Visible) Then 
    Me.Hide() 
Else 
    Me.Show() 
    Me.WindowState = FormWindowState.Normal ' In case user minimized it earlier 
    Me.Activate() ' Active and give focus (brings to front, also) 
End If 

NotifyIconを打つことは非常にすることを引き起こすので、私は本当に...「私のフォームがアクティブになっている」かどうかを確認することはできませんマウスをにクリックしてください。すべてのフォームは「アクティブではありません」。

編集:「スタートバー」や「常に上のウィンドウ」などの他のウィンドウについては心配していません。 (彼らはいつも私の上にいるので)

私は本当に検出する必要があると思う: "私はショーは真実...そして私はアクティブである" (でもNotifiIconをクリックすると私のフォームは非アクティブになります...どうすれば真偽をチェックできますか?)

私は本当にそれがちょうどウィンドウのやり方で動作したいと思っています:タスクバーは単に「開いている」(閉じている場合)と「閉じる」(開いている場合)にしません。

がすでに開いているかどうかを検出するが、他のウィンドウの背後にあるので、それを閉じないでください...ではなく...ウィンドウが表示されますそれは常に1つのより多くのことを行います。 3つの異なるもののため

チェックします。 3つの異なることがあります。 (決して2にすぎない)

答えて

0

GetNextWindowメソッドから何らかの使い方をすることができます。どのウィンドウがウィンドウの上にあるかを見るために使用することができます。それは簡単ではありませんが、おそらくそれを機能させることができます。

あなたのウィンドウがアクティブウィンドウであっても、おそらくまだスタートバーとAlwaysOnTop窓のように、あなたの上でいくつかのウィンドウが存在することを念頭に置いて

Const GW_HWNDNEXT as Integer = 2 'Returns a handle to the window below the given window. 
Const GW_HWNDPREV as Integer = 3 'Returns a handle to the window above the given window. 

Declare Function GetNextWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Integer, ByVal wFlag As Integer) As Integer 

hWndPrev = GetWindow(Me.Handle, GW_HWNDPREV) 

ベアを使用し、窓があなたの上にあるかを確認するには。クラスや位置/サイズ(ウィンドウが重なっているかどうか)に基づいてこれらを検出する必要があります。

運が良かった!

+0

私は本当に "常に上の"ウィンドウが私の上にあることを心配していません。 (彼らはいつも私の上にいるので)それらを除いて...私はあなたの窓を私の上に置くことができます...私はまだ活動していますか?私のものは非アクティブではないでしょうか?どうすればそれを検出し、それをアクティブにすることができますか? (私のnotifyIconをクリックすると、私のフォームが作成されることに注意してください...* ALL *は非アクティブです。だから私はまだ私がアクティブなものとして使用されていた私を検出することができますか?)私は検出する必要があると思います:私のウィンドウはMe.Hideに設定されていません...しかし、それもアクティブではありません。 (しかし、忘れないでください...私のnotifyIconクリックは常に "非アクティブ"にします)。 – Margie

+0

上記(前)のウィンドウをループすると、これが役立ちます。あなたはspy ++(spyxx.exe)を使って、私が何を話しているのか見ることができます。これは、他のウィンドウがあなたの上にあるかどうかを検出するのに役立ちます。 Form.Activateはおそらくあなたのウィンドウをアクティブにするために働くでしょう...そうでなければ、p/SetForegroundWindow APIを呼び出します。 –

+0

うわー。私はspyxx.exeやAPI呼び出しの必要がないことを望んでいました....この非常に簡単なことを行うには:私のフォームがアクティブなフォームであるかどうかを検出します...私のNotifyIconをクリックします。 (しかし、クリック自体は、CLICKがフォームを非アクティブにするので、私がそれをやり遂げるのを妨げています。) – Margie

関連する問題