2012-11-01 17 views
4

我正在運行一個小工具(在Windows 7,32位),我想看看在另一個應用程序中打開了哪個文檔,我試過這個,它適用於Windows上的NotePad。爲什麼另一個應用程序窗口的標題文本不正確?

 var myProcess = Process.GetProcessesByName("NotePad"); 
     string title = myProcess[0].MainWindowTitle; 
     MessageBox.Show(title); 

輸出爲:

 "New Text Document - Notepad" 

現在,如果我嘗試另一個應用程序它並不總是給我正確的標題,但我注意到,大多數Microsoft應用程序似乎要被罰款 - 記事本,寫字板,EXCEL等。這是另一個軟件,這是一個問題。它有一個很長的標題,但只是返回一個非常簡單的名字。

這是我從我的應用程序,它具有processName = 「FooBar的」 實際運行窗口有這件事上得到:

「FooBar的軟件爾鬆1.2 - 結果」

和我的代碼給出:

「FooBar」

有什麼想法嗎?

[編輯] 2012-11-19 這個問題的關鍵在於我試圖從窗口中獲取打開文件的名稱。現在看來,我正在使用的軟件沒有顯示在那裏。我發現一個名爲「AutoIT3 Window Spy」的程序可以獲取我需要的文本,因爲打開文件的文本位於窗口中,而不僅僅是標題中。我下載了源代碼(它是http://www.autohotkey.com/的一部分,它是開源的,似乎依賴於已經提出的許多建議,但目前我還無法弄清楚)。我正在查看的源代碼是C++而坐落在這裏https://github.com/AutoHotkey/AutoHotkey

所以我認爲,解決我的問題可能會在別的地方。這一個可以置之不理。

回答

0

開發人員已聲明如下:

「我認爲失敗的原因可能是在VB 6.0停產財產Form.Caption是用Form.Text在更換NET」

謝謝你們都爲你提供寶貴的建議!

2

主窗口的標題是你所看到的,當你去到任務管理器,看看描述列,而不是窗口標題本身

它是進程的標題,而不是進程中特定窗口的標題。給定進程可能有任意數量的窗口在一個時間。

如果您需要實際的窗口標題,你必須掛鉤USER32是這樣的:

using System; 
using System.Runtime.InteropServices; 
using System.Text; 
using System.Security; 



namespace Application 
{ 
public class Program 
{ 
    public static void Main () 
    { 
     IntPtr hwnd = UnsafeNativeMethods.FindWindow("Notepad", null); 
     StringBuilder stringBuilder = new StringBuilder(256); 
     UnsafeNativeMethods.GetWindowText(hwnd, stringBuilder, stringBuilder.Capacity); 
     Console.WriteLine(stringBuilder.ToString()); 
    } 
} 

[SuppressUnmanagedCodeSecurity] 
internal static class UnsafeNativeMethods 
{ 
    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
    internal static extern int GetWindowText (IntPtr hWnd, [Out] StringBuilder lpString, int nMaxCount); 
    [DllImport("user32.dll", SetLastError = true)] 
    internal static extern IntPtr FindWindow (string lpClassName, string lpWindowName); 
} 

}

+0

你能看到窗口本身或者是我的「Foobar」的代碼來設置過程描述嗎?我可以訪問編寫它的人,以便他們能夠調整它以使用我的工具? – Sisyphus

+0

實際的描述說明了完全不同的東西。它說「對於Anothe程序v 1.3」 – Sisyphus

+0

你現在在我的示例代碼中放置了「Foobar」,它現在有「記事本」。這應該給你一個指針。 – ScottRFrost

0

這有可能是「標題」你所看到的是某種形式的所有者 - 這個UI元素覆蓋了標題的可視化表示,而Windows API可能會忽略這種事情。

我建議用像Spy ++這樣的工具檢查窗口,看看是不是這種情況。

也有可能應用程序的作者決定覆蓋WM_GETTEXT消息並返回,而不是實際在標題欄中的內容,儘管我不能100%確定是否在此調用GetWindowText()以及是否它明確發送消息或以其他方式工作。

相關問題