Tengo el mango para una ventana determinada. ¿Cómo puedo enumerar sus ventanas secundarias?¿Cómo puedo obtener las ventanas secundarias de una ventana dado su HWND?
Respuesta
que he encontrado la mejor solución sea Managed WindowsAPI. Tenía un control CrossHair que se podía usar para seleccionar una ventana (no parte de la pregunta), y un método AllChildWindows para obtener todas las ventanas secundarias que probablemente envolvían la función EnumChildWindows. Mejor no reinventar la rueda.
Uso:.
internal delegate int WindowEnumProc(IntPtr hwnd, IntPtr lparam);
[DllImport("user32.dll")]
internal static extern bool EnumChildWindows(IntPtr hwnd, WindowEnumProc func, IntPtr lParam);
obtendrá devoluciones de llamada de la función se pasa en
Uso EnumChildWindows, con p/invocar. Aquí hay un enlace interesante sobre su comportamiento: https://blogs.msdn.microsoft.com/oldnewthing/20070116-04/?p=28393
Si no conoce el manejo de la ventana, pero solo su título, deberá usar EnumWindows. http://pinvoke.net/default.aspx/user32/EnumWindows.html
Aquí hay una alternativa administrada a EnumWindows, pero igual necesitará usar EnumChildWindows para encontrar el manejador de la ventana secundaria.
foreach (Process process in Process.GetProcesses())
{
if (process.MainWindowTitle == "Title to find")
{
IntPtr handle = process.MainWindowHandle;
// Use EnumChildWindows on handle ...
}
}
Estoy tratando de hacer esto, pero no hay una ventana principal para el proceso. – Epu
Epu, si no hay una ventana principal, entonces el proceso no tendrá un identificador de ventana para obtener (es decir, Process.MainWindowHandle == IntPtr.Zero). –
Here que tienen una solución de trabajo:
public class WindowHandleInfo
{
private delegate bool EnumWindowProc(IntPtr hwnd, IntPtr lParam);
[DllImport("user32")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr lParam);
private IntPtr _MainHandle;
public WindowHandleInfo(IntPtr handle)
{
this._MainHandle = handle;
}
public List<IntPtr> GetAllChildHandles()
{
List<IntPtr> childHandles = new List<IntPtr>();
GCHandle gcChildhandlesList = GCHandle.Alloc(childHandles);
IntPtr pointerChildHandlesList = GCHandle.ToIntPtr(gcChildhandlesList);
try
{
EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
EnumChildWindows(this._MainHandle, childProc, pointerChildHandlesList);
}
finally
{
gcChildhandlesList.Free();
}
return childHandles;
}
private bool EnumWindow(IntPtr hWnd, IntPtr lParam)
{
GCHandle gcChildhandlesList = GCHandle.FromIntPtr(lParam);
if (gcChildhandlesList == null || gcChildhandlesList.Target == null)
{
return false;
}
List<IntPtr> childHandles = gcChildhandlesList.Target as List<IntPtr>;
childHandles.Add(hWnd);
return true;
}
}
Como consumir:
class Program
{
[DllImport("user32.dll", EntryPoint = "FindWindowEx")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
static void Main(string[] args)
{
Process[] anotherApps = Process.GetProcessesByName("AnotherApp");
if (anotherApps.Length == 0) return;
if (anotherApps[0] != null)
{
var allChildWindows = new WindowHandleInfo(anotherApps[0].MainWindowHandle).GetAllChildHandles();
}
}
}
¿cómo puedo obtener user32.dll? – jai
@jai Es una biblioteca de Windows, ya está presente y registrada en su máquina. Ese código debería funcionar sin la necesidad de referencias adicionales. –
gracias @caffe .... Pero en realidad si uso user32.dll, la aplicación pide algún tipo de permiso ... donde no puedo ejecutar la aplicación ... ¿cómo puedo resolver eso ... – jai
- 1. ¿Cómo puedo verificar si una ventana tiene barras de desplazamiento visibles usando su HWND?
- 2. WM_EX_TRANSPARENT no vuelve a pintar las ventanas secundarias
- 3. Cómo obtener hWnd de la ventana abierta por ShellExecuteEx .. hProcess?
- 4. ¿Cómo encuentro la posición/ubicación de una ventana dado un hWnd sin NativeMethods?
- 5. Cómo vincular las ventanas secundarias a la ventana primaria en posiciones relativas?
- 6. Cómo obtener las referencias de todas las ventanas secundarias ya abiertas
- 7. Obtener hWnd de la ventana/formulario actual en VB6?
- 8. Windows: ¿cómo obtener una lista de todas las ventanas visibles?
- 9. ¿Cómo implemento arrastrando una ventana usando su área de cliente?
- 10. Cómo obtener el nombre del ejecutable de una ventana
- 11. Obtener identificadores para todas las ventanas de un proceso
- 12. ¿Cómo puedo detectar cuándo se abren nuevas ventanas y/u obtener una lista de ventanas abiertas?
- 13. Dado el nombre de una propiedad, ¿cómo puedo crear un delegado para obtener su valor?
- 14. ¿Cómo obtener la instancia de hWnd of Window?
- 15. Cómo obtener un HWND manejar fuera de un System.Windows.Forms.Form
- 16. ¿Puedo obtener el comportamiento de establecer el propietario de mi formulario WinForms usando un hwnd/NativeWindow?
- 17. De HWND para controlar
- 18. ¿Las ventanas Win32 son seguras?
- 19. ¿Es posible obtener el Hwnd de un control emergente WPF?
- 20. ¿Cómo se especifican las acciones principales y secundarias para una ventana modal de Bootstrap?
- 21. Obtener hwnd por identificación del proceso C++
- 22. ¿Cómo puedo imprimir ventanas minimizadas?
- 23. ¿Cómo cambiar las ventanas de WPF?
- 24. ¿Cómo puedo llamar a un método dado solo su nombre?
- 25. ¿Cómo obtener el valor de una variable dado su nombre en una cadena?
- 26. Obtiene las Manillas de la ventana de la aplicación
- 27. HWND Creation Time
- 28. Cómo obtener dos ventanas con diferentes gráficos
- 29. minimizar todas las ventanas abiertas en C#
- 30. ¿Cómo obtener la lista de todos los identificadores de ventanas en Java (usando JNA)?
en general. Puedo obtener el HWND de la ventana desde la que me gustaría enumerar. –
Excelente: he actualizado su pregunta para dejar esto en claro. – Shog9
supongamos que sabes sobre spy ++. Herramienta útil para trabajar con esto. – David