2014-08-30 48 views
1

我有一個程序在後臺運行,當出現問題時會出現一個消息框,我想要它,所以單擊yes將切換到指定的程序。SetForegroundWindow不工作,如何檢查類/標題名稱

我只是找不到什麼ClassName和CaptionName與它一起工作,我需要它與魔獸世界的遊戲一起工作。

窗口標題是魔獸世界的任務管理器,它被稱爲「魔獸世界零售」,當我檢查它的屬性它說的「哇-64」屬性,它說產品名稱是「World of魔獸「,所以我已經嘗試了這些和沒有任何作品的每一個組合。如果我把代碼的作品:
BringToFront(「記事本」,「無標題 - 記事本」);

所以它的工作原理,我只是不知道我需要什麼來適用於魔獸世界。

我的代碼是:

[DllImport("User32.dll")] 
    public static extern Int32 SetForegroundWindow(int hWnd); 
    [DllImport("user32.dll")] 
    public static extern int FindWindow(string lpClassName, string lpWindowName); 

    private void BringToFront(string className, string CaptionName) 
    { 
     SetForegroundWindow(FindWindow(className, CaptionName)); 
    } 

    private void Alert() 
    {   
     string title = "WoW Queue Alert: Message"; 
     string message = "The Queue is ready to accept!"; 
     MessageBoxButtons buttons = MessageBoxButtons.YesNo; 
     DialogResult result; 

     result = MessageBox.Show(new Form() { TopMost = true }, message, title, buttons, MessageBoxIcon.Information); 
     if (result == System.Windows.Forms.DialogResult.Yes) 
     { 
     BringToFront("World of Warcraft Retail", "World of Warcraft"); 
     } 
    } 

我真的沒有看到關於WOW什麼特別的東西,並通過記事本例是如何工作的正確的代碼會應該是:

  BringToFront("World of Warcraft Retail", "World of Warcraft"); 

作爲全屏程序應該會影響它,而且我也看不到暴雪已經實施了一些東西來阻止這個功能。

編輯:我只是將ClassName設置爲null並且工作,因爲標題名稱只是窗口標題。不知道ClassName是什麼,我嘗試了所有我能找到的東西。

+0

什麼是FindWindow返回? – DavidG 2014-08-30 16:05:10

+0

當您調用winapi函數時,錯誤檢查是* not * optional。你沒有友善。NET的例外,以防止麻煩了,你必須自己提出。 – 2014-08-30 17:29:59

回答

0

你應該使用一些窗口檢查工具來檢查魔獸世界的窗口來獲得它的Class NameWindow Name。如果您安裝了Visual Studio(它附帶),建議爲Spy++。它可以幫助您檢測窗口的Class NameWindow Name,以及輕鬆發送到該窗口的Windows消息。

例如,下圖顯示了當前環境中的所有窗口。突出顯示的條目是一個PowerPoint實例,它具有Caption =「Microsoft PowerPoint」和ClassName =「PPTFrameClass」。

spy++

另一種方法將被寫入一個「永遠滅活」的WinForm和呼叫GetForegroundWindow從形式得到你想要的窗口的窗口句柄。

要創建一個「永遠滅活」的winform,只是覆蓋CreateParams屬性:

protected override CreateParams CreateParams 
{ 
    get 
    { 
     CreateParams p = base.CreateParams; 

     p.ExStyle |= 0x8000000; // WS_EX_NOACTIVATE - requires Win 2000 or higher 

     return p; 
    } 
} 

通過重寫此,形式將不會集中即使是在鼠標點擊。因此,您可以創建一個按鈕來觸發GetForegroundWindow()。 C#中函數的簽名如下所示:

[DllImport("user32.dll")] 
public static extern IntPtr GetForegroundWindow(); 

它返回當前前臺窗口的窗口句柄。

+0

我使用的Visual Studio Express似乎沒有間諜++我下載了這個:http://web.archive.org/web/20090916053057/http://www.windows-spy.com/這是爲了做所有Spy ++都會做,但是作爲一個外部程序,並且我看不到顯示的信息是類/標題名稱。 – bob 2014-08-30 17:29:37

+0

我編輯我的文章,包括間諜++的屏幕截圖,你看到這樣的事情? – nevets 2014-08-30 17:41:00

+0

我探索了你給出的鏈接,似乎應用程序給出了「Windows列表」中的類標題對。在窗口列表下,每個條目的內容如下:Handle-ClassName-CaptionName – nevets 2014-08-30 17:44:18