2009-04-03 22 views
42

Monitör (C#) aracılığıyla bir monitörü açmak/kapatmak için programatik olarak mümkün mü?Monitörü açma/kapama

+2

soru downvotes sizi kurtarabilir bir yerde "programlı" ekleme .. – Newtopian

+0

:-) benim 2 cent yukarıdaki ile kabul edilmiştir: Bu doesn olsa 'Güzel soru' ödülünü kazanmam, kişisel olarak birçok downvot ile katılmıyorum. Aslında geçerli bir soru. – Razzie

+2

Herkes OP'den daha akıllı olduklarını ve problemini bildiğini düşünüyor. Vinoth, bir düğme ile nasıl yapılacağını sormadı, kod ile mümkün olup olmadığını sordu ... – Inisheer

cevap

16

Açma/kapama düğmesi


kodda yapmak istiyorsanız, görünüşe göre bu Win32 API mümkündür:

SendMessage hWnd, WM_SYSCOMMAND, SC_MONITORPOWER, param

WM_SYSCOMMAND = 0x112 ve SC_MONITORPOWER = 0xF170 ve param, monitörü aşağıdaki modda gösterir: -1: on 2: 1 kapalı: Enerji tasarrufu moduna

hWnd bir pencere için bir tanıtıcı olabilir - bir form var eğer öyleyse, böyle bir şey '

int WM_SYSCOMMAND = 0x112; 
int SC_MONITORPOWER = 0xF170; 

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam); 

public static void Main(string[] args) 
{ 
    Form f = new Form(); 
    bool turnOff = true; //set true if you want to turn off, false if on 
    SendMessage(f.Handle, WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)(turnOff ? 2 : -1)); 
} 

Not I sığınak çalışması gerekir t aslında bunu denedim ...

+1

Güç tükenmişse, görünmesi çok karanlık olabilir/kapama düğmesi, bu nedenle bu koşullar için kullanışlı bir el feneri bulundurmanız gerekebilir. –

+1

Ben bu soruya cevap vermek istedim, bu yüzden +1 :-) – Newtopian

+0

, o zaman mükemmel cevap! – Hugo

29

Bunu yapmaya çalıştınız mı?

İlk hit: http://www.codeproject.com/KB/cs/Monitor_management_guide.aspx

Biraz DLL Windows tarafından sağlanan kullanmak zorunda şaşırmadım.

(C# çözümüne ihtiyacınız olduğunu tahmin ettim, çünkü bu, uyguladığınız tek etikettir).

DÜZENLEME 8 Şubat 2013:

O Eh burada henüz Windows 8 denemedim Windows 7 altında inşaat güzel biridir çözüm artık 8. tr Windows 7 altında çalıştı bahsedilmişti.

http://cocoa.ninja/posts/Turn-off-your-monitor-in-Csharp.html

namespace MonitorOff { 

    public enum MonitorState { 
     MonitorStateOn = -1, 
     MonitorStateOff = 2, 
     MonitorStateStandBy = 1 
    } 

    public partial class Form1 : Form { 
     [DllImport("user32.dll")] 
     private static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam); 

     public Form1() { 
      InitializeComponent(); 
      SystemEvents.SessionSwitch += SystemEvents_SessionSwitch; 
     } 

     void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e) { 
      SetMonitorInState(MonitorState.MonitorStateOff); 
     } 

     private void button1_Click(object sender, EventArgs e) { 
      SetMonitorInState(MonitorState.MonitorStateOff); 
     } 

     private void SetMonitorInState(MonitorState state) { 
      SendMessage(0xFFFF, 0x112, 0xF170, (int)state); 
     } 
    } 
} 
+1

Bu Kod Projesi örneği Windows 7 veya 8'de çalışmıyor. –

+0

Bu cevabın 2009 yılında verildiğini biliyor musunuz? –

+18

