0

プロセス名でウィンドウのタイトルを取得しようとしている問題があり、ここで試したことはできません:

Process[] p = Process.GetProcessesByName("Acrobat");
Console.WriteLine(p[0].MainWindowTitle);
Console.ReadLine();

しかし、問題は、関連するプロセスにメイン ウィンドウがある場合にのみ取得できることです。どうすれば動作させることができますか?

主な目標は、BringToFront() という名前のメソッドを作成することですが、このメソッドは「thenameofthePDF.pdf」というキャプション名を要求します - Adob​​e Acrobat Pro (はい、acrobat は開いている pdf で実行されています) 前面に表示したい私のAcrobatウィンドウ..しかし、このためには、メソッドがキャプションを要求しているため、ウィンドウの名前が必要です.これが現時点でのコード全体です:

class Program
{
    [DllImport("User32.dll")]
    public static extern Int32 SetForegroundWindow(int hWnd);

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

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

    static void Main(string[] args)
    {
        // BringToFront("Acrobat", "mypdf.pdf - Adobe Acrobate Pro");
        Process[] p = Process.GetProcesses();
        foreach (var process in p)
        {
           Console.WriteLine(process.MainWindowTitle);
        }
        Console.ReadLine();
    }
}
4

3 に答える 3

2

マニュアルを読みましたが、次の項目に該当しますか?

プロセスにグラフィカル インターフェイスがある場合にのみ、プロセスにメイン ウィンドウが関連付けられます。関連付けられたプロセスにメイン ウィンドウがない場合 (MainWindowHandle がゼロの場合)、MainWindowTitle は空の文字列 ("") になります。プロセスを開始したばかりで、そのメイン ウィンドウ タイトルを使用する場合は、WaitForInputIdle メソッドを使用してプロセスの開始を完了させ、メイン ウィンドウ ハンドルが作成されていることを確認することを検討してください。それ以外の場合、システムは例外をスローします。

于 2013-05-15T10:14:08.680 に答える
1

考えられる解決策の 1 つは、すべてのトップレベル ウィンドウを列挙し、関心のあるウィンドウを選択することです。あなたの場合、これはAcrobatSDIWindow、ドキュメント名で始まるクラスとウィンドウ タイトルを持つすべてのウィンドウになります。

class Program
{
    public class SearchData
    {
        public string ClassName { get; set; }
        public string Title { get; set; }

        private readonly List<IntPtr> _result = new List<IntPtr>();
        public List<IntPtr> Result
        {
            get { return _result; }
        }
    }

    [DllImport("User32.dll")]
    public static extern Int32 SetForegroundWindow(IntPtr hWnd);

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, ref SearchData data);

    private delegate bool EnumWindowsProc(IntPtr hWnd, ref SearchData data);

    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);

    public static bool EnumProc(IntPtr hWnd, ref SearchData searchData)
    {
        var sbClassName = new StringBuilder(1024);
        GetClassName(hWnd, sbClassName, sbClassName.Capacity);
        if (searchData.ClassName == null || Regex.IsMatch(sbClassName.ToString(), searchData.ClassName))
        {
            var sbWindowText = new StringBuilder(1024);
            GetWindowText(hWnd, sbWindowText, sbWindowText.Capacity);
            if (searchData.Title == null || Regex.IsMatch(sbWindowText.ToString(), searchData.Title))
            {
                searchData.Result.Add(hWnd);
            }
        }
        return true;
    }

    static void Main(string[] args)
    {
        var searchData = new SearchData 
            { 
                ClassName = "AcrobatSDIWindow", 
                Title = "^My Document\\.pdf.*"
            };

        EnumWindows(EnumProc, ref searchData);

        var firstResult = searchData.Result.FirstOrDefault();
        if (firstResult != IntPtr.Zero)
        {
            SetForegroundWindow(firstResult);
        }
    }
}
于 2013-05-15T12:03:53.060 に答える