Newsgroup: it.comp.os.win.xp
Titolo: Sequenza comandi ZP Home ...

Mi chiedevo:
ho un programma che mi si avvia tranquillamente dalla relativa icona e
quando lo chiudo mi propone una finestra con tasto ok per chiuderla.
Esiste una procedura automatizzata per evitarmi tutte le volte di andare a
cliccare sul pulsante OK che mi compare quando chiudo il mio programma ?
Ciao grazie
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 
che programma? In genere esiste qualcosa tra le opzioni come "conferma
chiusura programma" che puoi disabilitare
-- 
Gordon Freeman, Linux User #332250 on attila, Linux Machine #305615.
http://www.counter.li.org/
http://www.slackware.com/getslack/
 

 cliccare sul pulsante OK che mi compare quando chiudo il mio programma ?
si .. ma devi smanettare e creartela su misura .. l'ideale sarebbe
il Visual Basic  :
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal
wParam As Long, ByVal lParam As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As
String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal
wParam As Long, lParam As Any) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long,
ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Sub Form_Load()
            Handle = FindWindow("#32770", "Babylon")
               AppActivate "Babylon"
               'SendKeys "~"
               'BM_CLICK &HF5 = Buttom mouse click???
        Handle = FindWindowEx(Handle, 0, "Button", "&Sě")
   Send = PostMessage(Handle, &HF5, 0, NullString)
     End Sub
Ma per un approccio immediato e con 2 riche di codice in plain text meglio usare :
http://www.hiddensoft.com/autoit3/
--
Fosco

"neb"
Se mi dici ESATTAMENTE cosa vuoi fare ti "aggiusto"  quello che adopero io
in Visual basic sulla falsariga di questo sotto e te lo uploado da qualche parte
altrimenti trovati qualcuno con VB che lo faccia e lo compili :
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal _
 lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal _
 hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal _
 hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal _
 nCmdShow As Long) As Long
Const SW_SHOWNORMAL = 1
Const WM_CLOSE = &H10
Const gcClassnamePACT = "PactJumpToRegKey"
Const gcClassnameBabylon = "Babylon"
Const gcClassnameMSIExplorer = "IEFrame"
Const gcClassnameMSVBasic = "wndclass_desked_gsk"
Const gcClassnameNotePad = "Notepad"
Const gcClassnameClipomatic = "Clipomatic"
Const gcClassnameMyVBApp = "ThunderForm"
Private Sub Form_Load()
    Dim WinWnd As Long, Ret As String, RetVal As Long, lpClassName As String
    WinWnd = FindWindow("Babylon", vbNullString)
    lpClassName = Space(256)
    RetVal = GetClassName(WinWnd, lpClassName, 256)
    PostMessage WinWnd, WM_CLOSE, 0&, 0&
      WinWnd = FindWindow("PactJumpToRegKey", vbNullString)
    lpClassName = Space(256)
    RetVal = GetClassName(WinWnd, lpClassName, 256)
    PostMessage WinWnd, WM_CLOSE, 0&, 0&
     WinWnd = FindWindow("Clipomatic Server", vbNullString)
    lpClassName = Space(256)
    RetVal = GetClassName(WinWnd, lpClassName, 256)
    PostMessage WinWnd, WM_CLOSE, 0&, 0&
   ' Shell "C:\PROGRA~1\GETRIGHT\GETRIGHT.EXE /CLOSE"
    Unload Me
End Sub
PS:
come vedi da sopra alcuni programmi p.e. GetRight si possono
chiudere direttamente anche da riga di comando
--
Fosco

 in Visual basic sulla falsariga di questo sotto e te lo uploado da qualche
parte
Ciao, scusami per il ritardo, ma ero fuori ufficio, il mio sicorso č
semplice (penso...), ho installato Autocad 14 (cad che uso per piccoli
disegni 2D originale e con licenza) su un nuovo PC con win XP home, il
programma funziona perfettamente, č velocissimo, ma qundo lo chiudo mi
esce una finestra di errore con scritto: "l'istruzione a 0x008b3b9c ha
fatto riferimento a 0x04183dc la memoria deve essere ready" clicco sul
tasto OK e la finestra si chiude. Ecco, io vorrei automatizzare
quest'ultima manovra. Ciao


 quest'ultima manovra.
http://www.google.it/search?hl=it&q=Autocad+14%2Bclose&meta=
prova a guardare nelle varie impostazioni del programma se c'e' qualcosa
che lo fa' chiudere da riga  di comando magari cosi non salta su l'errore
Oppure devi far partire il ptogramma e fare restare attivo qualcosa
che si accorga quando viene chiuso e clicchi su OK
Per le limitate possibilita che si ha nell'interagire qui ti faccio una cosa
terra terra che potrai provare direttamnete tu
ti faccio prima un esempio pratico lancia questo sotto e prova a chiudere
la calcolatrice
Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("calc")
Do While oExec.Status = 0
     WScript.Sleep 100
