Tôi có tay cầm cho một cửa sổ cụ thể. Làm thế nào tôi có thể liệt kê các cửa sổ con của nó?Làm thế nào tôi có thể nhận được các cửa sổ con của một cửa sổ cho HWND của nó?
Trả lời
Tôi đã tìm thấy giải pháp tốt nhất là Managed WindowsAPI. Nó có một điều khiển CrossHair có thể được sử dụng để chọn một cửa sổ (không phải là một phần của câu hỏi), và một phương thức AllChildWindows để có được tất cả các cửa sổ con có khả năng bao bọc chức năng EnumChildWindows. Tốt hơn là không tái tạo lại bánh xe.
Sử dụng:.
internal delegate int WindowEnumProc(IntPtr hwnd, IntPtr lparam);
[DllImport("user32.dll")]
internal static extern bool EnumChildWindows(IntPtr hwnd, WindowEnumProc func, IntPtr lParam);
bạn sẽ nhận được callbacks về chức năng bạn vượt qua trong
Sử dụng EnumChildWindows, với p/gọi. Đây là một liên kết thú vị về một số hành vi của nó: https://blogs.msdn.microsoft.com/oldnewthing/20070116-04/?p=28393
Nếu bạn không biết xử lý cửa sổ, nhưng chỉ có tiêu đề, bạn cần sử dụng EnumWindows. http://pinvoke.net/default.aspx/user32/EnumWindows.html
Đây là giải pháp thay thế được quản lý cho EnumWindows, nhưng bạn vẫn sẽ cần phải sử dụng EnumChildWindows để tìm tay cầm của cửa sổ con.
foreach (Process process in Process.GetProcesses())
{
if (process.MainWindowTitle == "Title to find")
{
IntPtr handle = process.MainWindowHandle;
// Use EnumChildWindows on handle ...
}
}
Tôi đang cố gắng làm điều này, nhưng không có cửa sổ chính cho quá trình này. – Epu
Epu, nếu không có một cửa sổ chính thì quá trình sẽ không có một cửa sổ xử lý để có được (tức là Process.MainWindowHandle == IntPtr.Zero). –
Here bạn có một giải pháp làm việc:
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;
}
}
Làm thế nào để tiêu thụ nó:
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();
}
}
}
làm thế nào tôi có thể nhận user32.dll ?? – jai
@jai Đó là thư viện Windows, đã có và đã đăng ký trong máy của bạn. Mã đó sẽ hoạt động mà không cần thêm tài liệu tham khảo. –
nhờ @caffe .... Nhưng thực sự nếu tôi sử dụng user32.dll, ứng dụng yêu cầu một số loại quyền ... nơi tôi không thể chạy ứng dụng ... làm thế nào tôi có thể giải quyết được ... – jai
- 1. Gọi JavaScript của cửa sổ mẹ từ cửa sổ con
- 2. Làm thế nào để chạy chức năng của cửa sổ cha khi cửa sổ con đóng?
- 3. Làm cách nào tôi có thể đặt kích thước cửa sổ của cửa sổ lô?
- 4. Làm thế nào để chạy chức năng của cửa sổ cha khi cửa sổ con đóng?
- 5. Tại sao đóng cửa sổ con cuối cùng giảm thiểu cửa sổ chính của nó?
- 6. cách nhận các cửa sổ của NSRunningApplication
- 7. Cách đóng cửa sổ cha mẹ khỏi con của nó?
- 8. làm mới cửa sổ mẹ khi đóng cửa sổ con
- 9. Làm thế nào tôi có thể đóng băng trên một cửa sổ của JTabbedPane?
- 10. Làm thế nào tôi có thể ngăn Emacs thay đổi kích thước cửa sổ của tôi?
- 11. Làm thế nào tôi có thể phát hiện khi nào các cửa sổ mới được mở và/hoặc có danh sách các cửa sổ đang mở?
- 12. Làm cách nào để có cửa sổ gdk cho cửa sổ gtk trong C?
- 13. Tải lại cửa sổ cha mẹ từ cửa sổ con
- 14. Nhận màu nền của cửa sổ
- 15. Làm cách nào để tìm vị trí/vị trí của cửa sổ được cung cấp hWnd mà không có NativeMethods?
- 16. Nhận hWnd của cửa sổ/biểu mẫu hiện tại trong VB6?
- 17. WM_EX_TRANSPARENT không sơn lại cửa sổ con
- 18. Làm thế nào để có được một cửa sổ của WPF ClientSize?
- 19. Cửa sổ chính có thể được thông báo khi cửa sổ con đóng không? (trên một miền khác)
- 20. Làm thế nào bạn có thể đảm bảo cửa sổ bật lên cửa sổ bật lên twitter được hiển thị?
- 21. Làm thế nào tôi có thể kiểm tra xem Cửa sổ có thanh cuộn có thể nhìn thấy bằng HWND của mình không?
- 22. Làm thế nào tôi có thể làm cho cửa sổ API Win32 hiện đại hơn?
- 23. Làm thế nào tôi có thể làm cho một cửa sổ quy trình con xuất hiện một cách bình thường trong quá trình của tôi?
- 24. Cách tạo cửa sổ WPF không cửa sổ có thể kéo được mà không nhận được InvalidOperationException
- 25. Làm thế nào tôi có thể mô phỏng một nút bấm cho tay cầm vào cửa sổ của nút?
- 26. Làm thế nào tôi có thể thiết lập kích thước của cửa sổ cmd.exe từ chương trình Perl của tôi?
- 27. Làm thế nào tôi có thể xử lý một phím tắt trong mọi cửa sổ WPF?
- 28. Làm thế nào để có được một tiêu đề cửa sổ và quét nó mỗi 100ms sử dụng python?
- 29. Làm mới cửa sổ mẹ từ cửa sổ con trong javascript
- 30. Đầu ra con của Python trên cửa sổ?
Nói chung. Tôi có thể lấy HWND của cửa sổ mà tôi muốn liệt kê. –
Tuyệt vời - tôi đã cập nhật câu hỏi của bạn để làm rõ điều này. – Shog9
giả sử bạn biết về spy ++. Công cụ hữu ích để làm việc với công cụ này. – David