Alternativa a BlockInput
Enviado: 07 Jan 2016 15:31
Acho que a solução seria bloquear a estação enquanto a aplicação faz alguma coisa.
Tem uma função neste código que eu estou postando que funciona independente de permissão.
BloqueiaEstacao()
rotinas.c
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);
}