2011-06-10 15 views
36

Windows denetimleri olmadan arka planda çalışan bir C# uygulamasında çalışıyorum.Windows'un boşta kalma durumuna nasıl girmesi gerekir?

Windows'un, boşta kalma durumuna geçmesini önlemek için uygulamamın hala canlı olduğunu Windows'a bildirmek istiyorum.

var mıdır başvurum hala hayatta olduğunu, Windows işletim sistemi bildirmek benim uygulamadan çağrısı için herhangi API'ler?

Şimdiden teşekkürler.

+4

kullanıcıların her nasılsa uygulama sürekli çalışacak gerektiğini biliyorum ve boşta gitmekten Windows'un önlediğini söyle kesin olduğunu. Bu özellikle dizüstü bilgisayar kullanıcıları için önemlidir. –

cevap

17

Sen birkaç seçenek vardır: adımlar geçici olarak uyku modunu devre dışı etmek için örnek bir yöntemle PreventSleep dahil burada açıklanan

  • kullanın SetThreadExecutionState:

    Bir uygulamayla etkinleştirir Kullanımda olduğu sistemi bilgilendirmek için, sistem çalışırken uykunun girmesini veya ekranın kapanmasını önler. Sistem boşta sayacı sıfırlayarak çalışma durumda olmasını

    Kuvvetleri sistemi ES_SYSTEM_REQUIRED bayrak kullanabilirsiniz

    . Sahte tuş vuruşuna
  • Kullanım SendInput, fare hareketi/diğer alternatif bir Windows hizmeti olarak uygulamanızı değiştirmek olacaktır

  • tıklar.

SetThreadExecutionState örnek

// Television recording is beginning. Enable away mode and prevent 
// the sleep idle time-out. 
SetThreadExecutionState(
    ES_CONTINUOUS | 
    ES_SYSTEM_REQUIRED | 
    ES_AWAYMODE_REQUIRED); 

// Wait until recording is complete... 
// Clear EXECUTION_STATE flags to disable away mode and allow the system 
// to idle to sleep normally. 
SetThreadExecutionState(ES_CONTINUOUS); 
0

ben yönetilen kod doğrudan bunu yapmak için herhangi bir yolu yoktur sanmıyorum.

Hızlı arama 2 yıl önce this yazı ortaya koymaktadır. Temel olarak, bir ham pencere API'sini çağırmak için bazı birlikte işler yapmanız gerekir.

31

Sen SetThreadExecutionState işlevi kullanmak ettik.Böyle bir şey:

public partial class MyWinForm: Window 
{ 
    private uint fPreviousExecutionState; 

    public Window1() 
    { 
     InitializeComponent(); 

     // Set new state to prevent system sleep 
     fPreviousExecutionState = NativeMethods.SetThreadExecutionState(
      NativeMethods.ES_CONTINUOUS | NativeMethods.ES_SYSTEM_REQUIRED); 
     if (fPreviousExecutionState == 0) 
     { 
      Console.WriteLine("SetThreadExecutionState failed. Do something here..."); 
      Close(); 
     } 
    } 

    protected override void OnClosed(System.EventArgs e) 
    { 
     base.OnClosed(e); 

     // Restore previous state 
     if (NativeMethods.SetThreadExecutionState(fPreviousExecutionState) == 0) 
     { 
      // No way to recover; already exiting 
     } 
    } 
} 

internal static class NativeMethods 
{ 
    // Import SetThreadExecutionState Win32 API and necessary flags 
    [DllImport("kernel32.dll")] 
    public static extern uint SetThreadExecutionState(uint esFlags); 
    public const uint ES_CONTINUOUS = 0x80000000; 
    public const uint ES_SYSTEM_REQUIRED = 0x00000001; 
} 
+0

, NativeMethods.SetThreadExecutionState hiçbir zaman 0 döndürmez, herhangi bir fikir? – Alessio

+4

@Alessio - '0' dönüşü yöntem başarısız oldu. "SetThreadExecutionState" belgesinin belgelerinden - "İşlev başarılı olursa, dönüş değeri önceki iş parçacığı yürütme durumudur. İşlev başarısız olursa, dönüş değeri NULL olur." (Not - Muhtemelen bunu zaten çözdünüz, ancak tamlık için bir cevap göndermek istedim ve gelebilecek herkese yardımcı olmak ve yorumunuzu görüntülemek istedim) – pstrjds

+0

Yinelenen ve uyku sorununu çözmek için zor bir sorunu çözmeye çalışırken Windows 8.1 çalıştıran bir Surface Pro 3, bu işletim sisteminde bu sorun için maalesef bu çözümün işe yaramadığını net bir şekilde belirtebilirim. – Redgum

0

İşte SetThreadExecutionState C# uygulaması

İlgili konular