Tem uma função neste código que eu estou postando que funciona independente de permissão.
BloqueiaEstacao()
rotinas.c
Código: Selecionar todos
#include "windows.h"
#include "time.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( PEGAINATIVIDADE )
{
LASTINPUTINFO lpi;
lpi.cbSize = sizeof (LASTINPUTINFO);
GetLastInputInfo (&lpi);
hb_retnd( ( DOUBLE ) ( GetTickCount() - lpi.dwTime ) / CLOCKS_PER_SEC );
}
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 )
)
);
}
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);
//MessageBox( NULL, cfinalCommand, TEXT( HB_I_("TESTE final") ), MB_ICONASTERISK );
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);
}
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 ) ) );
}
HB_FUNC( BLOQUEIAESTACAO )
{
WINUSERAPI
BOOL
WINAPI LockWorkStation(VOID);
//SendMessage(GetDesktopWindow(), WM_SYSCOMMAND, SC_SCREENSAVE, 0); // Inicia a proteção de tela.
LockWorkStation();
}
HB_FUNC( PROTECAODETELA )
{
SendMessage(GetDesktopWindow(), WM_SYSCOMMAND, SC_SCREENSAVE, 0); // Inicia a proteção de tela.
}
HB_FUNC( DESLIGARMONITOR )
{
//Monitor Off - Desligar o monitor.
//Sleep(100);
//SendMessage(GetForegroundWindow(), WM_SYSCOMMAND, SC_MONITORPOWER, 2);
//Sleep(300);
//SendMessage(GetForegroundWindow(), WM_SYSCOMMAND, SC_MONITORPOWER, 2);
//Sleep(1000);
SendMessage(GetForegroundWindow(), WM_SYSCOMMAND, SC_MONITORPOWER, 2);
}

