2010-02-23 85 views
1

我有一個VB 6 MDI應用程序。它響應不推薦使用的SwitchToThisWindow函數,但不響應ShowWindow和SetActiveWindow函數。我知道ShowWindow和SetActiveWindow是正確聲明的,因爲我可以在任何其他應用程序中使用它們。WIn32 SwitchToThisWindow,ShowWindow和SetActiveWindow

編輯:我的目標不是使用這些函數,它很容易將焦點從我的應用程序切換到VB 6應用程序。所以如果你有任何其他的方法,我全部都是耳朵。

回答

1

SetActiveWindow只適用於附加到當前線程的窗口,因此您不能使用它來激活其他應用程序。

您可以從另一個應用程序將窗口帶到SetForegroundWindow的前臺。這隻有在你的應用程序目前處於前臺時纔有效,但從你的問題來看,似乎是這樣。

+0

讓我回到與SwitchToThisWindow相同的地方。但是當窗口最小化時它不起作用。 – 2010-02-23 18:52:44

1

激活父代後,您必須發送WM_MDIACTIVATE message來激活特定的MDI子窗口。將手放在MDI子窗口手柄上應該具有挑戰性。

+0

謝謝,但只是獲得父窗口就足夠了。 – 2010-02-23 18:56:15

+0

改爲使用SetForegroundWindow()。 – 2010-02-23 19:16:18

1

您可以使用IsIconic(hWnd)檢測窗口是否已最小化,然後發送ShowWindow(hWnd, SW_RESTORE)以恢復最小化窗口。最後使用SetForegroundWindow(hWnd)將窗口放在前面。

這是卡爾彼得森的一些excellent VB6,它爲你做的一切。

0

您可以使用我的答案中的一些代碼:Correct way (in .NET) to switch the focus to another application,只需將設置的活動窗口聲明更改爲設置的前景窗口函數,也可以嘗試對ShowWindow函數使用不同的枚舉。

Visual Basic 6的定義

Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As Long) As Long 

的Visual Basic .NET定義

Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As Integer) As Integer 

C#定義

[DllImport("user32.dll")] public static extern int SetForegroundWindow(int hwnd) 

如果你的目標心不是使用user32.dll中進口,那麼你的非常麻煩,因爲您的應用程序無法訪問目標應用程序以實現它成焦點,你將需要使用Windows。

或者你可以使用某種進程間通信系統(關鍵詞:.NET遠程處理)和代碼的焦點片段注入目標applciation,然後從你的應用程序只發送焦點消息給你的第二個應用