Yaparım, ancak 2013'te Google'da yanıt hala yüksek seviyede yer aldığından, benim gibi başkalarının da geleceğine, bununla karşılaşacağına ve projeyi indirip, yalnızca 2009 sonrası Windows İşletim Sistemlerinde çalışmadığını keşfetmeye çalıştığına karar verdim. Onları 10+ dakikadan kurtarmaya çalışıyordum. Cevabını eklediğin değerinden hiçbir şekilde uzaklaşmaya çalışmıyorum, eminim ki binlerce kişiye yardım ettim, sadece insanların bir şeyin değiştiğini bilmesini sağlamaya çalışıyorum. –

13

https://stackoverflow.com/a/713504/636189 yukarıda onu uyanma için bir Windows 7/8 monitörü kapatarak değil büyük çalışır cevap. Bu sistemlerde (bulundu https://stackoverflow.com/a/14171736/636189 gibi) böyle hackish şey yapmak gerekir:

[DllImport("user32.dll")] 
static extern void mouse_event(Int32 dwFlags, Int32 dx, Int32 dy, Int32 dwData, UIntPtr dwExtraInfo); 

private const int MOUSEEVENTF_MOVE = 0x0001; 

private void Wake(){ 
mouse_event(MOUSEEVENTF_MOVE, 0, 1, 0, UIntPtr.Zero); 
Sleep(40); 
mouse_event(MOUSEEVENTF_MOVE, 0, -1, 0, UIntPtr.Zero); 
} 
+0

Bu çözüm, Windows Vista'da iki monitörle harika çalıştı. –

+0

Sadece 2 sent, mouse_event MS office Communicator'ı "aktif" durumda tutmak için işe yaramıyor, sadece fare tıklaması ve keybd_event, bu yüzden bunları kullanmak için daha ileride bir kanıt olabilir veya birilerinin durumunda fareyi birden fazla piksel taşıyabilir "Birisi masasını çarptığında monitörleri açmayı kesmeliyiz" diye düşünüyor. – Motes

+0

Kabul edilen yanıt, Windows 10 için benim için çalışmadı. Kabul edilen cevap ekranı kısaca açacaktı ama sonra geri dönecekti. Bu bir Yüzey Pro'daydı. Bu çözümü uyguladıktan sonra harika çalıştı. Hackish, evet, ama işe yarıyor ve bu tarihte kızlar için yeterince iyi! – jaredbaszler

8

Bu kod açma ve kapatma için yararlı olabilir .. Ayrıca Windows 7'de çalıştı.

private int SC_MONITORPOWER = 0xF170; 

    private uint WM_SYSCOMMAND = 0x0112; 

    [DllImport("user32.dll")] 
    static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); 



    enum MonitorState 
    { 
     ON = -1, 
     OFF = 2, 
     STANDBY = 1 
    } 
    private void SetMonitorState(MonitorState state) 
    { 
     Form frm = new Form(); 

     SendMessage(frm.Handle, WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)state); 

    } 

işlevini çağırarak için yapmanız gereken gibi:

SetMonitorState(MonitorState.ON); 

VEYA

SetMonitorState(MonitorState.OFF); 

Not: WPF Uygulama test Bu kodu.Bir konsol uygulaması bu işlevselliği isteyen için

using System.Runtime.InteropServices; 
using System.Windows.Forms; 
9

:

using System; 
using System.Runtime.InteropServices; 
using System.Timers; 

namespace TurnScreenOFF 
{ 
    class Program 
    { 
     private static int WM_SYSCOMMAND = 0x0112; 
     private static uint SC_MONITORPOWER = 0xF170; 

     public static void Main(string[] args) 
     { 
      SendMessage(GetConsoleWindow(), WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)2); 
     } 

     [DllImport("kernel32.dll")] 
     static extern IntPtr GetConsoleWindow(); 

     [DllImport("user32.dll", CharSet = CharSet.Auto)] 
     private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam); 
    } 
} 

Adaptated ve test edilen aşağıda ad ile. % 100 Windows 8 üzerinde çalışıyor.

+1

GetConsoleWindow'u çağırmak için, konsol dışı bir uygulamada GUI hwnd almak için gerek yok, sadece HWND_BROADCAST mesajını kullanın (** SendMessage (Yeni IntPtr (0xFFFF) ** ...). – ElektroStudios

3

