Newsgroup: it.comp.lang.delphi
Titolo: Programmi sulla traybar

Ho un programma sulla traybar e devo sviluppare un programma che esegua
queste operazioni:
    1. doppio click sull' iconcina del programma
    2. click sul pulsante in una form (es: form1)
    3. ripetere da 1 finche' non appare una scritta in una form (es: form2)
Non posso utilizzare le coordinate assolute.
In pratica vorrei realizzare un programma permetta di effettuare piu'
tentativi (come Accesso Remoto) con il programmino di NoPay.
Come faccio ?
Simone.
_________________________________
...e dio disse: "pkunzip universo.zip"
ICQ #: 19598133
Webmaster di 
www.drfalken.com
_________________________________

Come faccio ?
Lavoro impossibile! :)
Scherzi a parte la soluzione che proponi è molto inaffidabile...
Vorrei ricordarti che da qualche parte, nell'accesso remoto, c'è una voce
che ti permette di provare + volte la connessione internet...io per Nopay ho
impostato quella voce di ripetizione a 5, così va avanti almeno x un
po'.....
Ola!
--
- Carlo -

 po'.....
Il problema e' che da Accesso Remoto di Win9x la connessione genera un
errore in rnaapp.exe (non e' solo un problema mio ma di un sacco di
gente...basta che fai un salto su it.discussioni.notut...).
La maggior parte delle volte che il server ti autentica, non assegna un
indirizzo IP alla tua macchina: questa possibilita' non e' prevista da
Accesso Remoto di Win9x cosi' la connessione cade e Windows crolla (...o
quasi).
Le soluzioni sono:
    1. ti colleghi con il loro programmino (ma ti vengono i crampi alla
mano)
    2. ti colleghi con Accesso Remoto di Win2k
Per ora ho risolto optando per la 2. pero' volevo risolvere anche la
1.(automatizzando la procedura)
Possibile che non si riesca ad "aprire" un programma sulla Traybar ?


 Possibile che non si riesca ad "aprire" un programma sulla Traybar ?
Il problema č che non c'č modo di enumerare le finestre che hanno un'icona
nella TNA...
Perň puoi affrontare il problema da un altro punto di vista: molto
probabilmente il programma in questione non crea la finestra che ti
interessa quando clicchi sull'iconcina...
č + probabile che ne faccia solo una ShowWindow... cerca l'handle della
finestra che ti interessa e prova a fare altrettanto...
Cmq volendo potresti anche andare + a fondo e fare cosě: quando registri
un'icona nella TNA specifichi un messaggio che ti viene notificato per i
click del mouse sull'icona...
Spia con WinSight o Spy++ il numero del messaggio in questione e poi simula
il doppio click sull'handle della finestra... ti spedirei del codice se
avessi quel programma ma visto che NoPay nella mia zona non funge...
Ciao :-)
--
Andrea Magni
E-Mail: 
ama...@interac.it

 Possibile che non si riesca ad "aprire" un programma sulla Traybar ?
Ciao, allora... non vorrei dire una caxxata...
Tempo fa provai NoPay (solo il software... visto che non è disponibile nella
mia città)
e trovai l'handle della finestra (andando a cercare per i nomi delle classi)
principale.
Questa finestra, come dice Andrea, può essere visualizzata in modo forzato e
quindi
puoi poi accedere ai menù del programma (immagino ci sia una voce
"connetti"... )
Altra soluzione probabile ... se pur ostica... è quella di ottenere le
coordinate assolute
 dell'icona nella tna partendo da una ricerca grafica dell'icona (cioè
ottieni il dc
 dell'area di notificazione, e poi cerchi per una porzione di immagine
corrispondente)....
 ma sarebbe un lavoraccio !!! :)
Ciao !! Davide DG

  ma sarebbe un lavoraccio !!! :)
Mamma mia!
Penso proprio che la prima soluzione e' quella ottimale.
Cmq, grazie per le dritte!


 2. ottenuto l'handle come faccio a premere sul pulsantino "Connetti" ?
1) Guarda le funzioni FindWindow e FindWindowEx
    Tieni presente che il parametro importante č il nome della classe, che
raramente varia.
     (leggi bene l'help)
2) Ottenuto l'handle della finestra hai 2 sistemi per "premere" il pulsante
:
a) simuli una pressione del mouse sul pulsante / menu
  (funzioni utili : SetCursorPos, Mouse_Event, GetWindowPos)
b) Invii un messaggio ( PostMessage) del tipo wm_lbuttondblclk al bottone.
Dipende molto da come ti si presenta la finestra ... c'č un pulsante o un
menů ?
se c'č un pulsante puň essere forse preferibile la prima opzione... in caso
contrario
immagino (ma *non sono sicuro) che si renda necessaria la 2.
Ciao!! Davide DG

 2. ottenuto l'handle come faccio a premere sul pulsantino "Connetti" ?
