Câu trả lời ngắn gọn là không có cách nào liên tục tạo cửa sổ theo phương thức B của luồng B cho một cửa sổ trong chuỗi A, ngay cả khi các chuỗi trong cùng một quy trình. Nếu bạn sở hữu mã cho cả hai cửa sổ, bạn có thể đến gần, nhưng trong trường hợp đó bạn sẽ đạt được kết quả tốt hơn nhiều cho nỗ lực bằng cách đặt tất cả giao diện người dùng của bạn trong một chuỗi.
Nếu bạn cố gắng gợi ý cho người dùng rằng cửa sổ của luồng B là phương thức cho luồng A, có rất nhiều hành vi thứ tự và kích hoạt Z tinh tế mà bạn phải nhận được (như bạn đã chú ý). hiệu ứng -valley của các loại, nơi mà nó rõ ràng cho người dùng rằng cửa sổ của thread B đang cố gắng để được một cái gì đó nó không và do đó có vẻ bị hỏng.
Để tránh điều đó, tôi sẽ áp dụng cách này:
- Người dùng nhấp chuột vào "FDA kiểm tra" trong cửa sổ chính của canner.exe. canner.exe cho thấy một hộp thoại phương thức chỉ ra rằng nó đang mở một chương trình bên ngoài ("Mở Cài đặt Botulism ..."). Việc này sẽ vô hiệu hóa cửa sổ chính, v.v. để người dùng biết một tương tác phương thức đang diễn ra.
- canner.exe gọi ShellExecuteEx() để bắt đầu botulism.exe.
- canner.exe gọi WaitForInputIdle() trên tay cầm được trả về từ ShellExecuteEx(). WaitForInputIdle() sẽ trả về (xấp xỉ, nhưng thường đủ gần) khi botulsim.exe sẵn sàng cho tương tác người dùng. Nếu botulism.exe thường mất năm giây trở lên để hiển thị giao diện người dùng của nó, tôi có thể sử dụng một thời gian chờ ngắn với WaitforInputIdle() trong một vòng lặp và đôi khi xử lý bất kỳ thư đang chờ xử lý nào với PeekMessage()/ProcessMessage().
- canner.exe thay đổi văn bản hộp thoại của nó để phản ánh rằng nó đang chờ người dùng đóng botulism.exe ("Đóng Cài đặt Botulism để tiếp tục ...").
- canner.exe gọi MsgWaitForMultipleObjects() trong một vòng lặp để đợi cho đến khi botulsim.exe đóng. MsgWaitForMultipleObjects() sẽ trở lại khi các chốt được truyền đi được báo hiệu hoặc khi có các thông báo đang chờ trong hàng đợi của luồng.
- Nếu người dùng nhấp vào hộp đóng trong hộp thoại phương thức của canner.exe trong khi canner.exe đang chờ, canner.exe sẽ nhắc người dùng botulism.exe vẫn đang chạy ("Cài đặt Botulism vẫn mở, tiếp tục không?", " Vâng, tôi biết "hoặc" Không, tôi không làm "). Nếu được xác nhận, canner.exe đóng hộp thoại và hủy kiểm tra FDA ban đầu bắt đầu ở bước 1 và trở về vòng lặp tin nhắn của cửa sổ chính.
- Khi MsgWaitForMultipleObjects() chỉ ra rằng botulism.exe xong, canner.exe đóng hộp thoại và tiếp tục bình thường với công tác kiểm tra FDA bắt đầu ở bước 1.
Bằng cách này, nếu mọi thứ tiến hành bình thường và nhanh chóng, tương tác cũng có thể liền mạch, nhưng nếu xảy ra sự cố với quy trình con hoặc thứ tự Z bị thay đổi, v.v. sẽ rõ ràng lý do quy trình gốc đang chờ và những gì người dùng cần thực hiện để hủy hoặc tiếp tục với nhiệm vụ anh ta bắt đầu.
Nguồn
2009-03-10 01:23:12
Yêu cầu chỉnh sửa: thay đổi tiêu đề thành "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 theo cách thức trong quá trình của tôi?". Tiêu đề hiện tại của bạn không phản ánh sự khác biệt giữa việc tạo một cửa sổ con và chuyển cửa sổ của bạn sang một quy trình khác (xem SetParent()) –