Newsgroup: it.comp.lang.delphi
Titolo: Desktop's: Come cavolo si usano???

Dopo mesi e mesi di ricerche sul network, mi sono *quasi* convinto che in 
delphi non si possa fare.
Ho questo problema:
Ho scritto un service che cattura il video e lo manda ad un'altro PC assieme 
al mouse e alla tastiera.
Fino a quando lavoro nel desktop 'Defaul' tutto va' a meraviglia............ 
MA se switcho nella finestra di "Winlogon" non funziona un cavolo....
Notare che le chiamate API
hWinStation := OpenWindowStation('WinSta0', FALSE, MAXIMUM_ALLOWED);:
Res := SetProcessWindowStation( hWinStation );
hDesktop := OpenDesktop('Default', 0, TRUE, MAXIMUM_ALLOWED); ( oppure 
'Winlogon' al posto di 'Default')
Res := SetThreadDesktop( {CurrentThreadId} hDesktop );
etc.
etc.
etc.
oramai le conosco come le mie tasche, le ho girate in tutte le salse 
possibili immaginabili ma NON sono MAI riuscito ad accedere al quel cavolo 
di desktop di "Winlogon".
Qualcuno, e' riuscito ad usarle e a farle funzionare correttamente in un 
service di delphi????
Vi prego.. datemi una mano.. ancora un po' e' butto tutto nella spazzatura.. 
:) windows compreso.....

 MA se switcho nella finestra di "Winlogon" non funziona un cavolo....
Mi verrebbe da pensare che, probabilmente, ciò che chiedi non sia 
possibile a livello di architettura Windows proprio per motivi di 
sicurezza: cosa c'è da catturare nello schermo di "Winlogon"? ;-)
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

 ha scritto nel messaggio 
news:4515b239$1...@extreme.x-privat.org...

Una soluzione un po' brutale può essere iniettare il codice della app in 
winlogon. 

  (
http://www.marco.breveglieri.name
)
Come cosa c'e' da catturare??? ;)
per esempio lo screen di login.... comprimerlo e mandarlo via rete al server 
che lo deve visualizzare..
Io penso che sia una bella sfida...
Ho provato la tecnica del'inject code, e funziona ma non eě proprio un 
metodo pulitissimo.. Se guardiamo il codice che utilzza
per esempio VNC, sembra MOLTO semplice, ed in effetti lo e'... Ma non riesco 
a capire perche in un service di Delphi non funziona, considerando che il 
mio service gira sotto utenza SYSTEM che tra l'altro e' quella stessa di 
'Winlogon.exe' .
Se ho formulato male la questione, vi prego di dirmelo che provero' ad 
essere piu' conciso..
Grazie. 

 ha scritto nel messaggio 
news:ef8s6u$bea$1...@fata.cs.interbusiness.it...

Non ho fatto una prova, ma se non ricordo male quando tento di catturare il 
video di logon ottengo uno schermo nero.
Alcuni programmi usano catturare lo schermo con la tecnica del "mirror" 
(solo in XP) usando un video device drive, forse in questo modo diventa 
possibile, ma non ho provato non essendo ancora riuscito ad implementare in 
modo funzionante questa tecnica.
Ciao giorgio


Ok. allora: io gia' utilizzo il mirror (nella fattispecie uso il 
MirageDriver) e tutto funziona a meraviglia sia in ricezione schermo che in 
trasmissione schermo.. anzi, a mio avviso penso di aver fatto un ottimo 
lavoro, meglio di tanti prodotti di concorrenza. Riesco a trasmettere in 
broadcast (cioe dalla macchina master a tutti i client) addiruttura un film 
divx o dvd in full screen a 1280*1024 senza perdere molti frames... ed in 
piu' ci ho messo pure l'audio... ma questo, e' un altro discorso... 
nonstante tutto questo sapere e fare, NON riesco a emulare uno straccio di 
movimento mouse in una finestra di logon. certo che microsoft si deve essere 
sbattuta abbastanza... non riesco a capire nemmeno come fanno gli altri..
SendInput non funziona perche' il desktop di winlogon e' protetto.
Mouse_Event neppure per lo stesso motivo.
L'unico modo che ho trovato per muovere il mouse in un desktop di winlogon, 
e' quello di usare SetCursorPos( x, y ), ma i click? come glieli faccio?
Allora la domanda e': COME CAVOLO si fa' ada entrare in un desktop 
protetto?? access rigths forse?? si, ma come?
un milione di grazie per la pazienza..
Ciao. Michele. 

 protetto?? access rigths forse?? si, ma come?
