Bloquear a Estação de Usuário

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Bloquear a Estação de Usuário

Mensagem por asimoes »

A minha contribuição de hoje é fazer com que a aplicação bloquei a estação de trabalho do usuário caso ele deixe a máquina desprotegida por ter ido tomar um café, ter ido ao banheiro ou estar voando mesmo, só que ele deixou o seu desktop desprotegido e alguém pode acessar suas informações sem o seu conhecimento e gerar problemas.
É muito simples o exemplo:

Este exemplo eu usei a hwgui, mas pode ser adaptado perfeitamente para o harbour console.

Código: Selecionar todos

*********************************************************************
* Programa : Bloqueio                                                *
* Autor    : Alexandre Simões                                       *
* Data     : 27/03/2014                                             *
* Descricao: Proteger o desktop do usuário                             *
*********************************************************************
#include "hbcompat.ch"
#include "common.ch"
#include "set.ch"
#include "hwgui.ch"

STATIC nSeconds

FUNCTION Main
LOCAL oIconApp:=HIcon():AddResource("ICON_1")
LOCAL addX:=20, nWidth:=640, nHeight:=500, addY:=20
PRIVATE oDialogWindow, oLabel, oTimer, lFecharWindow:=.F.
PRIVATE aMensagens:={Space(10)+'Banner (letreiro)'+Space(10),' Letreiro com HwGui',' Banner com HwGui'}, nTam:=15 //9 //20

   PREPARE FONT oFont NAME "Tahoma" WIDTH nTam HEIGHT -26 //-13

   addY += 30

   hDC := hwg_Getdc( hwg_Getactivewindow() )
   hwg_SelectObject( hDC, oFont:handle )
   aMetr := hwg_GetTextMetric( hDC )
   aArea := hwg_GetDeviceArea( hDC )
   aRect := hwg_GetWindowRect( hwg_GetActiveWindow() )
   hwg_Releasedc( hwg_Getactivewindow(), hDC )

   cCaption:=aMensagens[1]
   
   nLen:=Len(cCaption)

   nLenArray:=4
   
   nHeight := ( aMetr[ 1 ] + 1 ) * 1 + nLenArray + addY + nLenArray

   nWidth := (nLen * aMetr[ 2 ]) + 25 + 250
   
   INIT DIALOG oDialogWindow ;
        TITLE   "Banner" ;
        ICON    oIconApp ;
        AT      0,0 ;
        SIZE    nWidth + 20, nHeight ;
        FONT    oFont ;
        COLOR   16760439 ;
        STYLE   DS_CENTER + WS_VISIBLE + WS_SYSMENU

   @ 0,0 SAY oLabel CAPTION "Bloqueando a estação em 30 segundo(s) - 99:99:99";
                    FONT oFont ;
                    STYLE SS_CENTER + WS_BORDER ;
                    COLOR hwg_RGB(0,0,255) BACKCOLOR 16777172

   nAltura :=40 //40
   nPosicao:=80 //63
   
   oLabel:bSize := { | o, x, y | hwg_MoveWindow( o:handle, addX / 2, nHeight - nPosicao, x - addX  , nAltura ) }

   Liga_Timer(oDialogWindow,.T.)
   
   oDialogWindow:Center()
   
   oDialogWindow:Activate() // Parâmetro .T. = NOMODAL, .F. ou () = MODAL

RETURN Nil

FUNCTION Liga_Timer(oJanela,lLiga)
MEMVAR oTimer
   IF lLiga
      SET TIMER oTimerTempo of oJanela VALUE 1000 ACTION {|| MensTime(30)}
   ELSE
      oJanela:oTimer:End()   
   ENDIF
RETURN Nil

FUNCTION MensTime(nTime)
   IF nSeconds = Nil
      nSeconds:=Seconds()
   ENDIF
   IF Seconds() - nSeconds >= nTime
      BloquearEstacao("%windir%\System32\rundll32.exe user32.dll,LockWorkStation",.F.)
      nSeconds:=Seconds()
   ELSE
      oLabel:caption:="Bloqueando a estação em "+StrZero(nTime,2)+" segundo(s) - "+SecToTime(Seconds()-nSeconds)
   ENDIF
   hwg_doevents()
RETURN Nil

