2009-03-27 36 views
5

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.

Trả lời

0

không ShowWindow (youwindow, SW_SHOWNORMAL) hoạt động? -don

+0

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

0

Bạn sẽ thấy rằng BringWindowToTop hoặc SetForegroundWindow có các yêu cầu phải được đáp ứng trước khi cửa sổ thực sự bị buộc phải đứng trước tất cả các cửa sổ (ứng dụng) khác. Nếu chúng không được đáp ứng, Windows sẽ chỉ flash biểu tượng của ứng dụng trong thanh tác vụ. This bài viết trình bày một cách xung quanh đó nhưng như 1800 THÔNG TIN chỉ ra, nó không được khuyến khích. Tôi đoán bạn sẽ phải chấp nhận nó.

+0

Đừng làm điều này. Raymond Chen giải thích lý do tại sao điều này thường khiến ứng dụng của bạn bị treo: http://blogs.msdn.com/oldnewthing/archive/2008/08/01/8795860.aspx –

+0

Cảm ơn bạn. Tôi đã chỉnh sửa câu trả lời của mình. –

7

Bạn không thể lấy cắp tiêu điểm. Giai đoạn.

Xem Old New Thing bài viết này:

https://blogs.msdn.microsoft.com/oldnewthing/20090220-00/?p=19083

+1

Cảm ơn bạn, tôi đã tìm kiếm bài viết này như là câu trả lời cho câu hỏi này.Xin vui lòng tất cả mọi người mà đọc này, nội bộ hóa nó và sửa chữa các meme virus cố gắng để ăn cắp kích hoạt tiền cảnh. Nhưng ứng dụng của tôi là đặc biệt! Ứng dụng của bạn là thù địch của người dùng. Đừng làm thế! –

+1

Tôi đồng ý và mặc dù trong tất cả khả năng mui xe này áp dụng cho tác giả, anh ta (hoặc ai đó khác) có thể có lý do chính đáng để cần chức năng này (hệ thống kín, riêng hoặc máy tính ở nhà). Đưa ra đề xuất về cách sử dụng nhưng không ẩn thông tin. –

+1

Tôi hy vọng rằng Microsoft sẽ - một ngày nào đó - cuối cùng sửa chữa tất cả sự ăn cắp lấy nét một lần và mãi mãi. Các lập trình viên đang tập trung ăn cắp nên được gửi đến Siberia. Khỏa thân. – snemarch

7

Andrew là không hoàn toàn chính xác. Windows không thực sự cố gắng ngăn bạn lấy cắp tập trung, nhưng có thể sử dụng phương pháp folowing.

  1. Đính kèm với chuỗi cửa sổ hiện đang tập trung.
  2. Đưa cửa sổ của bạn vào tiêu điểm.
  3. Tách khỏi chủ đề.

Và mã cho rằng sẽ đi một cái gì đó như thế này:

DWORD dwCurrentThread = GetCurrentThreadId(); 
DWORD dwFGThread  = GetWindowThreadProcessId(GetForegroundWindow(), NULL); 


AttachThreadInput(dwCurrentThread, dwFGThread, TRUE); 

// Possible actions you may wan to bring the window into focus. 
SetForegroundWindow(hwnd); 
SetCapture(hwnd); 
SetFocus(hwnd); 
SetActiveWindow(hwnd); 
EnableWindow(hwnd, TRUE); 

AttachThreadInput(dwCurrentThread, dwFGThread, FALSE); 

Bạn có thể hoặc không cần phải chạy chương trình của bạn với quyền quản trị để làm việc này, nhưng tôi đã sử dụng này mã cá nhân và nó đã hoàn thành công việc.

+0

Điều này không hoạt động trong Windows 10 1703 (Bản cập nhật của người sáng tạo) –

Các vấn đề liên quan