2008-09-25 22 views
8

Tôi muốn tạo Biểu mẫu .NET dưới dạng Biểu mẫu TopMost cho một Ứng dụng bên ngoài khác (không liên quan đến .NET, Win32 thuần túy) nên nó vẫn ở trên Win32App đó, chứ không phải phần còn lại của ứng dụng đang chạy.Làm thế nào để thay đổi một Chủ cửa sổ bằng cách sử dụng tay cầm

Tôi có xử lý của Win32App (được cung cấp bởi chính Win32App), và tôi đã thử Win32 SetParent() function, qua P/Invoke in C#, nhưng sau đó Mẫu .NET của tôi bị giới hạn trong Win32App và đó không phải là những gì tôi muốn.

Trả lời

12

Tôi nghĩ rằng bạn đang tìm kiếm là để P/Invoke SetWindowLongPtr(win32window, GWLP_HWNDPARENT, formhandle)

Google Search

+1

Vấn đề là tôi googled với từ "thay đổi chủ cửa sổ" thay vì tìm kiếm "thay đổi cửa sổ cha mẹ". :) –

+11

Tôi đã trả lời câu trả lời này nhiều lần khi nó trả lời câu hỏi sai, cho đến khi tôi đọc phần sau trong tài liệu msdn: "" Bạn không được gọi SetWindowLong với chỉ mục GWL_HWNDPARENT để thay đổi phụ huynh của cửa sổ con. Thay vào đó, hãy sử dụng hàm SetParent. "Câu lệnh này là gây hiểu nhầm. GWL_HWNDPARENT thay đổi OWNER, không phải là cha mẹ, của một cửa sổ. Nó an toàn để sử dụng cho mục đích đó." – bj0

2

Có! Tôi đã có một P/Invoke nhập khẩu của SetWindowLongPtr (đó là x64 an toàn). Và sử dụng Reflector tôi đã tìm kiếm trên tài sản Form.Owner (tức là phương pháp get_Owner (giá trị Form)) và quản lý để thay đổi chủ sở hữu với

SetWindowLongPtr(childHdl, -8, OwnerHdl) 

tôi đang tìm kiếm những gì -8 (0xFFFFFFFFFFFFFFF8) có nghĩa là trước khi tôi có thể đăng giải pháp ở đây, nhưng Joel đã chỉ ra nó.

Cảm ơn!