FUNCTION BloquearEstacao(cComando,lEspera)
LOCAL oShell, lOk:=.T.
DEFAULT lEspera TO .T.
   TRY
      oShell:=WIN_OleCreateObject( "WScript.Shell" )
   CATCH
      TRY
         oShell:=WIN_OleCreateObject( "WScript.Shell" )
      CATCH
         lOk:=.F.
      END
   END
   IF lOk
      TRY
        oShell:Run( "%comspec% /c " + cComando, 0, lEspera )
      CATCH
         lOk:=.F.
      END
      oShell:=Nil
   ENDIF
RETURN lOk
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Bloquear a Estação de Usuário

Mensagem por asimoes »

Pode bloquear também desta forma:

ShellExecute(0, "open", "rundll32.exe", "user32.dll,LockWorkStation", , 1)

Código: Selecionar todos

#pragma BEGINDUMP
#include <windows.h>

#include "hbapi.h"
#include "hbapiitm.h"
#include "hbapifs.h"

#include <shellapi.h>
#include <shlobj.h>
#include <shlwapi.h>

#include <lmcons.h>
#include <commctrl.h>

HB_FUNC( SHELLEXECUTE )
{
   hb_retnl
   (
      ( LONG ) ShellExecute
      (
         ( HWND ) hb_parnl( 1 ),
         HB_ISNIL( 2 ) ? NULL : ( LPCTSTR ) hb_parc( 2 ),
         ( LPCSTR ) hb_parc( 3 ),
         HB_ISNIL( 4 ) ? NULL : ( LPCTSTR ) hb_parc( 4 ),
         HB_ISNIL( 5 ) ? NULL : ( LPCTSTR ) hb_parc( 5 ),
         hb_parni( 6 )
      )
   );
}
#pragma ENDDUMP
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Bloquear a Estação de Usuário

Mensagem por lugab »

Legal,

Será q alguém tem algo similar pra gente colocar no nosso harbour/xharbour ?

Naturalmente, eu não faço idéia de como adaptar
lugab
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Bloquear a Estação de Usuário

Mensagem por asimoes »

O exemplo em harbour. (=== modificado ===)

Código: Selecionar todos

#include "inkey.ch"
#include "setcurs.ch"
#include "error.ch"
#include "achoice.ch"
#include "fileio.ch"
#include "common.ch"
#include "dbinfo.ch"
#include "hbver.ch"
#include "hbdyn.ch"
#include "wvtwin.ch"
#include "hbgtinfo.ch"
#include "hbgtwvg.ch"
#include "wvgparts.ch"
#include "hbcompat.ch"
#include "hbhrb.ch"
#include "directry.ch"
#include "hbwin.ch"
#include "hbthread.ch"

STATIC nSeconds
STATIC nTempoUltimaVerificacao
STATIC nIdleTime

FUNCTION MAIN()
LOCAL cTeste:=Space(5)

PUBLIC __nTeclaDigitada:=Inkey()
   
   IniciaTempo()
   
   @ 01,00 SAY PADC("TESTE DE BLOQUEIO DE ESTAۂO",80) COLOR "W+/B*"
      
   SET CURSOR ON
   @ 05,00 SAY "TESTE : " GET cTeste COLOR "W/N"
   READ

RETURN NIL

FUNCTION MensTime(nTime)
   DO WHILE .T.
      IF nSeconds = Nil
         nSeconds:=Seconds()
      ENDIF
      IF __nTeclaDigitada <> 0
         nSeconds:=Seconds()
      ENDIF
      IF Seconds() - nSeconds >= nTime 
         //BloquearEstacao("%windir%\System32\rundll32.exe user32.dll,LockWorkStation",.F.)
         ShellExecute(0, "open", "rundll32.exe", "user32.dll,LockWorkStation", , 1)
         nSeconds:=Seconds()
      ENDIF
   ENDDO
RETURN Nil

FUNCTION IniciaTempo
   IF nIdleTime != Nil
      HB_IdleDel( nIdleTime )
   ENDIF
   hb_threadStart(HB_THREAD_INHERIT_PUBLIC,@MensTime(),30)
   nIdleTime:=HB_IdleAdd( {|| ViewTime(30) } )
RETURN .T.  

FUNCTION ViewTime(nTempo)
LOCAL nRow, nCol 

   __nTeclaDigitada:=Inkey()
   
   nRow:=Row()
   nCol:=Col()
   IF nTempoUltimaVerificacao = Nil .OR. __nTeclaDigitada <> 0
      nTempoUltimaVerificacao:=Seconds()
      KEYBOARD Chr(__nTeclaDigitada)
   ENDIF
   IF Seconds() - nTempoUltimaVerificacao >= nTempo 
      nTempoUltimaVerificacao:=Seconds()
   ELSE
      @ 23,00 SAY PADC("Bloqueando a esta‡Æo em "+StrZero(nTempo,2)+" segundo(s) - "+SecToTime(Seconds()-nTempoUltimaVerificacao),80) COLOR "W+/B"
      SetPos(nRow,nCol)
   ENDIF
