Saturday, January 22, 2011

Turn Off Monitor/Display of your Laptop/Desktop In Windows Application With Source Code

How Can I Turn Off My Laptop's Display Whenever I Want?


I recently felt the need to turn off my laptop's monitor on my will, but you know there ain't such a button on almost all laptops. (Not interested in tech stuff? scroll down directly to Download, and get the executeable) So I tried to search around the internet for some utility, sadly speaking I didn't find any such thing. But you know I'm a programmer after all, therefore instead of searching a trust-worthy utility, I sought a do it yourself code example. I found the example here on code project:
http://www.codeproject.com/KB/system/display_states.aspx


power-off-laptop-display
The code needed to turn your monitor off/on is literally a one liner. All you need is one line, and your monitor will be powered off as soon as you run the .exe file. Here's the code friends:

#include <Windows.h>
int main(int argc, char* argv[])
{
        SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM) 2);// this c++ code will turn the monitor off
return 0;
}

You will be wondering, how the monitor/display will be turned back on? The good news is Windows handles that part automatically. Whenever we turn off display with this cut throat application of ours, moving mouse or pressing a key will bring the monitor back to life. Although broadcasting another message will fire the display up, but we don't need that I think. Still, here's the code:


SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM) 1);

Take this piece of code to any C++ IDE of your choice(of course Windows duffer!!!), just compile build and your very own application to turn off the monitor will be ready.
Place the executable anywhere you want, create a shortcut on desktop, whenever you'll click it the monitor will go dark.


And if you don't wanna do that, just download the ready to run executable of this cut throat advanced bleeding edge top class wonderful awesome @#%$#%&~!^&%$#@+ app that can shut down your PC or Laptop's display/monitor whenever you want here !!!


Instructions:

  1. Just place the .exe file anywhere in your system, double clicking it will turn off the monitor you may create a shortcut on desktop, or pin it to task bar for easy access (details below).
  2. Moving the mouse, or pressing a key on keyboard will turn your system's display back on.

Please keep that in mind:
  • This utility does not open any network communications port
  • This utility does not read/write any kind of files to/from your computer's hard disk
  • This utility does not read/write anything to/from Windows Registry.
Therefore, if the file you download tries to do any of the above, the file is not original and someone has tampered with it.

Making Things Even Better (Value Addition):
There's a very cool Windows 7 feature which I've used to make things even better on my laptop.
The feature goes like you can access the shortcuts pinned to Windows by pressing Windows Button + a number. The leftmost minimized program or pinned shortcut will be activated by pressing Windows + 1, second left with Windows + 2, so on and so forth. For example see the snap shot of my current Windows Toolbar


The yellow numbers aren't found originally in the interface, I've annotated the snap shot on purpose. Right now, if I will press Windows Key and then press 2 key(not from num-pad) the Windows Media player which is second from left will be maximized. Similarly, Windows 5 will cause Google Chrome to open up. Windows 8 will maximize Ms Paint. I have pinned the .exe file of our cut throat power off display application to Task bar. Therefore, if I will press Windows key + 1 display of my laptop will be turned off.


Technical Explanation:
How Windows Works
Basically we need to understand the architecture of Windows applications to get the core of what's happening in this single line of code.
In a Windows environment, we don't interact with any application directly. Instead whenever we perform an action we are talking to Windows Operating System, the OS takes our command/action and passes it over to an application depending on the location of the action/command/event. 


For Example:


Like if you click in a Ms Word window, following will happen:
  1. Windows OS will catch the message 
  2. It will see that currently the window associated with Ms Word was active
  3. It will pass over your command in form of a message to Ms Word
  4. Each and every Windows based application contains a "Windows Message Message Pump" loop, which keeps watching for incoming messages from Windows OS
  5. In this case, the message pump inside Ms Word will catch the message that "user clicked somewhere".
  6. Then Ms Word will handle the message what ever way it wants to.

  7. If an application has not handled a certain message, the message will simply have no affect on its health and the application will just discard the message.
People writing code for .Net platform (usually) don't know these things, but that's the basic Ms Windows architecture, and its not going anywhere any time soon. The "Windows Message Pump" plus WndProc method is alway in there.


Where does SendMessage() fit in?
SendMessage is found in User32.dll, and its a Win32 API call(scary bare bone stuff for .Netters).
In this program we are broadcasting a message, which is not intended for any specific application. Like the fishermen broadcast help requests on radio. We are just saying "Hey anybody out there, I am sending  a WM_SYSCOMMAND which is related to SC_MONITORPOWER with a value of 2". Luckily there is a portion of Windows which is handling this message, its the same part which turns your display off after a certain amount of time.
This function call won't affect anything else on your system, cause no other application is consuming this message.
So, in the end, your display is powered off so that you can sit back and relax ;)


DISCLAIMER: There is no guarantee or warantee that this program will work as specified in this post. Author will not be responsible for any damage due to use of instructions provided in this post.

2 comments:

  1. Hi,

    thanks for this blog page.

    But on a win8 tablet the code below sets the tablet in sleep mode:

    SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM) 2);

    Do you know how I can put only the display off (without setting the tablet into the sleep state)?

    Thanks a lot,
    Steffen

    ReplyDelete
    Replies
    1. Hi Steffen, Did you find a work around? Its been a long time :)

      Delete