Newsgroup: it.comp.programmare.win32
Titolo: Nascondere applicazione dalla lista applicazioni attive

Dovrei fare in modo che la mia applicazione non appaia nella lista delle 
applicazioni visualizzate premendo ALT+TAB
Premetto che non posso impostare il bordo a bsToolWindow perch� deve stare a 
bsNone.
Ho provato a settare Form1->BorderStyle = bsNone & bsToolWindow (usando 
anche |) ma le propriet� non vengono cumulate.
Se conoscete un modo per fare questo, tanto meglio, altrimenti se non ho 
letto male, credo di aver trovato un esempio, ancora una volta per Delphi: 
http://www.delphicorner.f9.co.uk/articles/apps3.htm
Il codice proposto, va messo nel Project1.cpp, riporto dal sito:
var
  ExtendedStyle : Integer;
begin
  Application.Initialize;
  //Get the Extended Styles of the Application, by passing its
  //handle to GetWindowLong
  ExtendedStyle := GetWindowLong(Application.Handle, GWL_EXSTYLE);
  //Now, set the Extended Style by doing a bit masking operation.
  //OR in the WS_EX_TOOLWINDOW bit, and AND out the WS_EXAPPWINDOW bit
  //This effectively converts the application from an App Windows to a
  //Tool Window.
  SetWindowLong(Application.Handle, GWL_EXSTYLE, ExtendedStyle OR 
WS_EX_TOOLWINDOW
                                                 AND NOT WS_EX_APPWINDOW);
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Io l'ho adattato mettendo tra Initialize e CreateForm questo:
int ExtendedStyle = GetWindowLong(Application->Handle, GWL_EXSTYLE);
SetWindowLong(Application->Handle, GWL_EXSTYLE, ExtendedStyle | 
WS_EX_TOOLWINDOW & !WS_EX_APPWINDOW);
Stavolta ho controllato bene gli operatori bitwise ma forse ho letto male 
io, mi sar� sfuggito qualcosa, perch� non fa quello che vorrei.
Grazie 

 Grazie
Precedenza degli operatori ...
SetWindowLong(Application->Handle, GWL_EXSTYLE, (ExtendedStyle | 
WS_EX_TOOLWINDOW) & !WS_EX_APPWINDOW);
P.S. Nell'altro thread mi era proprio sfuggito che avevi messo il '||' 
al posto di '|' :-(
Ciao

 al posto di '|' :-(
Sviste :-) 

Noixe ha scritto:

devo essere definitivamente rinco... ci vuole il not a bit (come da mio 
primo post nell'altro thread) :-(
SetWindowLong(Application->Handle, GWL_EXSTYLE, (ExtendedStyle | 
WS_EX_TOOLWINDOW) & ~WS_EX_APPWINDOW);
Ciao

 WS_EX_TOOLWINDOW) & ~WS_EX_APPWINDOW);
Il risultato è che non appare nella taskbar ma rimane nell'elenco delle 
applicazioni che appaiono con ALT+TAB.
Ma le parentesi non essendo presenti nella versione Delphi, non dovrebbero 
essere usate nemmeno qui.
La precedenza degli operatori forse era giusta in quel modo, fatto sta che 
con parentesi  o meno non funziona. 

Noixe ha scritto:

Ciao, io ho usato questo modo che però è in c#:
private void CallTime_FormClosing(object sender, 
FormClosingEventArgs e)
{
     if (e.CloseReason == CloseReason.UserClosing)
     {
         this.Hide();
         e.Cancel = true;
         this.DialogResult = DialogResult.None;
     }
}
Infine nella FormLoad:
this.Close();
Ricorda solo di verificare chi vuole chiudere 
l'applicativo altrimenti rischi che non si chiuda 
nemmeno windows allo shutdown.
Così facendo a me nella lista di ALT+TAB non 
compare. Fammi sapere.
Un saluto.

Mi sono accorto ora di aver capito male perché se 
non erro tu vorresti, però, che il form sia 
visualizzato, vero?

 delle applicazioni visualizzate premendo ALT+TAB
Hai provato
Application->ShowMainForm=false;
dopo Application->Initialize()?
Cristiano 

 dopo Application->Initialize()?
In questo modo non si vede proprio la form 

 però, che il form sia visualizzato, vero?
Si, deve apparire la form ma non deve apparire il pulsante nella taskbar 
(discusso e risolto nel thread precedente) e nemmeno nella lista delle 
applicazioni attiva che che appare facendo ALT+TAB (ancora da risolvere).
Comunque un'eventuale soluzione in C#, probabilmente si adatta rapidamente 
al C++ per .NET (managed?).
Sul C++ builder credo avrei qualche problema a riportarla. 

Noixe ha scritto:

Ho provato a creare un'applicazione minimale usando le impostazioni che 
ti avevo scritto e funziona, anche su win7 a 64bit.
Ha la barra del titolo più sottile, e non appare né nella appBar né 
nella lista da ALT+TAB.
Ho messo su
http://www.ennepisoft.it/test/test_no_ALT_TAB.zip
il binario(*) ed il sorgente. Uso la mia libreria, ma è giusto per far 
vedere qualcosa.
(*) so che non si deve essere pazzi da avviare un eseguibile senza 
averne la fonte attendibile, se hai una macchina (virtuale?) su cui 
provare ... altrimenti buttalo
Ciao

 altrimenti buttalo
Figurati, mi fido.
Al massimo ti invitavo a provare un bel programmino per testare la tua 
pazienza :-D 

Noixe ha scritto:

Se non deve esserci la barra del titolo puoi nasconderla.
Nella WindowProcedure intercetti il WM_NCHITTEST, se si trova su 
HTCAPTION, lo imposti su HTCLIENT. Poi intercetti il WM_NCPAINT e ci 
disegni quello che vuoi.
In questo modo non puoi muovere la finestra, se ti va sotto l'unico modo 
di rivederla è di minimizzare/spostare le altre finestre ...
Però, se spieghi a cosa ti serve ...
Ciao

 Però, se spieghi a cosa ti serve ...
In pratica, questa piccola (in)utility dovrebbe simulare un gadget (come 
quelli della sidebar presenti in windows vista e windows 7), per cui:
- non deve avere bordi
- non deve apparire nella taskbar
- non deve apparire nella lista che appare con ALT+TAB.
Mi manca solo l'ultimo punto da risolvere, per il resto ho fatto tutto. 

Ho trovato la soluzione.
E' sufficiente mettere queste istruzioni prima che il form venga costruito:
 SetWindowLong(Application->Handle, GWL_EXSTYLE,
                GetWindowLong(Application->Handle, GWL_EXSTYLE) | 
WS_EX_TOOLWINDOW);
SetWindowLong(Form1->Handle, GWL_EXSTYLE,
                GetWindowLong(Form1->Handle, GWL_EXSTYLE) | 
WS_EX_TOOLWINDOW);
Saluti