RETURN Nil

FUNCTION BloquearEstacao(cComando,lEspera)
LOCAL oShell, lOk:=.T.
DEFAULT lEspera TO .T.
   TRY
      oShell:=WIN_OleCreateObject( "WScript.Shell" )
   CATCH
      TRY
         oShell:=WIN_OleCreateObject( "WScript.Shell" )
      CATCH
         lOk:=.F.
      END
   END
   IF lOk
      TRY
        oShell:Run( "%comspec% /c " + cComando, 0, lEspera )
      CATCH
         lOk:=.F.
      END
      oShell:=Nil
   ENDIF
RETURN lOk

INIT FUNCTION AppSetup()
  
  REQUEST HB_LANG_PT
  REQUEST HB_CODEPAGE_PT850
  HB_LANGSELECT("PT")
  HB_CDPSELECT( "PT850" ) //pt850

  SETMODE(24,80)

  SET TYPEAHEAD TO 0
  SET INTENSITY ON
  SET SCOREBOARD OFF
  SET DELETED ON
  SET SAFETY OFF
  SET DATE ANSI
  SET ESCAPE ON
  SET DELIMITERS TO
  SET EXCLUSIVE OFF
  SET WRAP ON
  SET EPOCH TO 1920
  SET MESSAGE TO 24 CENTER

  SetColor("W+/B")
  
  CLS

  SetColor("W+/B")
  
  IniciaJanela()


RETURN Nil 


FUNCTION IniciaJanela(nLi,nCi,nLf,nCf)

LOCAL oCrt
   HB_Default(@nLi,0)
   HB_Default(@nCi,0)
   HB_Default(@nLf,MaxRow())
   HB_Default(@nCf,MaxCol())
  
  cTituloJanela:="Teste de Bloqueio de Esta‡Æo"

  #ifndef HARBOUR_MSVC
     oCrt:=WvgCrt():New( , , { nLi, nCi }, { nLf, nCf }, , .T. )
     oCrt:create()
     oCrt:resizable:=.F.
  #endif

   HB_gtInfo(HB_GTI_FONTNAME, "Lucida Console")
   HB_gtInfo(HB_GTI_WINTITLE, cTituloJanela)
   HB_gtInfo(HB_GTI_CLOSABLE, .F. )
   HB_gtInfo(HB_GTI_ISGRAPHIC, .T. )
   HB_gtInfo(HB_GTI_STDERRCON, .T. )
   HB_gtInfo(HB_GTI_COMPATBUFFER, .T. ) 
   HB_gtInfo(HB_GTI_SPEC, HB_GTS_WNDSTATE, HB_GTS_WS_MAXIMIZED )
   HB_gtInfo(HB_GTI_SPEC, HB_GTS_SHOWWINDOW, SW_NORMAL )
   
RETURN Nil

FUNCTION HB_GTSYS()
   REQUEST HB_GT_WVG_DEFAULT
   REQUEST HB_GT_WVT
   REQUEST HB_GT_WGU
   REQUEST HB_GT_WVG
RETURN Nil 

#pragma BEGINDUMP
#include <windows.h>

#include "hbapi.h"
#include "hbapiitm.h"
#include "hbapifs.h"

#include <shellapi.h>
#include <shlobj.h>
#include <shlwapi.h>

#include <lmcons.h>
#include <commctrl.h>

HB_FUNC( SHELLEXECUTE )
{
   hb_retnl
   (
      ( LONG ) ShellExecute
      (
         ( HWND ) hb_parnl( 1 ),
         HB_ISNIL( 2 ) ? NULL : ( LPCTSTR ) hb_parc( 2 ),
         ( LPCSTR ) hb_parc( 3 ),
         HB_ISNIL( 4 ) ? NULL : ( LPCTSTR ) hb_parc( 4 ),
         HB_ISNIL( 5 ) ? NULL : ( LPCTSTR ) hb_parc( 5 ),
         hb_parni( 6 )
      )
   );
}
#pragma ENDDUMP
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Bloquear a Estação de Usuário

