2011-12-22 32 views
19

Vấn đề:
Tôi có một ứng dụng WPF fullscreen, hoạt động như một bảng điều khiển. Máy tính nằm trong các chính sách miền và miền thực thi máy tính bị khóa sau 10 phút sau hoạt động của người dùng cuối cùng. Tôi muốn ngăn chặn các máy trạm (hoặc máy tính để bàn) từ khóa tự động.
Ví dụ về hành vi như vậy: Windows Media Player, ngăn chặn điều này khi phim đang chạy.Ngăn chặn Windows máy trạm (desktop) từ khóa trong khi chạy một chương trình WPF

giải pháp Known (kinda cách giải quyết):

  1. Có thể send a Win32 Mouse Move event mỗi khoảng thời gian nhất định (ví dụ, mỗi phút)
  2. Có thể gửi một chìa khóa để chương trình (ví dụ "Shift Left" chìa khóa lên) mỗi khoảng thời gian nhất định (ví dụ, mỗi phút)

HỎI:
Làm cách nào để ngăn không cho máy trạm chạy khóa mà không sử dụng các cách giải quyết này?

Disclaimer:
Tôi khá chắc chắn, có phải là một câu hỏi tương tự đã trả lời ở đâu đó trên StackOverflow, nhưng tôi đã không tìm thấy bất kỳ. Tôi sẽ đánh giá cao, nếu bạn có thể chỉ cho tôi đi đúng hướng.

+4

bạn đang tìm kiếm Win32 [ 'SetThreadExecutionState()' chức năng] (http://msdn.microsoft.com/en-us/library/windows/ desktop/aa373208.aspx). Nhưng giải pháp tốt hơn là Group Policy. –

+0

Ồ, tuyệt vời! Bạn có thể đăng bài đó làm câu trả lời không? –

+0

Bạn cũng có thể muốn thêm liên kết này dưới dạng liên kết: http://pinvoke.net/default.aspx/kernel32.SetThreadExecutionState –

Trả lời

21

Các giải pháp đã được chỉ ra qua các ý kiến, nhưng tôi đang cung cấp một giải pháp khởi động đơn giản cho bất cứ ai khác đến qua một tìm kiếm web:

/// <summary> 
/// Interaction logic for App.xaml 
/// </summary> 
public partial class App : Application 
{ 
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags); 

    public App() 
    { 
     InitializeComponent(); 

     App.Current.Startup += new StartupEventHandler((sender, e) => 
      { 
       SetThreadExecutionState(EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_CONTINUOUS); 
      }); 
     App.Current.Exit += new ExitEventHandler((sender, e) => 
      { 
       SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS); 
      }); 
    } 
} 

[FlagsAttribute] 
public enum EXECUTION_STATE : uint 
{ 
    ES_AWAYMODE_REQUIRED = 0x00000040, 
    ES_CONTINUOUS = 0x80000000, 
    ES_DISPLAY_REQUIRED = 0x00000002, 
    ES_SYSTEM_REQUIRED = 0x00000001 
    // Legacy flag, should not be used. 
    // ES_USER_PRESENT = 0x00000004 
} 

Một nơi khác để đặt logic sẽ nằm trong một xử lý sự kiện cho StateChanged trên cửa sổ ứng dụng chính của bạn:

this.StateChanged += new EventHandler((sender, e) => 
    { 
     if (WindowState == System.Windows.WindowState.Maximized) 
     { 
      SetThreadExecutionState(EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_CONTINUOUS); 
     } 
     else 
     { 
      SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS); 
     } 
    }); 
Các vấn đề liên quan