2013-04-10 39 views
7

Tôi cần khôi phục ("không giảm thiểu") cửa sổ WPF đã được tạo nhưng cửa sổ hiện đang ở trên cùng (không nhất thiết là WPF)) không thể mất tập trung hoặc kích hoạt. Tôi đã thử sử dụng tất cả các chức năng WIN32 tôi có thể tìm thấy, không có kết quả. Bắt thực sự thất vọng bởi bây giờ, sẽ thực sự đánh giá cao bất kỳ con trỏ và lời khuyên.Cách khôi phục cửa sổ mà không lấy nét bằng cách sử dụng WPF (hoặc interop)

Rõ ràng chỉ thay đổi thành WindowState.Normal trong WPF không cắt nó vì điều này làm cho cửa sổ nhận được tiêu điểm và kích hoạt là tốt. Tôi cũng đã thử tất cả các loại kết hợp với thiết lập HiddenIsEnabled trong khi khôi phục.

Tôi đã thử WIN32 SetWindowPos với HWND_TOP, HWND_TOPMOST vv nhưng chức năng này không nhằm khôi phục các cửa sổ và sẽ chỉ thay đổi vị trí của các cửa sổ "đã hiển thị".

Đã thử WIN32 ShowWindowSetWindowPlacement nhưng cũng không có may mắn. Cố gắng một nỗ lực tuyệt vọng tại thêm một HwndHook để thử và lắng nghe cho WM_SETFOCUS và khôi phục tập trung vào cửa sổ ban đầu nhưng tôi chỉ nhận được số không cho xử lý cửa sổ tập trung cuối cùng ..

Edit - Giải pháp với phần mở rộng cửa sổ sau khi tip từ Joel Lucsy :

public static class RestoreWindowNoActivateExtension 
{   
    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    static extern bool ShowWindow(IntPtr hWnd, UInt32 nCmdShow); 

    private const int SW_SHOWNOACTIVATE = 4; 

    public static void RestoreNoActivate(this Window win) 
    { 
     WindowInteropHelper winHelper = new WindowInteropHelper(win); 
     ShowWindow(winHelper.Handle, SW_SHOWNOACTIVATE); 
    } 
} 
+0

Bạn có thể đăng mã hiện tại của mình không? –

+0

Tôi có thể đăng mã nếu bạn thực sự cảm thấy nó cần thiết nhưng vì nó chỉ là một mớ hỗn độn của các nỗ lực bằng cách sử dụng các cuộc gọi khác nhau nó không thực sự nhiều để xem xét. Sẽ đăng một cái gì đó nếu tôi làm cho nó hoạt động tuy nhiên .. – Niclas

Trả lời

6

Gọi ShowWindow đi qua các SW_SHOWNOACTIVATE cờ.

+0

Tôi đã thực sự cố gắng để thực hiện điều này đi qua tất cả các kết hợp của các thông số mà tôi có thể nghĩ đến. Bởi bây giờ tôi tự tin rằng SetWindowPos không thể được sử dụng để khôi phục lại một cửa sổ, nhưng tôi rất thích được chứng minh sai :) – Niclas

+1

Làm thế nào về ShowWindow với SW_SHOWNOACTIVATE? –

+0

+1 Tôi đã chỉnh sửa câu trả lời của bạn để đưa vào câu trả lời đúng. Không có điểm nào để lại câu trả lời ban đầu ở đó mà không có tác dụng. –

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