Newsgroup: it.comp.programmare.win32
Titolo: domanda: inviare CTRL+ALT+CANC

Salve a tutti,
  qualcuno sa come si può inviare un SAS (es. CTRL+ALT+CANC) da un
programma? Quello che vorrei fare e sbloccare il computer senza "usare le
mani", nel senso che quando parte lo screen saver, vorrei fare in modo che
il programma invii la sequenza SAS terminando lo screen saver... un po'
quello che succede quando muovi il mouse. Ho provato con:
keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, NULL);
mouse_event(MOUSEEVENTF_MOVE, 1, 1, 0, NULL);
keybd_event(VK_CONTROL | VK_MENU | VK_DELETE, 0, 0, NULL);
keybd_event(VK_CONTROL + VK_MENU + VK_DELETE, 0, 0, NULL);
ma nessuno dei tre metodi mi ha dato i risultati sperati... forse sto
sbagliando qualcosa?
Vi ringrazio tantissimo.
V


No... forse mi sono spiegato male io. Io vorrei scrivere un'applicazione
che, chiaramente, stia sempre in esecuzione e, al verificarsi di determinate
condizioni, si attivi. Il lavoro di questa applicazione deve essere:
1) se non c'è il computer bloccato, non fa nulla
2) se il computer è bloccato dallo screensaver (con o senza pasword non
importa), l'applicazione lo sblocca
Del punto 2, per ora, mi basta che riesca a togliere lo screensaver. In
futuro dovrei far si che l'applicazione autentichi l'utente ed effettui il
login... ma prima devo riuscire a risolvere il primo pezzo del problema.
Quindi l'applicazione non deve impedire allo screensaver di partire:
semplicemente deve essere in grado di sbloccarlo in un qualsiasi momento.
Scusa se prima mi ero spiegato in maniera un po' arzigogolata... spero di
aver fatto meglio stavolta. Cmq grazie per la risposta e, se ne hai una
anche a questo problema, sarebbe spettacolare.
V

 ha scritto nel messaggio 
news:422f2...@x-privat.org...

Se ho ben capito non vuoi lo screensaver durante la tua applicazione.
Allora è sufficiente usare queste poche righe di codice:
static BOOL activeScreenSaver;
all'avvio:
  SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0,
(PVOID)&activeScreenSaver, 0);
  if(hasScreenSaver)
    SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 0, 0, 0);
al termine:
  SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, activeScreenSaver, 0, 0);

 [CUT]
Prova con la SendInput()



