Private Declare Function SetForegroundWindow Lib "User32" _
(ByVal hWnd As Long) As Long
Private Declare Function IsIconic Lib "User32" _
(ByVal hWnd As Long) As Long
Private Declare Function ShowWindow Lib "User32" _
(ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
Const SW_NORMAL = 1 'Show window in normal size
Const SW_MINIMIZE = 2 'Show window minimized
Const SW_MAXIMIZE = 3 'Show window maximized
Const SW_SHOW = 9 'Show window without changing window size
Avrei bisogno di riattivare in modo maleducato l'mde
Private Sub Form_Timer()
SetForegroundWindow (Application.hWndAccessApp)
If IsIconic(Application.hWndAccessApp) Then
ShowWindow Application.hWndAccessApp, SW_SHOW
Else
ShowWindow Application.hWndAccessApp, SW_MAXIMIZE
ShowWindow Application.hWndAccessApp, SW_NORMAL
End If
End Sub
C'� solo un problema funziona solo parzialmente.
PS C'era da immaginarselo che avrei fatto un post dolo la vicenda
dell'updater agent ;-)
Mi manca solo il passaggio della sostituzione dell'mde
Grazie come sempre.
Daniele
> Avrei bisogno di riattivare in modo maleducato l'mde
> Private Sub Form_Timer()
> SetForegroundWindow (Application.hWndAccessApp)
> If IsIconic(Application.hWndAccessApp) Then
> ShowWindow Application.hWndAccessApp, SW_SHOW
> Else
> ShowWindow Application.hWndAccessApp, SW_MAXIMIZE
> ShowWindow Application.hWndAccessApp, SW_NORMAL
> End If
> End Sub
> C'� solo un problema funziona solo parzialmente.
> PS C'era da immaginarselo che avrei fatto un post dolo la vicenda
> dell'updater agent ;-)
e cosa centra questo con l'updater?
fammi capire, e vediamo se quello che hai scritto magari lo facciamo
meglio in un altro modo...
> Mi manca solo il passaggio della sostituzione dell'mde
appunto... non capisco.
--
Ciao
Pablitomf
----------------------------
http://www.accessgroup.it/
----------------------------
Non mi fido molto delle statistiche, perch� un uomo con la testa nel forno
acceso e i piedi nel congelatore statisticamente ha una temperatura media.
questo articolo e` stato inviato via web dal servizio gratuito
http://www.newsland.it/news segnala gli abusi ad ab...@newsland.it
Ma quante API che usi... hai provato banalmente:
ShowWindow Application.hWndAccessApp, SW_MAXIMIZE
Ora però non capisco una cosa... da dove vorresti fare questo coso...?
Se lo vuoi fare dall'Updater(che è esterno) allora devi andare a
leggere l'hWnd dell'istanza di Access e puoi farlo in 2 modi:
1) Usando l'API FindWIndow e passando come ClassName "MDIClient" e
come Nome applicativo la CAPTION del file MDE...
2) Aprendo via Automazione un oggetto Database e leggendogli la
proprietà hWndAccessApp....
Sinceramente mi sembra un PatchWork questo "coso".... non saprei come
altro chiamarlo....
;-)
@Alex
> ShowWindow Application.hWndAccessApp, SW_MAXIMIZE
> Ora per� non capisco una cosa... da dove vorresti fare questo coso...?
> Se lo vuoi fare dall'Updater(che � esterno) allora devi andare a
> leggere l'hWnd dell'istanza di Access e puoi farlo in 2 modi:
> 1) Usando l'API FindWIndow e passando come ClassName "MDIClient" e
> come Nome applicativo la CAPTION del file MDE...
> 2) Aprendo via Automazione un oggetto Database e leggendogli la
> propriet� hWndAccessApp....
ma non ha mica senso fare tutto ci�...
se ha seguito quel che gli ho suggerito, ha 2 prodotti totalmente
diversi... uno UPLOADA file da remoto... l'altro li APPLICA... per cui,
basta che alla fine dell'UPLOAD, il primo si chiuda, e si apra l'altro
(che alla fine si chiuder� riaprendo il primo)... tutto qu�.
> Sinceramente mi sembra un PatchWork questo "coso".... non saprei come
> altro chiamarlo....
Bastardissimo :D
> @Alex
Si infatti concordo con te... ma non volendo intromettermi in quello
che passa per la testa di OneEDP... ho dato una risposta INSETTICA...
;-)
> > Sinceramente mi sembra un PatchWork questo "coso".... non saprei come
> > altro chiamarlo....
>
> Bastardissimo :D
Embè... come altro potremmo definirlo...?
Alla fine però OneEDP deve farcelo vedere in funzione sono
estremamente curioso....!!
Io mi chiederei...:
"Sono stato io a fare questo...?"
> --
> Ciao
> Pablitomf
P.S. per OneEDP... spero tu non sia permaloso, ma ultimamente non
programmando più mi sfogo così... e chiaramente scherzo...!!!
@Alex
Dopo controllo versione e successivo download, si "invita" l'utente a
chiudere il PRG2 in modo che PRG1 possa effettuare la sostituzione
Ricordo che PablitoMF ha usato la convenzione PRG1 � chi effettua gli
scambi, PRG2 � il gestionale + dowloader.
Come sai bene molti utenti hanno l'abitudine o di chiudere tutto o di
acconsentire a tutto ci� che gli appare per cui l'invito alla chiusura
potrebbe essere ignorato piuttosto che essere procastinato.
Nel caso l'utente non � nelle condizioni di effettuare lo scambio dopo
risposta negativa su timer gli riproporrei la stessa domanda fino alla
persecuzione (se si tratta di aggiornamenti definiti critici).
Per essere persuasivo pensavo di riattivare il gestionale restituendogli il
focus da qualsiasi applicazione (anche non acccess ovviamente) e
poproponendogli la stessa richiesta.
Nel migliore dei modi Quit chiuder� correttamente l'applicazione mentre un
attimo prima una shell inviier� un comando del genere
shell SysCmd(acSysCmdAccessDir) & "msaccess.exe " & PRG1, focus normale
1) Ci si assicura che PRG2 � chiuso in uno di questi modi
- check .ldb
- intercettazione errore file locked su ren
- riutilizzare GetWindowThreadProcessId (GetPID di Alex) di PRG2 ma penso
sia pericoloso perch� l'ID potrebbe non essere pi� valido o riciclato da
qualcuno. Forse sarebbe meglio aspettare l'apertura di PRG1 e verificare se
il PID di PRG2 � attivo magari con interroganto l'exit code
WaitForSingleObject il cui hprocess viene invocato da OpenProcess...
Probabilmente mi sto complicando la vita... e magari il PID � univoco...
- altro scusate l'ignoranza
2) si effettua lo scambio FINALMENTE e si avvia PRG2
Ti ringrazio
Daniele
Ma quante API che usi... hai provato banalmente:
ShowWindow Application.hWndAccessApp, SW_MAXIMIZE
Dove finisco i ">" ??
---- Se non imposto il background non funge neanche parzialmente
Ora per� non capisco una cosa... da dove vorresti fare questo coso...?
Se lo vuoi fare dall'Updater(che � esterno) allora devi andare a
leggere l'hWnd dell'istanza di Access e puoi farlo in 2 modi:
1) Usando l'API FindWIndow e passando come ClassName "MDIClient" e
come Nome applicativo la CAPTION del file MDE...
2) Aprendo via Automazione un oggetto Database e leggendogli la
propriet� hWndAccessApp....
Sinceramente mi sembra un PatchWork questo "coso".... non saprei come
altro chiamarlo....
;-)
@Alex
Ore 13:36 ho spiegato il coso...
La Caption mi lascia perplesso..
La soluzione 2 potrebbe essere una soluzione all'interrogazione: ma il coso
si � chiuso o l'utente sta prendendo un caff�. Non che io non ne prenda.
Grazie
>Si infatti concordo con te... ma non volendo intromettermi in quello
>che passa per la testa di OneEDP... ho dato una risposta INSETTICA...
>;-)
> > Sinceramente mi sembra un PatchWork questo "coso".... non saprei come
> > altro chiamarlo....
>
> Bastardissimo :D
Emb�... come altro potremmo definirlo...?
Alla fine per� OneEDP deve farcelo vedere in funzione sono
estremamente curioso....!!
Io mi chiederei...:
"Sono stato io a fare questo...?"
Siete cattivi! #-()
> --
> Ciao
> Pablitomf
P.S. per OneEDP... spero tu non sia permaloso, ma ultimamente non
programmando pi� mi sfogo cos�... e chiaramente scherzo...!!!
@Alex
Cari PablitoMF e @Alex se non scherziamo fra di noi...
Il 90% della programmazione se ne va in debug e quindi dopo anni dovete
perdonarmi se partorisco qualche coso.
Per quanto riguarda il coso da farvi vedere in funzione potrei dare anchio
una risposta insettica.
L'applicatore una volta aperto deve sapere se il dowloader � chiuso e
siccome � l'utente a decidere... o kill o lo costringi con le buone.
Effettivamente pu� sembrare strano.
Mentre la metodologia di PablitoMF applica gli aggiornamenti con calma solo
prima dell'avvio del gestionale il mio approccio � diverso.
Applicare gli aggiornamenti non appena sono disponibili e mettere nel panico
il client se sono critici.
E' simile al trituramaroni di WindosUpdate che "invita" continuamente a
riavviare il computer per applicare gli aggiornamenti (per completare). Come
dire intanto puoi lavorare ma se riavvii � meglio ma se riavvii � meglio ma
se riavvii � meglio ma se riavvii � meglio ma se riavvii � meglio ma se
riavvii � meglio....
Aspetto vostre.
E grazie
Dniele
Forse non hai capito bene come si usa l'API FindWindow... leggi bene
le istruzioni.
> La soluzione 2 potrebbe essere una soluzione all'interrogazione: ma il coso
> si è chiuso o l'utente sta prendendo un caffè. Non che io non ne prenda.
> Grazie-
Chissà mai che succede...
@Alex
Azz parli di me in terza persona... che figo... mi sento il divino OTELMA!
:D
> ha usato la convenzione PRG1 � chi effettua gli
> scambi, PRG2 � il gestionale + dowloader.
> Come sai bene molti utenti hanno l'abitudine o di chiudere tutto o di
> acconsentire a tutto ci� che gli appare per cui l'invito alla chiusura
> potrebbe essere ignorato piuttosto che essere procastinato.
> Nel caso l'utente non � nelle condizioni di effettuare lo scambio dopo
> risposta negativa su timer gli riproporrei la stessa domanda fino alla
> persecuzione (se si tratta di aggiornamenti definiti critici).
> Per essere persuasivo pensavo di riattivare il gestionale restituendogli il
> focus da qualsiasi applicazione (anche non acccess ovviamente) e
> poproponendogli la stessa richiesta.
> Nel migliore dei modi Quit chiuder� correttamente l'applicazione mentre un
> attimo prima una shell inviier� un comando del genere
> shell SysCmd(acSysCmdAccessDir) & "msaccess.exe " & PRG1, focus normale
> 1) Ci si assicura che PRG2 � chiuso in uno di questi modi
> - check .ldb
> - intercettazione errore file locked su ren
> - riutilizzare GetWindowThreadProcessId (GetPID di Alex) di PRG2 ma penso
> sia pericoloso perch� l'ID potrebbe non essere pi� valido o riciclato da
> qualcuno. Forse sarebbe meglio aspettare l'apertura di PRG1 e verificare se
> il PID di PRG2 � attivo magari con interroganto l'exit code
> WaitForSingleObject il cui hprocess viene invocato da OpenProcess...
> Probabilmente mi sto complicando la vita... e magari il PID � univoco...
> - altro scusate l'ignoranza
vabb� ma puoi usare un msgbox per questa info all'utente... un msgbox che
di per se prende il focus da solo... e da ripetere se nel ciclare il timer
il codice trova che nella cartella Attiva c'� un file exe di numero
maggiore...
finch� lo trova, vuol dire che ci sono aggiornamenti da fare... altrimenti
"scassa le palle" all'utente con il messaggino "CHIUDI TUTTO E RIAVVIA"...
> 2) si effettua lo scambio FINALMENTE e si avvia PRG2
--
Scusa, non vorrei metterti + confusione di quanta tu non ne abbia gi� :D
Ripeto il concetto :
Cartella "ATTIVA"
Cartella "UPLOAD"
sul timer, controllo se nella cartella UPLOAD ci sono files con numero
superiore all'unico esistente nella cartella ATTIVA...
nel caso ci sono, vuol dire che ci sono aggiornamenti da fare, per cui,
fai apparire il messaggio all'utente "GUARDA BELLO CHE TI DEVI MUOVERE A
CHIUDERE E A RIAVVIARE - MICA HO FATTO TUTTO STO CASINO PER NIENTE????"...
l'utente preme OK.
Se l'utente, pur avendo cliccato su OK di fatto non lo chiude, lo puoi
sapere ripetendo il ciclo sul timer... un ciclo che dir� : nella cartella
UPLOAD ci sono files superiori all'unico esistente in ATTIVA??? Bene, mi
ha fregato, allora gli rimando il messaggino, magari mi ascolter�
stavolta... e cos� via...
nel caso contrario, non ci saranno problemi perch� gli aggiornamenti
saranno stati o gi� fatti o non ce ne sar� stato bisogno perch� non ne
saranno stati scaricati.
chiaro?
Le popup prendono fuoco da sole... ma all'interno di MDIClient meglio
denominata "OMain"
Ma non c'� verso mentre sono in Word in qualasiasi altra applicazione non
mde di far riaccendere mde?!
Forse non hai capito bene come si usa l'API FindWindow... leggi bene
le istruzioni.
> La soluzione 2 potrebbe essere una soluzione all'interrogazione: ma il
> coso
> si � chiuso o l'utente sta prendendo un caff�. Non che io non ne prenda.
> Grazie-
Chiss� mai che succede...
@Alex
La classe � "OMain" e FindWindows restituisce ovviamente lo stesso Handle di
Application.Hwndfasdfaf, ma in ogni caso
SetActiveWindow hWnd
ShowWindow hWnd, 9
non riescono a fare nulla!
Possibile che una cosa cos� banale sia cos� complicato.
Voglio soltanto ridare il controllo ad Access quando non sono in Access...
Ciao
Daniele
Ahhh ecco il tuo cruccio!!!!
bh� qu� un bel vbs temporizzato potrebbe davvero fare al caso tuo
allora... senza "inchiavicare" di codice anomalo il tuo software...
tanto � un vbs che non ha influenza sul DB... controlla solo files in
cartelle ed emette a condizioni particolari un semplice msgbox...
ma un vbs robetta deve essere... niente di trascendentale.
Si hai ragione le classi di Access sono queste:
"access": strClassName = "OMain"
"MDIClient": strClassName = "MDIClient"
"FinestraDB": strClassName = "ODb"
"Form": strClassName = "OForm"
"ListBox": strClassName = "OGrid"
"BarreMenù/Str.": strClassName = "MsoCommandBar"
> e FindWindows restituisce ovviamente lo stesso Handle di Application.Hwndfasdfaf,
Si infatti se lo ricavi dall'interno è come dici... io dubitavo di
questo... e per ricavare l'Handle di un'applicazione esterna... quando
hai PIU' di un ACCESS aperto non puoi usare solo il ClassName in
quanto ti restituisce la prima istanza... quindi si usa
l'ApplicationName che è appunto la CAPTION...!!!!!!!!!!!!!
LEGGERE BENE....!!! ;-)
> ma in ogni caso
> SetActiveWindow hWnd
> ShowWindow hWnd, 9
> non riescono a fare nulla!
> Possibile che una cosa così banale sia così complicato.
> Voglio soltanto ridare il controllo ad Access quando non sono in Access...
> Ciao
Mi sembra molto strano non funzioni... ma ci deve essere qualche
inghippo che sfugge... al quale peraltro non sò come dare
suggerimenti.... :-/
> Daniele
@Alex
Se ti sentisse Alex!
> "Pablitomf" <pabl...@hotmail.it> ha scritto nel messaggio
> news:h2iftl$oqb$1...@news.newsland.it...
> >> Le popup prendono fuoco da sole... ma all'interno di MDIClient meglio
> >> denominata "OMain"
> >> Ma non c'� verso mentre sono in Word in qualasiasi altra applicazione non
> >> mde di far riaccendere mde?!
> >
> > Ahhh ecco il tuo cruccio!!!!
> > bh� qu� un bel vbs temporizzato potrebbe davvero fare al caso tuo
> > allora... senza "inchiavicare" di codice anomalo il tuo software...
> > tanto � un vbs che non ha influenza sul DB... controlla solo files in
> > cartelle ed emette a condizioni particolari un semplice msgbox...
> >
> > ma un vbs robetta deve essere... niente di trascendentale.
> Se ti sentisse Alex!
Ma Ale mica pensava che volevi emulare Windows con Access? :D
Scusami se mi permetto, ma secondo me la stai facendo tu complessa... ma a
che cavolo ti serve rompere le balle all'utente di
"riavvia","riavvia","riavvia","riavvia","riavvia","riavvia"... basta che
lo riavvi lui quando gli pare e quel che era lo scopo dell'UPLOAD si
verificher�.
> OneEDP ha scritto:
> > "Pablitomf" <pabl...@hotmail.it> ha scritto nel messaggio
> > news:h2iftl$oqb$1...@news.newsland.it...
> > >> Le popup prendono fuoco da sole... ma all'interno di MDIClient meglio
> > >> denominata "OMain"
> > >> Ma non c'� verso mentre sono in Word in qualasiasi altra applicazione
non
> > >> mde di far riaccendere mde?!
> > >
> > > Ahhh ecco il tuo cruccio!!!!
> > > bh� qu� un bel vbs temporizzato potrebbe davvero fare al caso tuo
> > > allora... senza "inchiavicare" di codice anomalo il tuo software...
> > > tanto � un vbs che non ha influenza sul DB... controlla solo files in
> > > cartelle ed emette a condizioni particolari un semplice msgbox...
> > >
> > > ma un vbs robetta deve essere... niente di trascendentale.
> > Se ti sentisse Alex!
> Ma Ale mica pensava che volevi emulare Windows con Access? :D
> Scusami se mi permetto, ma secondo me la stai facendo tu complessa... ma a
> che cavolo ti serve rompere le balle all'utente di
> "riavvia","riavvia","riavvia","riavvia","riavvia","riavvia"... basta che
> lo riavvi lui quando gli pare e quel che era lo scopo dell'UPLOAD si
> verificher�.
E poi tu nel tuo VBS originale volevi controllare se il db era aperto, se
faceva questo, se faceva quell'altro... volevi da vbs killare, uccidere,
seppellire... con quello che ti dico io, controlli solo files UPLOADATI in
cartella... niente DB... niente di niente...
CARTELLA ATTIVA contiene : 001.exe
CARTELLA UPLOAD contiene : 002.exe e 003.exe
il tuo VBS cicla "ATTIVA" recupere in VAR1 "001"... poi cicla "UPLOAD" e
recupera in CONT il num di files che nomi in VAR2() "002|003"
confronti VAR1 con VAR2(1) e se lo trova maggiore
msgbox "RAGAZZZZZZZOOOOOOOOOO RIAVVIAMI - ci sono " & CONT & "
aggiornamenti da fare"
:D
Si hai ragione le classi di Access sono queste:
"access": strClassName = "OMain"
"MDIClient": strClassName = "MDIClient"
"FinestraDB": strClassName = "ODb"
"Form": strClassName = "OForm"
"ListBox": strClassName = "OGrid"
"BarreMen�/Str.": strClassName = "MsoCommandBar"
> e FindWindows restituisce ovviamente lo stesso Handle di
> Application.Hwndfasdfaf,
Si infatti se lo ricavi dall'interno � come dici... io dubitavo di
questo... e per ricavare l'Handle di un'applicazione esterna... quando
hai PIU' di un ACCESS aperto non puoi usare solo il ClassName in
quanto ti restituisce la prima istanza... quindi si usa
l'ApplicationName che � appunto la CAPTION...!!!!!!!!!!!!!
LEGGERE BENE....!!! ;-)
> ma in ogni caso
> SetActiveWindow hWnd
> ShowWindow hWnd, 9
> non riescono a fare nulla!
> Possibile che una cosa cos� banale sia cos� complicato.
> Voglio soltanto ridare il controllo ad Access quando non sono in Access...
> Ciao
Mi sembra molto strano non funzioni... ma ci deve essere qualche
inghippo che sfugge... al quale peraltro non s� come dare
suggerimenti.... :-/
> Daniele
@Alex
Vada per la Caption!
E' l'unica maniera pi� semplice che .mde per ricavare l'handle di un'altra
applicazione (o di un altro mde).
Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" _
(ByVal lpclassname As String, ByVal lpWindowName As String) As Long
Private Declare Function SetForegroundWindow Lib "User32" _
(ByVal hWnd As Long) As Long
Private Declare Function SetActiveWindow Lib "User32" _
(ByVal hWnd As Long) As Long
Private Declare Function ShowWindow Lib "User32" _
(ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
Const SW_SHOW = 9
Const SW_MAXIMIZE = 3
Private Sub Form_Timer()
Dim hwnd as long
hwnd = FindWindow("OMain", "NonCiSonoPerNessuno")
'oppure hwnd = Application.hWndAccessApp nel caso ricorsivo
SetForegroundWindow hwnd
SetActiveWindow hwnd
ShowWindow hwnd , SW_MAXIMIZE
SendKeys ""
End Sub
Sendkey simula la pressione di un tasto e non "dovrebbe" fare danni.
Infatti in questo momento lo sto provando con intervalli brevi e me li ha
gi� triturate.
Il passo successivo � creare una funzione generica:
RidammiIlFuocoCheAvevoPersoDentroMe
a quest'ora concedetemelo.
Ciao e grazie!!
Daniele
Sendkey non funge e non bisgnorebbe inviare nessun altro carattere.
Allora ho pensato a simulare un click con il mouse...
Allora ho provato con le due API
SetCursorPos (x,y)
mouse_event(MOUSE_EVENT_F_LEFT_DOWN, x, y, 0, 0)
mouse_event(MOUSE_EVENT_F_LEFT_UP, x, y, 0, 0)
cos� dichiarate
Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As
Long) As Long
Declare Function mouse_event Lib "user32.dll" (ByVal dwflags As Integer,
ByVal dx As Integer, ByVal dy As Integer, ByVal dwData As Integer, ByVal
dwExtraInfo As Integer) As Integer
Private Const MOUSE_EVENT_F_LEFT_DOWN = 2
Private Const MOUSE_EVENT_F_LEFT_UP = 4
Private Const MOUSE_EVENT_F_RIGHT_DOWN = 8
Private Const MOUSE_EVENT_F_RIGHT_UP = 16
Ponendo molta attenzione su quale punto cliccare sullo schermo.
Una volta che XP sa quale � la finestra attiva bisogna cliccarci sopra per
farla visualizzare in punto dove non si fa danni. Altrimenti non verr� mai
visualizzata se sto scrivendo ad esempio una lettera in word....
Spero possa essere utile.
Un saluto
Daniele