Mensagem por lugab »

Obrigado, Asimoes
lugab
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Bloquear a Estação de Usuário

Mensagem por alxsts »

Olá!

Obrigado por compartilhar.

Quais libs são necessárias para linkar?

Código: Selecionar todos

D:\TestesHB\LockComputer>hbmk2 lock -b
Harbour 3.2.0dev (Rev. 18443)
Copyright (c) 1999-2012, http://harbour-project.org/
Compiling 'lock.prg'...
Lines 6342, Functions/Procedures 8
Generating C source output to 'C:\Users\santosa\AppData\Local\Temp\hbmk_zui4r7.dir\lock.c'... Done.
C:/Users/santosa/AppData/Local/Temp/hbmk_zui4r7.dir/lock.o:lock.c:(.data+0x1f8): undefined reference
 to `HB_FUN_SECTOTIME'
C:/Users/santosa/AppData/Local/Temp/hbmk_zui4r7.dir/lock.o:lock.c:(.data+0x228): undefined reference
 to `HB_FUN_WIN_OLECREATEOBJECT'
C:/Users/santosa/AppData/Local/Temp/hbmk_zui4r7.dir/lock.o:lock.c:(.data+0x328): undefined reference
 to `HB_FUN_WVGCRT'
C:/Users/santosa/AppData/Local/Temp/hbmk_zui4r7.dir/lock.o:lock.c:(.data+0x398): undefined reference
 to `HB_FUN_HB_GT_WVG_DEFAULT'
C:/Users/santosa/AppData/Local/Temp/hbmk_zui4r7.dir/lock.o:lock.c:(.data+0x3b8): undefined reference
 to `HB_FUN_HB_GT_WGU'
C:/Users/santosa/AppData/Local/Temp/hbmk_zui4r7.dir/lock.o:lock.c:(.data+0x3c8): undefined reference
 to `HB_FUN_HB_GT_WVG'
collect2: ld returned 1 exit status
hbmk2: Erro: Executando linkeditor. 1
gcc.exe C:/Users/santosa/AppData/Local/Temp/hbmk_zui4r7.dir/lock.o C:/Users/santosa/AppData/Local/Te
mp/hbmk_zui4r7.dir/hbmk_a6mqaw.o    -mconsole -Wl,--start-group -lhbextern -lhbdebug -lhbvm -lhbrtl
-lhblang -lhbcpage -lgtcgi -lgtpca -lgtstd -lgtwin -lgtwvt -lgtgui -lhbrdd -lhbuddall -lhbusrrdd -lr
ddntx -lrddcdx -lrddnsx -lrddfpt -lhbrdd -lhbhsx -lhbsix -lhbmacro -lhbcplr -lhbpp -lhbcommon -lhbma
instd -lkernel32 -luser32 -lgdi32 -ladvapi32 -lws2_32 -lwinspool -lcomctl32 -lcomdlg32 -lshell32 -lu
uid -lole32 -loleaut32 -lmpr -lwinmm -lmapi32 -limm32 -lmsimg32 -lwininet -lhbpcre -lhbzlib   -Wl,--
end-group -olock.exe  -LD:/hmg.3.0.46/HARBOUR/lib/win/mingw

D:\TestesHB\LockComputer>
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Bloquear a Estação de Usuário

Mensagem por asimoes »

Para compilar:

Bat para compilar.

Código: Selecionar todos

@echo off
set path=\hb32\bin
hbmk2 bloqueio.hbp -rebuild
pause
script hbp para compilar

Código: Selecionar todos

#---------------------------
# Nome do Executavel
# ---------------------------
-obloqueio
# ---------------------------
# Bibliotecas
# ---------------------------
-lhbct
-lhbgt
-lgtwvg
-lgtwvt
-lhbwin
-lhbnf
-lxhb
# ---------------------------
# Caminhos dos Includes
# ---------------------------
-incpath=\hb32\include;
# ---------------------------
# Caminho das Libs da HwGui
# ---------------------------
# Outros Parƒmetros
# ---------------------------
-workdir=.\OBJMINGW\
-gtgui
-head=full
-n
-warn=no
-inc
#Para compactar o executável.
#-compr 
-b
-mt
-dVERSAO_MINGW
# ---------------------------
# Prg(s) e Rc(s)
# ---------------------------
bloqueio.prg
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Bloquear a Estação de Usuário

Mensagem por asimoes »

Um shell só para o RUNDLL32

