2012-07-16 50 views
15

我正在尋找和SetForegroundWindow()切換到不同應用程序的舊User32.dll版本的替代品。FindWindow和SetForegroundWindow的替代?

我確實找到了第一個替代方案,使用Process.GetProcessesByName(),但是我沒有看到相應的方法來切換(設置活動/前景)到該應用程序。

有沒有辦法做到這一點,而不使用舊的方式與User32.dll

謝謝你的幫助。

編輯

我接受@Sorceri的答案,雖然它不是我一直在尋找的答案。

+2

這有什麼錯用'SetForegroundWindow'? Windows操作系統會跟蹤Win32子系統中的前臺窗口,所以無論如何,只要將其調用到'user32.dll'即可。 – 2012-07-16 23:42:47

+0

@MichaelGraczyk:或者至少,我們假設安全...... :) – 2012-07-17 00:26:30

+1

在Windows桌面上,我必須在Windows CE上使用'user32.dll',我必須使用'coredll.dll'。因此,使用'DLLImport'總是會顯示您添加了錯誤的靜態依賴關係。 – fdomig 2012-07-17 08:27:20

回答

27

答:不可以

但是,以幫助下一wonderer希望找到一個窗口,並激活它從C#這裏是你必須做的:

[DllImport("user32.dll")] 
static extern bool SetForegroundWindow(IntPtr hWnd); 

void ActivateApp(string processName) 
{ 
    Process[] p = Process.GetProcessesByName(processName); 

    // Activate the first application we find with this name 
    if (p.Count() > 0) 
     SetForegroundWindow(p[0].MainWindowHandle); 
} 

爲了使記事本的前面,例如,您可以撥打:

ActivateApp("notepad"); 

作爲一個側面說明 - 對於那些你誰是試圖把一個Wi ndow 在您的應用程序到前臺只需撥打Activate() method

+0

因此,我用這種方法來調出所需的過程後,我可以使用SendKeys.SendWait(「{ENTER}」);毫無疑問,只要我的應用程序實際響應按鍵? – HanH1113 2014-07-28 19:42:18

+0

有關SendWait的文檔建議您可以 - 讓我們知道它是否可行! – noelicus 2014-07-28 20:26:29

+0

我試過了,奇怪的是它有效,有時候我覺得很奇怪。問題總是電腦做我們告訴他們的事,不一定是我們想要的。我可能不得不問一個全新的問題。 – HanH1113 2014-07-28 20:37:19

1

對於FindWindow等價物,您可以使用System.Diagnostics.Process Object。目前沒有相同的SetForegroundWindow。您將需要與SetForgroundWindow一起使用Pinvoke。

[DllImport("user32.dll")] 
static extern bool SetForegroundWindow(IntPtr hWnd); 
+1

這意味着我仍然必須處理user32.dll?它聽起來有點奇怪,沒有其他選擇... – fdomig 2012-07-16 21:30:02

3

你可以使用SetActiveWindow作爲替代SetForeGroundWindow。我會說你應該通過所有的Windows Manipulation Api Functions,看看有沒有你錯過的東西。

此外,請注意,您可以通過Process.Handle屬性獲取System.Diagnostics.Process對象的句柄。

2

到SetForeGroundWindow另一種方法是VisualBasic中的使用AppActivate

這樣稱呼它

Microsoft.VisualBasic.Interaction.AppActivate("WindowTitle") 

只是因爲它是在VisualBasic中命名空間並不意味着你不能在C#中使用它。

完整的文檔here