Herkesin bir monitörü uyku moduna geçirmesi ve daha sonra başka bir zamanda uyandırması için yayınladığı her yöntemi inceledim. Verilen SendMessage(), Windows XP ile çalışır, ancak monitör bir süre uykudan sonra monitörü uyandırmaz. Güç profilleri ve Powershell ile oynamak için C#, DOS, betikleri kullanmayı denedim. Sonunda pes ettim ve başa dönüp ilk düşüncem doğrulandı. Monitör kapatıldıktan sonra PostMessage()'u kullanmanız gerekiyor, daha iyisi, muhtemelen her zaman PostMessage();


Yani önce gördük bütün kod doğruysa, yerine aşağıdaki kullanın: yürütme ve uygun çalışma Şu anda

using System.Runtime.InteropServices; 
[DllImport("user32.dll")] 
static extern IntPtr PostMessage(int hWnd, int msg, int wParam, int lParam); 
PostMessage(-1, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF); 

(11 Mayıs 2015) ben çalışan

  • Windows 7 Professional Sürüm 6.1.7601 Service Pack 1 yapı 7601
  • Visual Studio Profesional 2013 Versiyon 12.0.31101.00 Güncelleme 4
  • .NET Framework 4.5.51209
  • C#

My sistemi tamamen güncel olduğundan.

+0

Hi @Mike , Ben senin çözümünü denedim ve monitörlerim siyah oldu ama 1 saniye sonra tekrar yanıyorlar. PostMessage ve SendMessage ile çalıştı. (Windows 7 6.1.7601 x64) Herhangi bir fikrin var mı? – ZeroDotNet

5

Kopyala yapıştır örneği bulamadım, yani kendim oluşturdum, System.Windows.Forms dosyasına başvuru eklemeyi unutmayın.

using System; 
using System.Runtime.InteropServices; 
using System.Threading; 
using System.Windows.Forms; 


namespace monitor_on_off 
{ 
    class Program 
    { 
     [DllImport("user32.dll")] 
     static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); 
     [DllImport("user32.dll")] 
     static extern void mouse_event(Int32 dwFlags, Int32 dx, Int32 dy, Int32 dwData, UIntPtr dwExtraInfo); 

     private const int WmSyscommand = 0x0112; 
     private const int ScMonitorpower = 0xF170; 
     private const int MonitorShutoff = 2; 
     private const int MouseeventfMove = 0x0001; 

     public static void MonitorOff(IntPtr handle) 
     { 
      SendMessage(handle, WmSyscommand, (IntPtr)ScMonitorpower, (IntPtr)MonitorShutoff); 
     } 

     private static void MonitorOn() 
     { 
      mouse_event(MouseeventfMove, 0, 1, 0, UIntPtr.Zero); 
      Thread.Sleep(40); 
      mouse_event(MouseeventfMove, 0, -1, 0, UIntPtr.Zero); 
     } 

     static void Main() 
     { 
      var form = new Form(); 

      while (true) 
      { 
       MonitorOff(form.Handle); 
       Thread.Sleep(5000); 
       MonitorOn(); 
       Thread.Sleep(5000); 
      } 
     } 
    } 
} 
+0

Benim için çalıştım pencerede 10 64 bit. Hatta onu kullanan küçük bir nodejs sunucusu yarattı ve şimdi cep telefonumdan ekranları kapatabilirim. Çok teşekkürler BTW açılış da işe yaradı, ancak kapatılmış olsa bile kapat komutunu ikinci kez çalıştırırsam açılacaktı. Bu benim için önemlidir –

0

az SLOC ile cevap:

using System; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

static class Program 
{ 
    [DllImport("user32.dll")] 
    static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam); 

    [STAThread] 
    static void Main() 
    { 
     SendMessage(new Form().Handle, 0x0112, 0xF170, 2); 
    } 
} 
+1

IMHO 2011'den klaasjan69 tarafından cevaptan daha iyi değil. Daha kısa, ama daha az okunabilir. Sadece "kapalı" durumda cevaplar, ama "açık" durumda değil. SLOC "bir avantaj olarak. –

İlgili konular