/* 
   Name:         APM
   Author:       cLx
   Description:  To switch monitors in green mode 
   OSs:          Windows: 9x/ME/2k/XP
   Date:         06/08/04 20:02
   Thanks to:    Hiro
   Uses:         Green mode:      > APM
                 Lock PC before:  > APM --lock
                 Help:            > APM --help

   Comments:     C'est un bout de code que j'utilise pour faire passer en veille les moniteurs 
                 de mes PC rapidement avec un combinaison de touches. On peut le locker en même 
                 temps si le systeme le permet, sans poser devoir le recompiler grace a un 
                 chargement dynamique de la DLL. Depuis le temps que je l'utilise, j'avais oublié
                 que j'avais fait un petit message d'aide ;)

*/


#define TITLE "APM -- http://clx.freeshell.org/"
#include <windows.h>
#include <stdio.h>
#include <string.h>

int LockWorkStation(void) {
    typedef BOOL (*LPFNLWS)(void);

    LPFNLWS    lpfnLockWS = NULL;
    HINSTANCE  hUser32;
    unsigned long ret = 0;

    hUser32 = LoadLibrary("User32.dll");
    if (hUser32) {
        lpfnLockWS = (LPFNLWS)GetProcAddress(hUser32, "LockWorkStation");
        if (lpfnLockWS) { 
            (*lpfnLockWS)();
            ret = GetLastError();
        }
        FreeLibrary(hUser32);
        return ret;
    }
    else { return 0; }       
}

int main(unsigned int argc, char **argv) {
    int ret;
    if (argc != 1) {
        if (!stricmp(argv[1], "--lock")) { 
            if (!LockWorkStation()) {
                ret = MessageBox (NULL, "LockWorkStation() failled.

Common reasons the workstation might not be locked even if the function succeeds include the following: 
no user is logged on, the workstation is already locked, the process is not running on the interactive 
desktop, or the request is denied by the Graphical Identification and Authentication (GINA) DLL.

Continue anyway ?" , TITLE, 0 + MB_OKCANCEL + MB_ICONHAND);
                if (ret != MB_OK) { return -1; }
            }
            Sleep(1500);
        }
        else {
            MessageBox (NULL, "Switch the monitor in the green mode using an win32's API.
You can use the option --lock on NT based windows." , TITLE, 0); 
            return 0;
        }
    }
    
    

	Sleep(500);
	PostMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
	return 0;
}

 [PROGRAMME COMPLET] AutoExit (a sa propre page)
 [C] [Win32] Mouseloop : Ou comment faire des trucs stupides avec le pointeur de la souris
 [PHP] [INCLUDE] Récupérer des chaines quel que soit l'état de magicquotes.
 [C] [Win32] APM : Faire passer les moniteurs en green mode/locker le PC rapidement.
 [QBASIC] Lire par RS-232 les données du multimetre VC 670 et les enregistrer dans un CSV
 [C] [Portable] [Connerie] Un encodeur/décodeur ROT13 et pas que 13, en mode console.
 [mIRC] Ce client IRC n'est pas très convivial avec le mode "away". Voila qui est mieux.
 [C] [Win32] Un programme pour récupérer le nom de la chanson actuellement jouée.
 [Cµ] [PIC] [CCS] Le programme d'un chariot suiveur de ligne noire par caméra video.
10  [PROJET SOURCEFORGE] [C] Un client/passerelle en mode console pour les minichats (rmcgirr83.org) sur forums PhpBB
11  [C] [Win32] [NHC] "Workaround" d'un probleme avec le son de mon laptop lors du changement de frequence cpu
12  [C] Make-ILDA : a C routine to create ILDA files, for lasershows.