|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Versilia
Messaggi: 569
|
[Win32] Interagire con altri programmi
Salve a tutti.
Eccomi con un nuovo quesito e con la certezza che saprete indicarmi la strada giusta! Devo realizzare un'applicazione che mi vada a cliccare sul pulsante "Avanti" di un altra applicazione. In altre parole... C'è un setup che sta installando un programma. La mia applicazione, nel momento in cui il setup si blocca spettando che si clicchi su "Avanti", deve cliccare sul pulsante autonomamente per evitare che ci debba essere una persona presente a cliccare fisicamente sul tasto "Avanti"! Secondo voi devo seguire la strada di ricavare l' Handler del pulsante e pio inviargli un click o è più conveniente memorizzare la posizione del pulsante, portare il mouse lì e inviare un click? Altri suggerimenti? Grazie! |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Direi che ti conviene fare un FindWindow, cercare la finestra ed a quel punto calcolarti la posizione del pulsante rispetto all'angolo in basso a destra della finestra ed eseguire lì il click.
Così è quasi infallibile |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Versilia
Messaggi: 569
|
Penso anch'io... ma intendi calcolare tramite programma chiedendo a win la posizione del pulsante rispetto al form in cui è contenuto... o guardare la posizione a occhio e poi inserirla nel programma?
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Anche guardarla ad occhio...certo chiederla a Windows sarebbe meglio, ma dovrebbe funzionare comunque.
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Se il tasto avanti e' selezionato potrebbe bastare inviare un return
__________________
|Java Base| |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Versilia
Messaggi: 569
|
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
E mandare dei tab finche' il pulsante non viene selezionato?
__________________
|Java Base| |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Versilia
Messaggi: 569
|
Aggiornamento:
Ho trovato la finestra. ho trovato le coordinate del pulsante, mi ci sono spostaso sopra col puntatore tramite SetCursorPos... ma NON RIESCO E DIRE AL MOUSE DI CLICCARE!!!!! Come diavolo si fa???? |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
http://msdn2.microsoft.com/en-us/library/ms646260.aspx
Devi dare due mouse_event...uno con la pressione ed uno con il rilascio. |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Versilia
Messaggi: 569
|
Quote:
Thanx! Programma finito... |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Versilia
Messaggi: 569
|
HELP!
Il programma funziona benissimo ma volevo ottimizzarlo meglio. In particolare riesco a spostarmi alle coordinate del pulsante e simulare un click... qauindi la cosa funziona. Il problema è che però, così facendo, non controllo in nessun modo se l'azione ha avuto successo... e in verità manco so se quando il programma ha cliccato il pulsante era lì veramente! Quindi prima di far partire il tutto volevo fare una EnumWindow, trovare la finestra con la Caption del pulsante per verificare che possa avviare la procedura di "click". Il problema è che la EnumWindow mi scandisce solo le finestre "principali" e non mi vede la classe Button.... Come posso scandire tutte le finestre e sottofinestre? O in alternativa, come posso, trovata la finestra giusta, scandire tutte le sue sottofinestre? Grazie! |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Versilia
Messaggi: 569
|
C'è qualcosa che mi sfugge.... il codice è questo:
Codice:
#define STRICT
#include <vcl.h>
#pragma hdrstop
#include <FileCtrl.hpp>
#include <dir.h>
#include <stdio.h>
#include <windows.h>
#include <winuser.h>
#include <string.h>
#include <shellapi.h>
#include <iostream>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//Funzione per troare il pulsante una volta trovato il Form
int __stdcall CALLBACK TrovaPulsante(HWND hWnd2, LPARAM lParam2)
{
char buffer2[15];
char risp;
risp=GetWindowText(hWnd2,buffer2,15);
//controllo che sia il pulsante "Chiudi"
if((buffer2[0]=='C')|| //ci sono degli OR perchè se metto degli AND
(buffer2[1]=='h')|| //inspiegabilmente non funziona!!!!!?????
(buffer2[2]=='i')||
(buffer2[3]=='u')||
(buffer2[4]=='d')||
(buffer2[5]=='i'))
{
ShowMessage("TROVATO!!!!!!");
}
}
//funzione per trovare il Form che contiene il pulsante
int __stdcall CALLBACK TrovaFinestra(HWND hWnd, LPARAM lParam)
{
char buffer[10];
char risp;
risp=GetClassName(hWnd,buffer,10);
//Controllo che sia il form "TForm1"
if((buffer[0]=='T')&&
(buffer[1]=='F')&&
(buffer[2]=='o')&&
(buffer[3]=='r')&&
(buffer[4]=='m')&&
(buffer[5]=='1'))
{
//E' il Form che cerco quaindi procedo nella ricerca del pulsante
EnumChildWindows(hWnd,TrovaPulsante,0L);
}
}
Lancio tutto tramite EnumWindows(TrovaFinestra,0L); Mi fa delle cose stranissime: 1. Il fatto degli AND e OR come da commento 2. Il buffer2 se messo a 10 o 20 o 100 da risultato completamente diversi!!!! 3. Così come è il programma ora mi dice "TROVATO!!!!!!!" undici volte.... Qualcuno vede dove sbaglio? Ultima modifica di TonyManero : 07-12-2007 alle 08:14. |
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Versilia
Messaggi: 569
|
Quote:
Perchè nella fretta (cosa che mi accompagna purtroppo SEMPRE) ho messo il primo metodo funzionante... terrò presente il tuo consiglio! |
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Jul 2001
Città: Roma Caput Mundi Moto: Ducati SS 750 i.e. Squadra: A.S. Roma 1927 Macchina: 147 M-Jet 140 equini
Messaggi: 698
|
Quote:
__________________
...la voglia di guardarti e dirti sulle labbra...quanto ti ho aspettata...è il senso della vita... ...quando tutto questo sarà io ci sarò...anche se tutto questo mai sarà ci sarò... <about me> <my photo gallery> |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Versilia
Messaggi: 569
|
Penso che programmare sotto Win32 sia la cosa più frustrante del mondo!
Premesso questo... dalle prove fatte su inserisco un "ritardo" nel punto in cui ho scritto " //controllo che sia il pulsante "Chiudi"" funziona tutto! Può essere un problema di tempi???? E' come se senza un ritardo non faccia in tempo a caricare la variabile buffer2.... |
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Versilia
Messaggi: 569
|
Quote:
Usando per creare un ritardo una ShowMessage("pippo") la cosa funziona... se come ritardo ci metto una Sleep(500) NO!!!! Qualcuno ci capisce qualcosa??????
|
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: May 2006
Messaggi: 4389
|
io non ci capisco niente di programmazione, però queste cose le faccio con autoit-v3. ti crei un bel file exe con il programma e poi dici alla tua applicazione di far partire l'exe. Non è proprio così semplice ovviamente, però con 4 o 5 righe di codice te la cavi
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Versilia
Messaggi: 569
|
Quote:
Effettivamente fa tutto quello di cui avevi bisogno! Mi rimane però la curiosità su cosa sbaglio nel mio programma... |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:11.












|