Uso: rundll32Shell("user32.dll,LockWorkStation",.F.) //.T. aguarda a resposta da execução.

Código: Selecionar todos

#pragma BEGINDUMP
#include <windows.h>

#include "hbapi.h"
#include "hbapiitm.h"
#include "hbapifs.h"

#include <shellapi.h>
#include <shlobj.h>
#include <shlwapi.h>

#include <lmcons.h>
#include <commctrl.h>

   HB_FUNC( RUNDLL32SHELL )
   {
     SHELLEXECUTEINFO ShExecInfo = {0};     
     
     LPCTSTR lpCommand = (LPTSTR) hb_parc( 1 );
     
     BOOL bRetorno = FALSE;
     
     int lenlpCommand = hb_parclen( 1 ) + 4;
     
     char * cfinalCommand = ( char * ) hb_xgrab( hb_parclen( 1 ) + 4 );
     
     hb_snprintf(cfinalCommand, lenlpCommand, "%s%s", "/C ", lpCommand);
    
     ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
     ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
     ShExecInfo.hwnd = NULL;
     ShExecInfo.lpVerb = NULL;
     ShExecInfo.lpFile = "rundll32.exe";
     ShExecInfo.lpParameters = cfinalCommand;   
     ShExecInfo.lpDirectory = NULL;
     ShExecInfo.nShow = SW_HIDE;
     ShExecInfo.hInstApp = NULL; 
     ShellExecuteEx(&ShExecInfo);
     if(ShExecInfo.hProcess !=NULL)
     {
        if (hb_parl(2))
        {
           //Aguarda até que a execução tenha sido concluída.
           WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
           CloseHandle(ShExecInfo.hProcess);
        }
        bRetorno = TRUE;
     }
     else
     {
        //Retorna .F.
        bRetorno = FALSE;
     }
     hb_xfree( cfinalCommand );
     hb_retl(bRetorno);
   }
#pragma ENDDUMP
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Bloquear a Estação de Usuário

Mensagem por asimoes »

Completando com mais uma função interessante:

ExitWindowsEx(0,0) //logoff
ExitWindowsEx(1,0) //shutdown
ExitWindowsEx(2,0) //reboot (reinicilializar)
ExitWindowsEx(6,0) //force reboot (reinicialização forçada)
ExitWindowsEx(8,0) //poweroff (desligar)

Código: Selecionar todos

IF hb_osIsWinNT()
   EnablePermissions()
ENDIF
ExitWindowsEx(6,0) //force reboot 2 + 4 (reinicialização forçada)

#pragma BEGINDUMP
#include <windows.h>

#include "hbapi.h"
#include "hbapiitm.h"
#include "hbapifs.h"

#include <shellapi.h>
#include <shlobj.h>
#include <shlwapi.h>

#include <lmcons.h>
#include <commctrl.h>

HB_FUNC( ENABLEPERMISSIONS )
{
   LUID tmpLuid;
   TOKEN_PRIVILEGES tkp, tkpNewButIgnored;
   DWORD lBufferNeeded;
   HANDLE hdlTokenHandle;
   HANDLE hdlProcessHandle = GetCurrentProcess();

   OpenProcessToken(hdlProcessHandle, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hdlTokenHandle);

   LookupPrivilegeValue(NULL, "SeShutdownPrivilege", &tmpLuid);

   tkp.PrivilegeCount            = 1;
   tkp.Privileges[0].Luid        = tmpLuid;
   tkp.Privileges[0].Attributes  = SE_PRIVILEGE_ENABLED;

   AdjustTokenPrivileges(hdlTokenHandle, FALSE, &tkp, sizeof(tkpNewButIgnored), &tkpNewButIgnored, &lBufferNeeded);
}

HB_FUNC( EXITWINDOWSEX )
{
   hb_retl( ExitWindowsEx( (UINT) hb_parni( 1 ), (DWORD) hb_parnl( 2 ) ) );
}

#pragma ENDDUMP

►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Bloquear a Estação de Usuário

Mensagem por asimoes »

Simplesmente:

Código: Selecionar todos

FUNCTION MAIN
   LockWorkStation()
RETURN Nil

Código: Selecionar todos

#pragma BEGINDUMP
#include <windows.h>

HB_FUNC( LOCKWORKSTATION )
{
	  WINUSERAPI
	  BOOL
	  WINAPI LockWorkStation(VOID);
     LockWorkStation();
}
#pragma ENDDUMP
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Responder