Loop
WScript.Echo "stato" & oExec.Status &"     "  &"programma chiuso"
'Copia incolla su notepad e salva con estensione .vbs
'tutti i file (*.*)  poi ci clicchi sopra. (per esempio Test.vbs)
'se ti da' errore disattiva l'antivirus
'ecco l'esempio concreto sfruttando il sopra :
Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("FULLPATH\all tuoAUTOCAD.EXE")
Do While oExec.Status = 0
     WScript.Sleep 100
Loop
' lo script restera in attesa finche autocad verra' chiuso
' a seconda di quanto ci mette ad apparire l'errore col bottone OK
' bisogna aumentere lo WScript.Sleep 2000 ' in millisecondi
WScript.Sleep 2000
oShell.SendKeys"{ENTER}"
' lo script aspettera 2 secondi e mandera' un INVIO da tastiera
' lo script e perfettibile ma se cosi va va bene lo stesso
--
Fosco

 > "neb"
hai provato a farlo andare in modalita' compatibile come ti hanno
gia' suggerito ?
http://www.google.it/search?hl=it&q=winxp%2Bmodalita%27+compatibile&meta=
--
Fosco

"neb"
http://www.google.it/search?hl=it&q=Autocad+14%2Bwindows+xp&meta=
--
Fosco

 Fosco
Ciao, grazie per l'attenzione prestatami, ho fatto il test calcolatrice ed
ha funzionato, poi ho scritto:
Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("C:\Programmi\AutoCAD R14\acad.exe")
Do While oExec.Status = 0
WScript.Sleep 2000
Shell.SendKeys"{ENTER}"
Loop
il programma si apre ma appare la casella di errore:
Errore: Necessario oggetto shell
Codice: 800A01A8


.. e poi c'e' un'altra cosa che non capisco, su win 98 se (che č il S.O.
che utilizzavo prima) per far si che quadro lancio il programma, al
comando apri mi vada in una cartella specifica, bastava cliccare col tasto
destro sull'icona ed in collegamento "Da: indicavo il percorso", con XP
non funziona!


 Errore: Necessario oggetto shell
'Hai fatto il set >> Set WshShell ="" e lo richiami con Shell.SendKeys""
'invece del corretto  >>>  WshShell.SendKeys""  :
Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("C:\Programmi\AutoCAD R14\acad.exe")
'''Set oExec = WshShell.Exec("C:\windows\notepad.exe")
Do While oExec.Status = 0
WScript.Sleep 2000
Loop
''''Msgbox oExec.Status
WshShell.SendKeys"{ENTER}"
' e poi hai messo nel posto sbagliato il loop vedi sopra
--
Fosco

 non funziona!
'esempio generico sempre in VBS :
Set oShell = CreateObject("Wscript.Shell")
Msgbox oShell.CurrentDirectory
oShell.CurrentDirectory = "c:\programmi"
Msgbox oShell.CurrentDirectory
oShell.run"c:\windows\notepad.exe test.txt"
' allora come vedi ci sono 3 possibilita per windows
' cerca il file o nella cartella dello script stesso o in c:\windows
' se tu con oShell.CurrentDirectory "" gli dai la cartella di lavoro che
'desideri  e metti in c:\programmi il test.txt vedi che lo apre senza
'problemi
'Puoi sfruttare questa peculiarita anche col autocad
--
Fosco

 ' e poi hai messo nel posto sbagliato il loop vedi sopra
No, non funziona, la finestra rimane inesorabilmente. Ho provato anche ad
aumentare il tempo, ma non funziona


 ' e poi hai messo nel posto sbagliato il loop vedi sopra
azz ... hai fatto sbagliare pure me' : -)
'NON dovresti modificare troppo a casaccio le impostazioni che faccio
'io se metto un loop in un certo posto e lo sleep in un altro il motivo c'e'
'ti conviene copiare ESATTAMENTE come posto io provarlo e solo POI
'fare eventuali cambi se NON funziona:
 Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("C:\Programmi\AutoCAD R14\acad.exe")
 Do While oExec.Status = 0
 WScript.Sleep 100
 Loop
WScript.Sleep 2000
 WshShell.SendKeys"{ENTER}"
--
Fosco

  WshShell.SendKeys"{ENTER}"
le eventuali modifiche alla tempistica le fai sullo sleep qui sopra
(il secondo)
WScript.Sleep 3000  o
WScript.Sleep 1000
ecc
sono espresse in millisecondi  :
WScript.Sleep 1000 '= 1 secondo
--
Fosco

