Xin chào, tôi đã tìm kiếm nhưng tôi không thể tìm thấy câu trả lời. Làm thế nào để tôi biết khi nào màn hình tắt hoặc bật. Không phải là SystemEvents.PowerModeChanged. Tôi không biết làm thế nào để lấy SỰ KIỆN màn hình/màn hìnhC# Làm thế nào để có được các sự kiện khi màn hình/màn hình chuyển sang TẮT nguồn hoặc BẬT?
private const int WM_POWERBROADCAST = 0x0218;
private const int WM_SYSCOMMAND = 0x0112;
private const int SC_SCREENSAVE = 0xF140;
private const int SC_CLOSE = 0xF060; // dont know
private const int SC_MONITORPOWER = 0xF170;
private const int SC_MAXIMIZE = 0xF030; // dont know
private const int MONITORON = -1;
private const int MONITOROFF = 2;
private const int MONITORSTANBY = 1;
[DllImport("user32.dll")]
//static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
private static extern int SendMessage(IntPtr hWnd, int hMsg, int wParam, int lParam);
public void Init(Visual visual)
{
SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
HwndSource source = ((HwndSource)PresentationSource.FromVisual(visual));
source.AddHook(MessageProc);
Handle = source.Handle;
}
public void SwitchMonitorOff()
{ // works
SendMessage(Handle, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOROFF);
}
public void SwitchMonitorOn()
{// works
SendMessage(Handle, WM_SYSCOMMAND, SC_MONITORPOWER, MONITORON);
}
public void SwitchMonitorStandBy()
{// works
SendMessage(Handle, WM_SYSCOMMAND, SC_MONITORPOWER, MONITORSTANBY);
}
private IntPtr MessageProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == WM_SYSCOMMAND) //Intercept System Command
{
// not finished yet
// notice the 0xFFF0 mask, it's because the system can use the 4 low order bits of the wParam
// value as stated in the MSDN library article about WM_SYSCOMMAND.
int intValue = wParam.ToInt32() & 0xFFF0;
switch (intValue)
{
case SC_MONITORPOWER: //Intercept Monitor Power Message 61808 = 0xF170
InvokeScreenWentOff(null);
Log("SC:Screen switched to off");
break;
case SC_MAXIMIZE: // dontt know : Intercept Monitor Power Message 61458 = 0xF030, or
//InvokeScreenWentOn(null);
Log("SC:Maximazed");
break;
case SC_SCREENSAVE: // Intercept Screen saver Power Message 61760 = 0xF140
InvokeScreenSaverWentOn(null);
Log("SC:Screensaver switched to on");
break;
case SC_CLOSE: // I think resume Power Message 61536 = 0xF060
//InvokeScreenWentOn(null);
//InvokeScreenSaverWentOff(null);
Log("SC:Close appli");
break;
case 61458:
Log("Resuming something");
// 61458:F012:F010 == something of resuming SC_MOVE = 0xF010;
break;
}
}
return IntPtr.Zero;
}
EDIT
Có lẽ tôi có thể giải thích tăng thêm của tôi, do đó có lẽ là một giải pháp tốt hơn. Tôi có một dịch vụ WCF ràng buộc kép đang chạy. Nó đang chạy trên một archos (máy tính bảng di động). Tôi muốn rằng khi người dùng ngừng làm việc cho một thời gian nhàn rỗi, kết nối đóng cửa ngay lập tức, và khi máy tính trở về từ nhàn rỗi, anh ta kết nối lại ngay lập tức. Ý tưởng của Application Idle on Code project từ Tom đã là một ý tưởng hay. Tiêu thụ điện ít hơn, càng tốt. Khởi động phải nhanh nhất có thể.
Không thực sự, làm thế nào để bạn lấy các sự kiện. Làm thế nào để biết nếu nó BẬT nguồn hoặc TẮT nguồn? - Sau 10 phút màn hình của tôi bị mờ. - Sau 15 phút màn hình của tôi tắt. - Tôi di chuyển chuột, màn hình sẽ BẬT. Cách nhận sự kiện này? (không phải là sự kiện phiên) – Manu
@Manu: Hãy để tôi chỉnh sửa câu trả lời này để bao gồm một mẫu làm thế nào để lấy các sự kiện .... – t0mm13b
Wow, interestin. Tôi không nghĩ Gonne quá phức tạp. Tôi không phải là một chuyên gia, chắc chắn không phải với registry. Vì vậy, tôi hơi sợ khi chạm vào đó. "Ứng dụng nhàn rỗi" đã là một ý tưởng hay. – Manu