무수히 많은 다른 user32 함수를 시도하고 상당히 광범위하게 온라인을 조사했지만이 작업을 수행하는 방법에 대해 궁금합니다. 그러나 불행히도 나는이 문제를 해결할 수 없었습니다. 해결책은 아직 없습니다.스레드의 보이는 창 제목 얻기
5 개의 스레드가있는 응용 프로그램이 있습니다. 이러한 스레드는 .NET 프로세스 클래스 인 GetProcessById 메서드를 통해 쉽게 액세스 할 수 있으며 프로세스의 PID를 제공합니다. 그러나 스레드 ID를 제공하고 창 (부모 또는 자식)을 열거하는 데 사용할 수있는 함수가없는 것으로 나타났습니다. 이 스레드 중 하나에는 총 10 개의 창 (9 개는 숨김)이 표시됩니다. 보이는 스레드의 제목은 프로그래밍 방식으로 얻으려는 것입니다.
최근의 접근 방식은 프로세스 핸들을 가져 와서 EnumChildWindows를 통해 처리하고 각 창 핸들을 컬렉션에 추가하는 방법입니다.하지만 컬렉션은 항상 비어 있습니다.
거기에 뭔가 내가 놓친 거지 :
는 여기가 ProcessThreadsView 도구에 표시되는 내용의 스크린 샷입니까? 나는 그가 어떻게하고 있는지보기 위해 도구의 저자에게 전자 메일을 보냈지 만, 나는 당신에게 설치 방법이 있는지를 물어볼 것이라고 생각했다.
업데이트 :
[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를 사용
, 이것은 내가있어 무엇 : 나는이 내가 그것을 호출하고 어떻게, GetGUIThreadInfo를 사용하여 시도했다
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 이것이 사실이라면 스레드는 어떤 최상위 창에도 붙어 있지 않습니다. –
콜백은 귀하의 코드와 매우 비슷한 코드로 실행되지 않습니다 (위의 업데이트 2). 나는 콜백 인라인을 추가하고 하나를 선언하고 그것을 모든 EnumThreadWindows 호출에 전달하려고 시도했다. –