"Fosco"
si puo affinare lo script e renderlo piu sicuro e mirato
e' un pelo piu complesso ma ne vale la pena
fai partire l'autocad chiudilo e quando spunta la finestra con errore
e relativo mesgbox con OK  tu NON cliccarlo ma fai
Control+ALT+CANC e copia ESATTAMENTE le scritta che appare [1]
ricordati che il qui sotto AppActivate e' caSeSenSitiVE
'[1]
'la scritta che appare la nomino  >> "CAPTION DELL'ERRORE"
'per convenzione negli esempi qui sotto .. ovvio che la devi modificare
Set oShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("C:\Programmi\AutoCAD R14\acad.exe")
 Do While oExec.Status = 0
 WScript.Sleep 100
 Loop
While not oShell.AppActivate("CAPTION DELL'ERRORE")
wscript.Sleep 100
Wend
oShell.AppActivate("CAPTION DELL'ERRORE")
 WshShell.SendKeys"{ENTER}"
' se ci sono i buttons con si o no si puo' mandare direttamente anche un
'WshShell.SendKeys"s"
' alcuni Messagebox hanno delle proprieta' strane e non
' si puo interagire automaticamente coi metodi qui in
'discussione
'alternativa al sopra
Set oShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("C:\Programmi\AutoCAD R14\acad.exe")
 Do While oExec.Status = 0
 WScript.Sleep 100
 Loop
 WScript.Sleep 5000
 oShell.AppActivate("CAPTION DELL'ERRORE")
wscript.Sleep 100
 WshShell.SendKeys"{ENTER}"
Questo sotto e' l'help del WSH con numerosi esempi ( sopra il mega)
http://www.microsoft.com/downloads/details.aspx?FamilyId=01592C48-207D-4BE1-8A76-1C4099D7BBB9&displaylang=en
http://download.microsoft.com/download/winscript56/Install/5.6/W982KMeXP/EN-US/scrdoc56en.exe
(tuttosuunarigasenononfungecopiaincollaunpezzopervolta)
--
Fosco

 Fosco
Scusami, ma io non so cosa rire, ho provato per un'ora a fare ESATTAMENTE
quello che mi dici, copiando fedelmente tutto, ho chiamato il mio collega
per controllare se ho interpretato bene quello che c'e' scritto, ma non
funzionano, la finestra di errore compare sempre.


funzionano, la finestra di errore compare sempre.
Si come ho scritto alcune messgbox non son automatilizzabili con
questo sistema
Per vedere che l'automatismo in se stesso funziona basta fare questo piccolo test
PS :
http://digilander.iol.it/ifst/html/Quoting.html
Set oShell = CreateObject("WScript.Shell")
Set oExec = oShell.Exec("calc.exe")
 Do While oExec.Status = 0
 WScript.Sleep 100
 Loop
WScript.Sleep 1000
Set oExec = oShell.Exec("notepad.exe")
While not oShell.AppActivate("Senza nome - Blocco note")
wscript.Sleep 100
Wend
wscript.Sleep 1500
oShell.AppActivate("Senza nome - Blocco note")
src = "testo da mandare"
 oShell.SendKeys"{ENTER}"
 oShell.SendKeys src
 oShell.SendKeys"{ENTER}"
 oShell.SendKeys"O"
 oShell.SendKeys"{ENTER}"
 oShell.SendKeys"{ENTER}"
--
Fosco

"Fosco"
se hai qualche collega o conoscente che maneggia
il Visual Basic .. fattelo fare con quello con uno dei
sistemi che ho postato all'inizio del thread
Con quello ci va ad interagire direttamente con la classe
del programma e non con il messgbox
Ovviamente per fare una cosa cosi bisogna avere
il programma davanti (per controllare classi e vari comportamenti)
--
Fosco

 questo sistema
per fare un esempio concreto di come dovrebbe funzionare
ecco 2 script DISTINTI  .. da lanciare prima 1 e poi subito dopo 2
'1
set oShell = CreateObject("WScript.Shell")
  MsgBox "Irfan is not running"
'2
set oShell = CreateObject("WScript.Shell")
oShell.AppActivate "VbScript"
WScript.Sleep 1500
oShell.SendKeys"{enter}"
'PS
se tu o qualche tuo compare sapete smanettere un poco e volete
fare una cosa fatta bene in 2 minuti dcaricate ed installate
http://www.hiddensoft.com/autoit3/
andate subito a C:\Programmi\Autoit3\AU3_Spy.exe
e vedete le proprieta' della messagebox .. se non ce la fate
posta che dopo te lo faccio io
--
Fosco

Da Pannello di controllo>prestazione e manutenzione>sistema>avanzate:
prova nelle (Impostazioni) di Avvio e ripristino o in (Segnalazione errori) 
a togliere qualche spunta o in (Scelta programmi) ad aggiungerci il tuo r14 
in (Non segnalare gli errori dei seguenti programmi)