私はこれをやってみたいと思っていました。私は無数のさまざまなuser32関数を試してきましたが、非常に幅広くオンラインで研究しましたが、残念ながら私は解決策はまだありません。スレッドの可視ウィンドウのタイトルを取得する
5つのスレッドを持つアプリケーションがあります。これらのスレッドは、プロセスのPIDを提供する.NET ProcessクラスのGetProcessByIdメソッドを介して簡単にアクセスできます。しかし、スレッドIDを提供し、そのウィンドウ(親または子)を列挙するために使用できる関数があるとは思われません。これらのスレッドの1つには、合計10個のウィンドウがあり、9個のウィンドウが表示され、1個のウィンドウが表示されます。表示されているスレッドのタイトルは、プログラムで取得しようとしているものです。
私の最近のアプローチは、プロセスハンドルをつかんで、EnumChildWindowsを通してそれを置いて、それぞれのウィンドウハンドルをコレクションに追加しようとしましたが、コレクションは常に空です。ここで
は、私がProcessThreadsViewツールで見るもののスクリーンショットです:
は、私が行方不明です何かはありますか?彼がどのようにしているのかを知るためにツールの作者に電子メールを送りましたが、確立されたアプローチがあるかどうかを聞いてみました。
アップデート:私はこれは私がそれを呼び出しています方法です、GetGUIThreadInfoを使用して試してみました:
[StructLayout(LayoutKind.Sequential)]
public struct Rect
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
[StructLayout(LayoutKind.Sequential)]
public struct GUITHREADINFO
{
public uint cbSize;
public uint flags;
public IntPtr hwndActive;
public IntPtr hwndFocus;
public IntPtr hwndCapture;
public IntPtr hwndMenuOwner;
public IntPtr hwndMoveSize;
public IntPtr hwndCaret;
public Rect rcCaret;
}
static IEnumerable<IntPtr> EnumerateThreadWindowHandlesByProcessId(int processId)
{
List<IntPtr> threadWindowHandles = new List<IntPtr>();
foreach (ProcessThread thread in Process.GetProcessById(processId).Threads)
{
GUITHREADINFO threadInfo = new GUITHREADINFO();
threadInfo.cbSize = (uint)Marshal.SizeOf(threadInfo);
bool returnValue = GetGUIThreadInfo((uint)thread.Id, out threadInfo);
threadWindowHandles.Add(threadInfo.hwndActive);
}
return threadWindowHandles;
}
アップデート2:EnumThreadWindowsを使用して
、これは私が持っているものです。
public delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam);
[DllImport("user32.dll")]
static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn, IntPtr lParam);
private static bool ThreadWindows(IntPtr handle, IntPtr param)
{
//get window from handle later, testing for now
logger.Info("foo bar");
return true;
}
[STAThread]
public void Execute()
{
Process[] processes = Process.GetProcessesByName("MyProcessName");
Process processOfInterest = processes[0];
foreach (ProcessThread thread in processOfInterest.Threads)
{
EnumThreadWindows(thread.Id, new EnumThreadDelegate(ThreadWindows), IntPtr.Zero);
}
}
私はEnumThreadWindowsとEnumChildWindowsの両方を試しました。どちらも私のスレッドには何も返しません。 –
@mikelこれが真の場合、スレッドはトップレベルのウィンドウには添付されません。 –
あなたのコードによく似たコードでコールバックが実行されることはありません(上記のUpdate 2)。コールバックをインラインで追加し、単一のものを宣言して、それをすべてのEnumThreadWindows呼び出しに渡すことを試みました。 –