FindWindow e FindWindowEx ti permetteranno di ottenere: la prima, l'handle
della finestra di nopay, la seconda l'handle del pulsante (sperando che sia
un windowed-control).
Una volta ottenuto quello puoi spedire un BM_CLICK oppure la coppia
WM_LBUTTONDOWN WM_LBUTTONUP con un delay in mezzo...


Mi sono dato un po' da fare, visto che interessa anche a me.
Penso di aver trovato una soluzione, anche se MOLTO poco elegante.
Ovviamente è molto migliorabile.
Purtroppo non ho potuto vedere cosa succede quando si connette, perchè ho
sempre trovato occupato
Sono graditissimi commenti,critiche e soprattutto suggerimenti
Aggiungete 1 TButton, 3 TTimer e 1 TListBox
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Timer1: TTimer;
    Timer2: TTimer;
    Timer3: TTimer;
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure Timer3Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  h:hwnd;
  wait:boolean=false;
  dialing:boolean=false;
implementation
{$R *.DFM}
function EnumWindowsCode(Wnd : hWnd;Form : TForm1) : Boolean; Export;
StdCall;
var
  Buffer : Array[0..99] of char;
begin
  GetWindowText(Wnd,Buffer,100);
  if StrLen(Buffer) <> 0 then
  if ((copy(strpas(buffer),1,5)='Conne')
     or(copy(strpas(buffer),1,5)='NoPay'))
      then
    Form1.listbox1.Items.Add(StrPas(Buffer));
  Result := True;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
     timer1.interval:=500;
     timer3.interval:=5000;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
     timer1.enabled:=false;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
     listbox1.items.clear;
     EnumWindows(@EnumWindowsCode,LongInt(Self ));
     if (listbox1.items.indexof('NoPay - Connessione')<0)
        then
        begin
             timer3.enabled:=true;
             timer2.enabled:=false;
        end;
end;
procedure TForm1.Timer3Timer(Sender: TObject);
begin
     timer3.enabled:=false;
     h:=findwindow(nil,pchar('Connessione a NoPay Connection'));
               if h=0
                  then
                      button1click(nil)
                  else
                      close;
     timer2.enabled:=true;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
   r:trect;
begin
     listbox1.items.clear;
     EnumWindows(@EnumWindowsCode,LongInt(Self ));
     h:=findwindow(nil,pchar('Connessione a NoPay'));
     showwindow(h,sw_show);
     getwindowrect(h,r);
     setcursorpos(r.left+150,r.top+220);
     timer1.enabled:=true;
     mouse_event(MOUSEEVENTF_leftDOWN,0,0,0,0);
     mouse_event(MOUSEEVENTF_leftUP,0,0,0,0);
     dialing:=true;
     timer2.enabled:=true;
end;
end.
--
Posted from 
mta14-acc.tin.it
 [212.216.176.45] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 WM_LBUTTONDOWN WM_LBUTTONUP con un delay in mezzo...
Grazie delle dritte!
Ho risolto proprio con FindWindow, FindWindowEx e BM_CLICK.
Inizialmente, per inviare il messaggio BM_CLICK al pulsantino usavo
SendMessage; in seguito ho visto che l'applicazione attendeva la fine della
procedura di connessione ed ho sostituito SendMessage con SendNotifyMessage.
Ora ho un altro problema: per controllare che l'autenticazione sia avvenuta
correttamente devo confrontare continuamente il valore di una stringa Static
con un testo (= "Accesso alla Rete...").
Questo confronto continuo si prende praticamente tutto il processore.
C'e' una soluzione al problema ?
Visto che la finestra della connessione viene distrutta ad ogni
collegamento, potrei controllare (quando la finestra non esiste piu')
direttamente da Accesso Remoto che la connessione sia andata a buon fine (ho
gia' il componente "ad hoc").
Che ne pensate ?
Grazie a tutti!


      EnumWindows(@EnumWindowsCode,LongInt(Self ));
Così a occhio direi non male... non l'ho provato perchè nella mia zona
No-Pay proprio non c'è :-( [almeno che io sappia, io sono Bergamo, distretto
0363].
Due piccole note se permetti:
- puoi evitare quella "export" sulla callback, importante è che sia
stdcall...
- carina l'idea di passarti il puntatore alla form come parametro ma peccato
che poi tu non l'abbia più usato...
e cmq direi che avresti poi comunque bisogno di un cast (che implica di
avere visibilità sulla dichiarazione della classe TForm1)... a quel punto
fai prima a fare come hai fatto tu : sfrutta il fatto che Form1 sia globale
ed evita pure di passare il riferimento...
Ciao :-)
--


 Che ne pensate ?
Sì, puoi aggiustarti con le RasAPI (c'è una funzione che ti ritorna lo stato
di una connessione...)
Direi che è preferibile questa seconda via alla prima...
Ciao :-)
