Tôi đang làm việc trên một ứng dụng xảy ra là bộ khởi động cho trình cài đặt mà tôi cũng đang làm việc. Ứng dụng này thực hiện một vài cuộc gọi MSI để nhận thông tin mà tôi cần để đặt cùng trình hướng dẫn là cửa sổ chính của ứng dụng, làm cửa sổ tiến trình mở trong khi thông tin đang được thu thập và sau đó biến mất sau khi hoàn tất. Sau đó, trình hướng dẫn được thiết lập và khởi chạy. Vấn đề của tôi là trình hướng dẫn (có nguồn gốc từ CPropertySheet) không muốn đến trước và là ứng dụng đang hoạt động mà không cần tôi thêm vào một số cuộc gọi để làm như vậy.Làm cách nào để buộc ứng dụng của tôi tiến lên phía trước và tập trung?
tôi đã giải quyết được vấn đề đưa nó vào phía trước với đoạn mã sau vào) phương pháp của tôi OnInitDialog (:
SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); // force window to top
SetWindowPos(&wndNoTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); // lose the topmost status that the previous line gave us
Vấn đề của tôi là tôi vẫn chưa tìm ra cách để làm cho cửa sổ tự kích hoạt (ví dụ, làm cho chính nó là một trong đó có trọng tâm). SetFocus() sẽ không hoạt động trong ngữ cảnh này. Tôi cần cái gì đó sẽ buộc cửa sổ lên trên cùng của thứ tự Z và kích hoạt nó, tốt nhất là trong vài cuộc gọi càng tốt.
Tôi đoán là cửa sổ tiến trình được mở lúc đầu bởi các cuộc gọi MSI đang làm cửa sổ chính bị hỏng, nhưng tôi không có cách nào ngăn cửa sổ đó xuất hiện. Ngoài ra, nó sẽ không có ý nghĩa để ẩn nó, bởi vì nó cho phép người dùng biết những gì đang xảy ra trước khi cửa sổ chính đến.
Chưa thử, nhưng tôi đoán rằng nó không hiệu quả hơn BringWindowToTop(). (Xem bình luận của tôi về câu trả lời của Mitch Wheat.) – RobH