Quando entra in azione lo "schermo bloccato" (e quindi Windows è in attesa
del SAS) purtroppo nessuna applicazione standard può interagire con
l'utente. Per poter interagire con il SAS dovresti emulare le pressioni dei
tasti (CTRL+ALT+CANC e relativa password dell'utente corrente) a livello di
driver.
Conta che se tu riuscissi in questo intento indeboliresti di molto la
sicurezza della workstation, perchè una volta sbloccato il SAS il pc sarebbe
alla mercè del primo utente che passa lì di fronte. Non è molto bello...
Potrebbe esserci un modo alternativo di fare quello che chiedi, mantenendo
un livello di sicurezza adeguato. Puoi andare un po' più nel dettaglio della
tua applicazione?
-- 
Fermiamo Scientology prima che sia troppo tardi!!!
http://xenu.com-it.net
  ---  
http://www.xenu.net
(per rispondere personalmente leva IlDitoDalCulo)

 ha scritto nel messaggio
news:4zrYd.1044371$35.38...@news4.tin.it...

Già fatto...


Certo!!! Quello che dovrei fare è la seguente cosa: un'applicazione desktop
che, tramite bluetooth, controlla quali dispositivi BT si trovano nelle
vicinanze. Quando incontra un particolare dispositivo (uno autenticato
oppure uno che chiede di autenticarsi e ci riesce), se il sistema Windows è
bloccato dallo screen saver, semplicemente disattiva questo screensaver e
permette, all'utente possessore del dispositivo BT mobile, di lavorare col
computer. Ho provato a fare:
1)
****************************************************************************
**********
INPUT input[6];
input[0].type = INPUT_KEYBOARD;
input[0].ki.wVk = VK_CONTROL;
input[0].ki.time = 0;
input[0].ki.dwFlags = 0;
input[0].ki.dwExtraInfo = 0;
input[1].type = INPUT_KEYBOARD;
input[1].ki.wVk = VK_MENU;
input[1].ki.time = 0;
input[1].ki.dwFlags = 0;
input[1].ki.dwExtraInfo = 0;
input[2].type = INPUT_KEYBOARD;
input[2].ki.wVk = VK_DELETE;
input[2].ki.time = 0;
input[2].ki.dwFlags = 0;
input[2].ki.dwExtraInfo = 0;
input[3].type = INPUT_KEYBOARD;
input[3].ki.wVk = VK_CONTROL;
input[3].ki.time = 0;
input[3].ki.dwFlags = 2;
input[3].ki.dwExtraInfo = 0;
input[4].type = INPUT_KEYBOARD;
input[4].ki.wVk = VK_MENU;
input[4].ki.time = 0;
input[4].ki.dwFlags = 2;
input[4].ki.dwExtraInfo = 0;
input[5].type = INPUT_KEYBOARD;
input[5].ki.wVk = VK_DELETE;
input[5].ki.time = 0;
input[5].ki.dwFlags = 2;
input[5].ki.dwExtraInfo = 0;
SendInput(6, input, sizeof(INPUT));
****************************************************************************
**********
2)
****************************************************************************
**********
keybd_event(VK_CONTROL, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0 );
keybd_event(VK_MENU, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0 );
keybd_event(VK_DELETE, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0 );
keybd_event(VK_DELETE, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
keybd_event(VK_MENU, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
****************************************************************************
**********
3)
****************************************************************************
**********
HWND hwnd = GetForegroundWindow();        //anche con GetTopWindow(),
GetDesktopWindow() e HWND_BROADCAST
PostMessage(hwnd, WM_HOTKEY, 0, MAKELONG(MOD_ALT | MOD_CONTROL, VK_DELETE));
****************************************************************************
**********
4)
****************************************************************************
**********
HWND hwnd = GetForegroundWindow();        //anche con GetTopWindow(),
GetDesktopWindow() e HWND_BROADCAST
SendMessage(hwnd, WLX_SAS_TYPE_CTRL_ALT_DEL, 0, 0);
****************************************************************************
**********
5)
****************************************************************************
**********
BroadcastSystemMessage(BSF_SENDNOTIFYMESSAGE | BSF_FORCEIFHUNG, &recs,
MAKELONG(MOD_ALT | MOD_CONTROL, VK_DELETE), 0, 0);
keybd_event(VK_DELETE, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0 );
keybd_event(VK_DELETE, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
****************************************************************************
**********
solo per elencare le principali... più altre combinazioni simili. Ho provato
anche a simulare il movimento del mouse. Inutile dire che nessuno di questi
tentativi ha dato i risultati sperati, ma forse sbaglio qualcosa nel
codice... oppure ho sbagliato proprio approccio. Hai qualche suggerimento?
Grazie
V


<snip>
dovresti sostutuire la gina.dll del sistema.
Nell'MSDN dovrebbe esserci un esempio. Più che sostituire completamente è 
più semplice intercettare solo quello che ti serve e far gestire il resto 
alla gina originale

 ha scritto nel messaggio
news:d13pbu$8uk$1...@fata.cs.interbusiness.it...

Si, ho già sostituito la GINA originale con una da me creata, ma non riesco
ad accedere alla tabella con la WlxSasNotify... sapresti mica indicarmi come
si può fare? Il problema è che, quando devo sbloccare lo screensaver
dall'applicazione, non so come richiamare (appunto) la WlxSasNotify, anche
perchè non so come accedere ai parametri da passare a questa funzione...
Soluzioni?
Grazie
V

 mani"
snip
Preso dai sorgenti di VNC.
con poca fatica dovresti riuscire ad adattarlo....
Ciao
Beppe
// Static routine used to fool Winlogon into thinking CtrlAltDel was pressed
void *
SimulateCtrlAltDelThreadFn(void *context)
{
 HDESK old_desktop = GetThreadDesktop(GetCurrentThreadId());
 // Switch into the Winlogon desktop
 if (!vncService::SelectDesktop("Winlogon"))
 {
  log.Print(LL_INTERR, VNCLOG("failed to select logon desktop\n"));
  return FALSE;
 }
 log.Print(LL_ALL, VNCLOG("generating ctrl-alt-del\n"));
 // Fake a hotkey event to any windows we find there.... :(
 // Winlogon uses hotkeys to trap Ctrl-Alt-Del...
 PostMessage(HWND_BROADCAST, WM_HOTKEY, 0, MAKELONG(MOD_ALT | MOD_CONTROL,
VK_DELETE));
 // Switch back to our original desktop
 if (old_desktop != NULL)
  vncService::SelectHDESK(old_desktop);
 return NULL;
}
// Static routine to simulate Ctrl-Alt-Del locally
BOOL
vncService::SimulateCtrlAltDel()
{
 log.Print(LL_ALL, VNCLOG("preparing to generate ctrl-alt-del\n"));
 // Are we running on NT?
 if (IsWinNT())
 {
  log.Print(LL_ALL, VNCLOG("spawn ctrl-alt-del thread...\n"));
  // *** This is an unpleasant hack.  Oh dear.
  // I simulate CtrAltDel by posting a WM_HOTKEY message to all
  // the windows on the Winlogon desktop.
  // This requires that the current thread is part of the Winlogon desktop.
  // But the current thread has hooks set & a window open, so it can't
  // switch desktops, so I instead spawn a new thread & let that do the
work...
  omni_thread *thread = omni_thread::create(SimulateCtrlAltDelThreadFn);
  if (thread == NULL)
   return FALSE;
  thread->join(NULL);
  return TRUE;
 }
 return TRUE;
}


L'ho riadattato, compila, esegue ma non termina lo screen saver... e mi
dispiace tanto.
V