Newsgroup: it.comp.appl.access
Titolo: SetFocus su applicazione funziona parzialmente

Ho le seguenti
   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 

 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

 Daniele
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

 @Alex


 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


 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

 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

 Grazie-
Chissà mai che succede...
@Alex

 2) si effettua lo scambio FINALMENTE e si avvia PRG2
-- 


 "scassa le palle" all'utente con il messaggino "CHIUDI TUTTO E RIAVVIA"...
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?


 ha scritto nel messaggio 
news:h2ia3t$155$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?!


 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 

 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.


 Daniele
@Alex

 ma un vbs robetta deve essere... niente di trascendentale.
Se ti sentisse Alex!


 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�.


 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


 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). 

"OneEDP" <OneEDP@antispam> ha scritto nel messaggio 
news:4a4c84e6$0$1113$4faf...@reader3.news.tin.it...

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 

"OneEDP" <OneEDP@antispam> ha scritto nel messaggio 
news:4a4ccaf2$0$1110$4faf...@reader4.news.tin.it...

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