2010-03-08 44 views
14

Tôi đang cố tạo một "tiện ích" như ứng dụng bằng WPF. Mục đích là để có được những hành vi tương tự như một bình thường Windows 7 tiện ích:Tiện ích Windows trong WPF - hiển thị khi "Hiển thị màn hình" được kích hoạt

  • Không entry nhiệm vụ thanh
  • Không hiển thị khi bạn alt + tab cửa sổ
  • KHÔNG luôn luôn trên đầu, các ứng dụng có thể được trên đầu
  • Visible trong khi thực hiện 'Aero Peek'
  • Visible trong khi sử dụng 'Show desktop'/Windows + D

tôi đã có thể để hoàn thành bốn goa đầu tiên ls, nhưng đã không thể tìm thấy một giải pháp cho vấn đề thứ năm. Gần nhất tôi đã đến là bằng cách sử dụng lớp tiện ích từ How do you do AppBar docking (to screen edge, like WinAmp) in WPF?, nhưng điều này biến ứng dụng thành "thanh công cụ", do đó trục xuất các ứng dụng khỏi phần màn hình nơi GUI tiện ích của tôi được đặt.

Tôi có thể thấy rằng các câu hỏi tương tự đã được hỏi trước đây trên Stackoverflow, nhưng những câu hỏi đó đã chết trước khi tìm thấy giải pháp. Đăng nào với hy vọng rằng bây giờ có ai đó ngoài kia với những kiến ​​thức để giải quyết này =)

Trả lời

1

Hãy thử đặt trên cùng là true, và khi ứng dụng của bạn mất tập trung bạn có thể thiết lập Opacity đến 0.

Tôi đã làm điều này XAML:

<Window x:Class="OpacTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Topmost="True" Background="Transparent" ShowInTaskbar="False" AllowsTransparency="True" WindowStyle="None" Width="400" Height="300"> 
    <Grid> 
     <Border Background="Black" CornerRadius="5" /> 
    </Grid> 
</Window> 

tôi đã làm điều này trong C# cho Window:

protected override void OnActivated(EventArgs e) 
{ 
    base.OnActivated(e); 

    Opacity = 1; 
} 

protected override void OnDeactivated(EventArgs e) 
{ 
    base.OnDeactivated(e); 

    Opacity = 0; 
} 

này giúp bạn một phần của con đường đó; bạn cần một cách để biết liệu máy tính để bàn có tập trung hay không.

Tôi đặt cược bạn có thể làm điều này bằng cách tham gia vào sự kiện WndProc của cửa sổ máy tính để bàn và tìm WM_ACTIVATE.

Bạn có thể:

  • Gọi GetDesktopWindow để có được tay cầm của cửa sổ máy tính để bàn
  • Sử dụng ap/gọi cuộc gọi để thiết lập một cuộc gọi lại cho WndProc
  • Xử lý WM_ACTIVATE hoặc các cửa sổ thông báo thích hợp và thiết lập Opacity của bạn quay lại 1
+0

Điều này hoạt động thực sự. – Larry

1

Bạn có thể triển khai Windows Gadget thực tế bằng cách sử dụng WPF bằng cách tạo XBAP. Chỉ cần thêm tệp gadget.xml và tệp .html chỉ chứa IFRAME tải XBAP. Bằng cách đó, ứng dụng WPF của bạn sẽ thực sự là một tiện ích và sẽ tự động tuân thủ tất cả các quy tắc.

Một tùy chọn khác là sử dụng Windows Sidebar Styler. Điều này đòi hỏi phần mềm bổ sung phải được cài đặt cùng với bạn nhưng cũng cho phép bạn làm những việc bạn không thể thực hiện bên trong hộp cát XBAP mà không có chứng chỉ ký mã, người dùng authorizaiton, v.v.

Tùy chọn thứ ba là tạo tiện ích sử dụng thứ gì đó có thể nhận ra trong HTML (chẳng hạn như màu nền cụ thể), sau đó khi .exe của bạn khởi động, quét tìm hWnd trong Explorer có các thuộc tính bạn đang tìm kiếm, tự chèn vào quá trình Explorer.exe và đặt cửa sổ của bạn thành một đứa trẻ của nó.

Một biến thể của tùy chọn thứ ba là không tiêm vào Explorer.exe mà là duy trì chỉ mục Z và vị trí của bạn (sử dụng SetWindowPos) để theo dõi chỉ mục Z và vị trí của hWnd mà bạn tìm thấy.

Rất nhiều lựa chọn ...

0

Một giải pháp để thực hiện "tiện ích" như hành vi, là làm cho cửa sổ trở thành con của màn hình. Bằng cách này, cửa sổ của bạn luôn hiển thị trên màn hình ngay cả khi bạn nhấn Windows + D. Bạn có thể xem cách thực hiện tại đây: Window "on desktop".

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