PDA

View Full Version : Aprire finestra in un determinato punto...


TonyManero
11-12-2006, 14:55
Salve a tutti!

C'è un modo per aprire una finestra (di solito uso ShellExecute) in una posizione ben definita del desktop? Per esempio al pixel 100 - 100 ?



In particolare ho un desktop esteso su due moitor e volevo fare un eseguibile che aprisse una finestra di explorer sul primo ed una sul secondo!!!

Idee? :D

andbin
11-12-2006, 17:12
C'è un modo per aprire una finestra (di solito uso ShellExecute) in una posizione ben definita del desktop? Per esempio al pixel 100 - 100 ?No, è l'applicazione che stabilisce se/dove/come aprire eventuali finestre. Dalla ShellExecute puoi specificare soltanto il parametro nShowCmd, che però l'applicazione può spudoratamente ignorare (vedi Firefox :asd: ).

A parte barbatrucchi vari (es. lanciare il programma e andare a cercare le sue finestre e posizionarle), si potrebbe fare se fosse l'applicazione ad accettare dei parametri che permettano di indicare dove posizionare la/e finestre.

Tralasciando ShellExecute, si potrebbe usare CreateProcess. La struttura STARTUPINFO ha i campi dwX/dwY/dwXSize/dwYSize, però si presuppone che l'applicazione faccia poi una GetStartupInfo per ottenere quei dati (e potrebbe anche non farlo).

TonyManero
12-12-2006, 07:10
No, è l'applicazione che stabilisce se/dove/come aprire eventuali finestre. Dalla ShellExecute puoi specificare soltanto il parametro nShowCmd, che però l'applicazione può spudoratamente ignorare (vedi Firefox :asd: ).

A parte barbatrucchi vari (es. lanciare il programma e andare a cercare le sue finestre e posizionarle), si potrebbe fare se fosse l'applicazione ad accettare dei parametri che permettano di indicare dove posizionare la/e finestre.

Tralasciando ShellExecute, si potrebbe usare CreateProcess. La struttura STARTUPINFO ha i campi dwX/dwY/dwXSize/dwYSize, però si presuppone che l'applicazione faccia poi una GetStartupInfo per ottenere quei dati (e potrebbe anche non farlo).

Uhmm... navinganzo in rete mi sembra di aver capito che la cosa più semplice è aprire la finestra e spostarla in seguito.... consgiliato di usare la SetWindowPos.... potrebbe essere la soluzione ottimale?

andbin
12-12-2006, 08:35
Uhmm... navinganzo in rete mi sembra di aver capito che la cosa più semplice è aprire la finestra e spostarla in seguito.... consgiliato di usare la SetWindowPos.... potrebbe essere la soluzione ottimale?Certo, SetWindowPos va sicuramente bene, però ha bisogno di un handle HWND che devi cercare/ottenere in qualche modo. Potresti usare FindWindow per cercare una finestra in base al nome della classe e/o titolo della finestra. Se sai questi dati (e sono univoci), non dovresti avere problemi. Altrimenti ti tocca enumerare tutte le finestre top-level e cercare la/e finestre che appartengono al processo lanciato.

TonyManero
12-12-2006, 10:08
Certo, SetWindowPos va sicuramente bene, però ha bisogno di un handle HWND che devi cercare/ottenere in qualche modo. Potresti usare FindWindow per cercare una finestra in base al nome della classe e/o titolo della finestra. Se sai questi dati (e sono univoci), non dovresti avere problemi. Altrimenti ti tocca enumerare tutte le finestre top-level e cercare la/e finestre che appartengono al processo lanciato.

In effetti è prorpio così che ho deciso di procedere... ovvere FindWindow per recuperare l'Handle seguita da una SetWindowPos...

L'unica cosa è che a vedere in giro sembra che se ci sono più finestre di explorer aperte non sia proprio banalissimo trovare l'Handle a quella giusta! Consigli?

andbin
12-12-2006, 10:21
In effetti è prorpio così che ho deciso di procedere... ovvere FindWindow per recuperare l'Handle seguita da una SetWindowPos...

L'unica cosa è che a vedere in giro sembra che se ci sono più finestre di explorer aperte non sia proprio banalissimo trovare l'Handle a quella giusta! Consigli?Le finestre tipo "Risorse del computer" hanno classe "CabinetWClass" mentre quelle di "Esplora risorse" hanno classe "ExploreWClass".
Poi se sono aperte su un percorso fisico, sul titolo della finestra c'è il path completo (dipende però da come è configurato nelle "Opzioni cartella").