Hai provato con le API Win32 di simulazione del mouse: mouse_event.
Un paio di drive "mirror" li avrei trovati anch'io ma non so come 
utilizzarli. Avresti delle informazioni in merito o
puoi indicarmi dove trovarle?
Ciao Giorgio 

Hai provato con le API Win32 di simulazione del mouse: mouse_event.
mouse_event() e keybd_event() sono sostituite da SendInput().

"Andrea Laforgia" <a.laf...@andrealaforgia.it.invalid> ha scritto nel 
messaggio news:4g0jh2d24eed1tio1...@4ax.com...

Hai l'handle per inviargli direttamente i messaggi?
Giorgio 

 ha scritto nel messaggio 
news:45197b59$0$29076$5fc...@news.tiscali.it...

Io ho trovato l'SDK per MirageDriver. Non dicono un granche' ma se si sa' 
leggere tra le righe si riesce a farlo funzionare. non e' particolarmente 
complicato, bisogna solo fargli una chiamata per notificare un indirizzo di 
callback + l'attivazione/disattivazione driver tramite registry.
Se ti interessa dimmelo che faccio uno zippone e ti mando il tutto.
Riguardo alla domanda su mouse_input: non funziona nel desktop di winlogon e 
neanche sendinput. Per quello che riguarda l'handle, lo possiedo. Questo e' 
il codice che uso per ricavare l'accesso al desktop di winlogon:
Function ConnectDesktop(Param: WPARAM ): Integer;
Var
    Res: Integer;
Begin
     hWinStation := OpenWindowStation('WinSta0"', FALSE, MAXIMUM_ALLOWED);
         if ( not hWinStation) Then
         Begin
              WriteToLog(LOGSCREEN,'Error: Could not open WinStation');
              Result := -1;
            Exit;
         End;
        Res := SetProcessWindowStation(hWinStation);
         if (not Res) Then
         Begin
              CloseWindowStation(hWinStation);
              WriteToLog(LOGSCREEN,'Error: Could not set process 
WinStation');
              Result := -2;
              Exit;
         End;
         if ((Param = WTS_SESSION_LOGON) or (Param = WTS_SESSION_UNLOCK)) 
Then
              hDesktop := OpenDesktop('Default',0,TRUE,MAXIMUM_ALLOWED)
        Else if ((Param = WTS_SESSION_LOGOFF) or (Param = WTS_SESSION_LOCK)) 
Then
              hDesktop := OpenDesktop('WinLogon',0,TRUE,MAXIMUM_ALLOWED);
         if ( not hDesktop) Then
         Begin
             // Try this one if something goes wrong
             hDesktop := OpenInputDesktop(0, FALSE, MAXIMUM_ALLOWED);
         End;
         if (not hDesktop) Then
         Begin
              CloseDesktop(hDesktop);
              //CloseWindowStation(hWinStation);
              WriteToLog(LOGSCREEN,'Error: Could not open none of 
desktops');
              Result := -3;
              Exit;
         End;
         Res := SetThreadDesktop(hDesktop);
         if (not Res) Then
         Begin
              CloseDesktop(hDesktop);
              //CloseWindowStation(hWinStation);
              WriteToLog(LOGSCREEN,'Error: Could not set thread desktop');
              Result := -4;
              Exit;
         End;
         ChangeDesktop=true;
         WriteToLog(LOGSCREEN,"Desktop connect: success");
         Result := 0;
End;
non c'e' nemmeno il modo di impostare ACCESS RIGTHS. almeno con queste API.
Quindi: Come faccio ad avere accesso ? con tutti i sacrosanti diritti?
Ciao. Michele.

 Se ti interessa dimmelo che faccio uno zippone e ti mando il tutto.
Mi faresti una cortesia, il mio email e' 
padoan.giorgioCHIOCCIAtiscali.it
, 
grazie

Non cio' nemmeno mai provato, per ora sono riuscito e mi accontento di 
controllare il PC dopo l'accesso di login.
Ciao Giorgio