2009-03-12 4 views
3

タイトルは部分的に静的であり、可変接尾辞付きです。たとえば、「ウィンドウタイトル{ - user_id}」です。完全に知られていないタイトルのウィンドウのハンドルを取得します。 (C#)

正確なタイトルを知らずにハンドルを取得するにはどうすればよいですか?

+0

付録?私はサフィックスを意味すると思います。私はあなたのためにそれを修正します。 – Ray

答えて

12

すべてのプロセスを確認し、MainWindowTitleを確認してください。

foreach(Process proc in Process.GetProcesses()) 
{ 
    if(proc.MainWindowTitle.StartsWith("Some String")) 
    { 
     IntPtr handle = proc.MainWindowHandle; 
     // ... 
    } 
} 
+1

興味深い。ほとんどの場合に動作するはずです。しかし、プロセスに複数のトップlavelウィンドウがある場合はどうなりますか? –

+0

@ Serge:正確にはわからない... –

+0

ありがとう!うわー、私はあなたがこれを回避してWin32 APIの不具合を避けることはできないことを知らなかった。 – Jonas

5

This CodeProject articleは、トップレベルウィンドウを列挙する方法を説明しています(Win32 API EnumWindowsに基づいています)。 これを簡単に変更して、部分的なウィンドウタイトルでフィルタリングすることができます。EnumWindowsCallBackを変更します。

HTH。

2

(あなたは正規表現、またはStartsWith、などを使用することができます)、クラス名と親ウィンドウハンドルを取得します。たとえば、win32apiを使用してstartボタンを取得します。まず、spyxxツールを使用して親ウィンドウのクラス名を知っている。

[DllImport("user32.dll")] 
public static extern IntPtr FindWindowEx(IntPtr handleParent, IntPtr handleChild, string className, string WindowName); 
[DllImport("user32.dll")] 
public static extern IntPtr FindWindow(string className, string windowTitle); 

使用法:

IntPtr handle = FindWindowEx(FindWindow("Shell_TrayWnd",null), new IntPtr(0), "Button", null); 
関連する問題