TonyManero
03-01-2007, 07:23
Le finestre tipo "Risorse del computer" hanno classe "CabinetWClass" mentre quelle di "Esplora risorse" hanno classe "ExploreWClass".
Poi se sono aperte su un percorso fisico, sul titolo della finestra c'è il path completo (dipende però da come è configurato nelle "Opzioni cartella").

Domanda... penso non banale....

Tutto l'ambaradan di cui sopra mi serve per aprire su un PC remoto una finestra internet... per la precisione il PC remoto gestisce 4 monitor.

Comunque per adesso è tutto ok.... creo la finestra di explorer sul PC remoto nel punto desiderato del desktop "espanso".

Ora però è un problema.... il sito che deve essere visualizzato è un sito con frames. Quaindi a quasiasi pagina accedo l'indirizzo che vedo è sempre www.pippo.it. Come facci ad indicargli di aprire una particolare pagina del sito (non un singolo frame)?!

:p

trallallero
03-01-2007, 08:07
No, è l'applicazione che stabilisce se/dove/come aprire eventuali finestre.

EVVAI !!!! Stavolta vince Unix!!! :D

shelltool -Wp <x> <y> :rotfl:

TonyManero
03-01-2007, 15:20
Ultima domanda e poi smetto di scroccare...

Ma come diavolo si può chiudere una finestra di internet explorer di cui sò il nome?????? :cry:

andbin
03-01-2007, 15:33
Ma come diavolo si può chiudere una finestra di internet explorer di cui sò il nome?????? :cry:Cioè sai il titolo???
Prova con FindWindow (per trovare l'handle) e poi invia il messaggio WM_CLOSE.

trallallero
03-01-2007, 15:49
arivince UNIX :yeah:
kill -9 `ps -edaf | grep -w <nome> | grep -v grep | awk '{print $2}'`

scherzo ovviamente ma lasciatemi sognare :D

TonyManero
11-01-2007, 07:58
Cioè sai il titolo???
Prova con FindWindow (per trovare l'handle) e poi invia il messaggio WM_CLOSE.

La finestra di explorer viene creata da questa riga:


<SCRIPT language="JavaScript" type="text/javascript">
<!--
weblink=window.open("http://www.google.it","NomePagina","width=640,height=480,left=200,top=200");
// -->
</SCRIPT>


Quiandi penso che il nome della finestra sia "NomePagina".

Ho molta difficoltà a trovare esempi di utilizzo dellla FindWindow... sai dove posso cercarli?

Grazie! :)

andbin
11-01-2007, 08:28
La finestra di explorer viene creata da questa riga:


<SCRIPT language="JavaScript" type="text/javascript">
<!--
weblink=window.open("http://www.google.it","NomePagina","width=640,height=480,left=200,top=200");
// -->
</SCRIPT>


Quiandi penso che il nome della finestra sia "NomePagina".No, "NomePagina" è solo un nome interno che serve come riferimento quando si usano i tag <form> e <a> con l'attributo TARGET.
Non è quindi il titolo della finestra. Se apri google, il titolo su IE sarà "Google - Microsoft Internet Explorer".

Ho molta difficoltà a trovare esempi di utilizzo dellla FindWindow... sai dove posso cercarli?Ecco un esempio:
HWND hWndIE;

hWndIE = FindWindow ("IEFrame", "Google - Microsoft Internet Explorer");

if (hWndIE != NULL)
{
....
}

TonyManero
11-01-2007, 13:43
No, "NomePagina" è solo un nome interno che serve come riferimento quando si usano i tag <form> e <a> con l'attributo TARGET.
Non è quindi il titolo della finestra. Se apri google, il titolo su IE sarà "Google - Microsoft Internet Explorer".

Ecco un esempio:
HWND hWndIE;

hWndIE = FindWindow ("IEFrame", "Google - Microsoft Internet Explorer");

if (hWndIE != NULL)
{
....
}

Grazie grazie!!!! Il programma finalmente procede... :)

Altra domanda... :D Ma creando la finestra con la CreateProcess mi ritorna l'Handle? Qual'è il modo più semplice di creare una finestra di internet explorer avendone l'handler e non dovendolo ricercare in seguito?

TonyManero
24-01-2007, 09:53
No, "NomePagina" è solo un nome interno che serve come riferimento quando si usano i tag <form> e <a> con l'attributo TARGET.
Non è quindi il titolo della finestra. Se apri google, il titolo su IE sarà "Google - Microsoft Internet Explorer".


Domanda... se ho 2 finestre aperte della classe IEFrame... e sono una nella posizione 100x100 e l'altra in 200x200... come faccio a trovare l'handle di una o dell'altra se non so quale delle due è in primo piano e non ho altri dati?

