C#GetForegroundWindow()
は、複数のウィンドウに対して同じ結果を返しますが、EnumWindows
実際にはそのウィンドウをまったく返しません。各プロセスには、実際には独自の層があります。
また、両方のGetWindowThreadProcessId()
関数を調べて、それらをで列挙しましたGetChildWindows()
が、それでも、と同じウィンドウを返しませんGetForegroundWindow()
。
どのようにして適切に開始しGetForegroundWindow()
、適切なものから取得するものに変換しますEnumWindows
か?
目標:GetForegroundWindow
+適切に列挙して、適切なトップレベルのハンドル(クロムのすべてのタブ、プロジェクトフォーム)を取得しますが、混乱をふるいにかける必要はありGetAllWindows()
ません。ありがとう。
private ArrayList GetAllWindows()
{
var windowHandles = new ArrayList();
EnumedWindow callBackPtr = GetWindowHandle;
EnumWindows(callBackPtr, windowHandles);
foreach (IntPtr windowHandle in windowHandles.ToArray())
{
EnumChildWindows(windowHandle, callBackPtr, windowHandles);
}
return windowHandles;
}
private delegate bool EnumedWindow(IntPtr handleWindow, ArrayList handles);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool EnumWindows(EnumedWindow lpEnumFunc, ArrayList lParam);
[DllImport("user32")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool EnumChildWindows(IntPtr window, EnumedWindow callback, ArrayList lParam);
List<IntPtr> ids = new List<IntPtr>();
private bool GetWindowHandle(IntPtr windowHandle, ArrayList windowHandles)
{
windowHandles.Add(windowHandle);
listBox1.Items.Add(windowHandle);
//ids.Add(GetWindowThreadProcessId(windowHandle, IntPtr.Zero));
return true;
}