Pensavo di trovare l'handle di una e vedere se era nella posizione che mi interessava... e così via. Il problema è che FindWindow mi ritorna l'handle sempre della stessa... che sarebbe quella delle due che è in primo piano rispetto all'altra. Qaundo vedo che non è quella che mi interessa ci vorrebbe un modo per toglierla dal top-level... in modo che rilanciando la mia funzione vado a beccare un'altra finestra e così via finchè non trovo la mia...

andbin
24-01-2007, 13:12
Domanda... se ho 2 finestre aperte della classe IEFrame... e sono una nella posizione 100x100 e l'altra in 200x200... come faccio a trovare l'handle di una o dell'altra se non so quale delle due è in primo piano e non ho altri dati?

Pensavo di trovare l'handle di una e vedere se era nella posizione che mi interessava... e così via. Il problema è che FindWindow mi ritorna l'handle sempre della stessa... che sarebbe quella delle due che è in primo piano rispetto all'altra. Qaundo vedo che non è quella che mi interessa ci vorrebbe un modo per toglierla dal top-level... in modo che rilanciando la mia funzione vado a beccare un'altra finestra e così via finchè non trovo la mia...Devi usare la funzione EnumWindows. Questa funzione enumera tutte le finestre top-level. Per ogni handle ottenuto, vai a vedere la classe della finestra e se è "IEFrame" hai trovato una finestra di IE.

TonyManero
24-01-2007, 13:50
Devi usare la funzione EnumWindows. Questa funzione enumera tutte le finestre top-level. Per ogni handle ottenuto, vai a vedere la classe della finestra e se è "IEFrame" hai trovato una finestra di IE.

Azz.... lo sapevo che me l'avresti detto.... :( :D


E' possibile che per risolvere 'sto programma ogni API nuova con cui mi trovo a che fare se ne porta dietro un'altra??? :D :D

La EnumWindows l'ho vista ma mi riporta ad una misteriosa funzione "callback" di cui non capisco la funzione... mi dai un aiuto o mi posti un esempio semplice?

Ti ringrazio infinitamente! :)

andbin
24-01-2007, 14:00
La EnumWindows l'ho vista ma mi riporta ad una misteriosa funzione "callback" di cui non capisco la funzione... mi dai un aiuto o mi posti un esempio semplice?Ecco:
BOOL CALLBACK ProcEnumeraFinestre (HWND hWnd, LPARAM lParam)
{
CHAR szClasse[128];

if (GetClassName (hWnd, szClasse, sizeof (szClasse)) > 0)
{
if (lstrcmp (szClasse, "IEFrame") == 0)
{
// ... hai trovato una finestra di IE ...
}
}

return TRUE;
}


...

EnumWindows (ProcEnumeraFinestre, 0L);

TonyManero
24-01-2007, 15:04
Capperi... mi dice:

[C++Error] Unit1.cpp(295): E2034 Cannot convert 'bool(__stdcall*)(void*,long)' to 'int(__stdcall*)()'.
[C++Error] Unit1.cpp(295): E2343 Type mismatch in parameter 'IpEnumFunc' in call to '__stdcall EnumWindows(int(__stdcall*)(),long)'.

Ti viene in mente cosa possa essere? :(

andbin
24-01-2007, 15:26
Capperi... mi dice:

[C++Error] Unit1.cpp(295): E2034 Cannot convert 'bool(__stdcall*)(void*,long)' to 'int(__stdcall*)()'.
[C++Error] Unit1.cpp(295): E2343 Type mismatch in parameter 'IpEnumFunc' in call to '__stdcall EnumWindows(int(__stdcall*)(),long)'.

Ti viene in mente cosa possa essere? :(Mi viene in mente solo una cosa: hai messo #define STRICT prima di includere windows.h???

TonyManero
24-01-2007, 15:47
Mi viene in mente solo una cosa: hai messo #define STRICT prima di includere windows.h???

No... ma ho appena l'ho appena fatto e nulla è cambiato... :(

andbin
24-01-2007, 15:56
Quale compilatore stai usando?

TonyManero
24-01-2007, 16:01
Quale compilatore stai usando?

Sono constretto al Borland C++ Builder 5....

Comunque ho trovato questo suggerimento che sembra fare al caso mio...

As the error message told you, this is simply a type-checking problem.
The EnumWindows call expects an argument of type
int __stdcall()
but you're giving it the value CallbackFunc, which has type
int __stdcall(void*,long)

The questions you ask yourself are: "why does the type system expect an
argument of that type? how can I force the compiler into accepting the
type of argument I give it?"


Answer: The Windows header files can work in two ways: STRICT, and
non-strict. VCL chooses to use non-strict because it's stupid. In
non-strict mode, all callbacks must be manually coerced to type "int
__stdcall()".

TonyManero
24-01-2007, 16:11
Ora mi compila e sembra funzionare... :)