PDA

View Full Version : Mancato focus su sw eseguito all'avvio


Drin-Drina
20-04-2015, 12:29
Buongiorno a tutti,
ho un serio problema sull'avvio automatico di un browser web.
Vi spiego il mio problema. Ho la necessità di avviare un browser (possibilmente chrome o al massimo firefox) automaticamente all'avvio di windows, a schermo intero e soprattutto che quest'ultimo sia la finestra attiva all'interno di esplora risorse.
Ho provato di tutto, su vari computer con windows 8 ma all'avvio, in maniera apparentemente random (a volte lo fa a volte no), il browser si avvia ma non risulta la finestra attiva di windows. Essendo a schermo intero l'unico modo che ho di accorgermene è utilizzare una periferica di input per verificare se questa scrive nella casella di testo impostata nella pagina iniziale del browser
Mi spiego meglio. Immaginate di avere impostato www.google.it come pagina iniziale. Se avviate il browser automaticamente all'avvio a tutto schermo, senza intervenire in alcun modo, dovreste ritrovarvi sulla schermata di google con il cursore lampeggiante posizionato sulla barra di ricerca (autofocus).
Bene a me si avvia tutto correttamente ma il browser non risulta essere la finestra attiva...
Ho provato molte soluzioni ma il problema persiste.
Provato chrome in modalità metro, in modalità normale, in modalità kiosk (e varie altri comandi da suffisso), cambiando browser non cambia nulla, provato ad avviare in esecuzione automatica, creando un task all'accesso, un task posticipato (pensavo potesse essere qualcosa del tipo "si avvia prima chrome e poi qualcos'altro che mi sposta il focus" ma niente), provato con un sw terze parti per l'avvio automatico. Niente, non riesco a venirne a capo, anche perchè la cosa più fastidiosa è che a volte si avvia "onfocus" a volte no....
Cosa potrebbe essere, o come potrei aggirare il problema considerando che deve essere tutto automatizzato, ogni giorno i pc si accendono automaticamente da bios (timer o in emergenza wol) e si spengono con un task?
Grazie 1000

x_Master_x
20-04-2015, 13:51
Utilizza un VBS ( o altro linguaggio a tua scelta ) che esegua il browser e allo stesso tempo attivi quella finestra. Per quanto riguarda i VBS devi cercare:

WshShell ( WScript.CreateObject("WScript.Shell") )
WshShell.Run
WshShell.AppActivate


P.S. Con WshShell.Run e i suoi vari parametri è possibile avviare un programma con i vari stili

1 Activate and display the window (restore size and position)
3 Activate & maximize
etc.

WshShell.AppActivate è un ulteriore conferma in caso che, per qualche motivo, la finestra non dovesse essere attiva.

Drin-Drina
20-04-2015, 15:39
Utilizza un VBS ( o altro linguaggio a tua scelta ) che esegua il browser e allo stesso tempo attivi quella finestra. Per quanto riguarda i VBS devi cercare:

WshShell ( WScript.CreateObject("WScript.Shell") )
WshShell.Run
WshShell.AppActivate


P.S. Con WshShell.Run e i suoi vari parametri è possibile avviare un programma con i vari stili

1 Activate and display the window (restore size and position)
3 Activate & maximize
etc.

WshShell.AppActivate è un ulteriore conferma in caso che, per qualche motivo, la finestra non dovesse essere attiva.

Sei stato gentilissimo, sono assolutamente a digiuno di programmazione ma sto guardando qualche soluzione.
Ho preferito usare wshshell.Run "%comspec% /c start c:\chrome.lnk" inserendo nel link il suffisso --start-fullscreen altrimenti non riesco a farlo partire a tutto schermo ma solo massimizzato. Se non ho capito male devo utilizzare WshShell.AppActivate con l'argomento "chrome", corretto?

in definitiva il mio script è così:
set wshShell = CreateObject("WScript.Shell")
wshshell.Run "%comspec% /c start c:\chrome.lnk"
wshshell.appactivate("chrome")

mi chiedevo, esiste mica un modo per mantenere lo script attivo e controllare se perde il focus e nel caso ridarglielo?

x_Master_x
20-04-2015, 16:21
' x_Master_x
Option Explicit
Dim WshShell, Infinite
Infinite = 0

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run """X:\Cartella\Google\Chrome\Application\chrome.exe"" --kiosk https://www.google.it/", 1, False
WshShell.AppActivate("Google Chrome")
Do While Infinite = 0
WshShell.AppActivate("Google Chrome")
WScript.Sleep(100)
Loop

Drin-Drina
20-04-2015, 18:08
' x_Master_x
Option Explicit
Dim WshShell

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run """X:\Cartella\Google\Chrome\Application\chrome.exe"" --kiosk https://www.google.it/", 1, True
WshShell.AppActivate("Google Chrome")
Do While WshShell.AppActivate("Google Chrome") = False
WshShell.AppActivate("Google Chrome")
WScript.Sleep 1000
Loop


Ma grandissimo!!! :ave:
Ci stiamo avvicinando...
Premesso che pare funzionare per il mio scopo se lanciato all'avvio, l'unico dubbio è che mi aspettavo che lo script intervenisse anche su azioni umane, nel senso, se premo su una finestra diversa non mi fa tornare il focus sulla finestra di chrome. Però ripeto se inserito in esecuzione automatica parrebbe funzionare quindi grazie mille.

Così per curiosità ho inserito un msgbox esattamente prima del loop per capire quando e se intervenisse realmente ma il msgbox mi compare solamente se chiudo chrome... :mbe: Non dovrebbe comparire ogniqualvolta chrome perde il focus?
Qualcosa mi sfugge...

x_Master_x
20-04-2015, 20:10
Riprova, ho aggiornato il codice. Il VBS è limitato senza le API...

P.S. Non quotare se non è necessario, soprattutto i codici.

Drin-Drina
20-04-2015, 21:49
Limitato o no è esattamente quello che cercavo.... ma proprio esatto esatto! Non so come ringraziarti :mano:
senza contare che mi hai fatto venire voglia di rispolverare vecchi codici.

Drin-Drina
21-04-2015, 08:35
Stavo pensando che per essere proprio al top sarebbe meglio sostituire Do While Infinite = 0 con un Do While chrome-è-aperto :D
Ho provato a guardare ma non sembra esserci un oggetto preposto, bisogna analizzare con Service.InstancesOf se esiste il Process.Name di chrome e agire di conseguenza (stoppare lo script). Viceversa lo script resta aperto se si chiude chrome e torna anche ad influire sul focus nel caso si riapra il browser. :cincin:

x_Master_x
21-04-2015, 09:07
Chrome lancia un moltitudine di processi, non uno solo. A quel punto dovresti usare WMI in loop con qualcosa tipo:

"SELECT * FROM Win32_Process WHERE Name='chrome.exe'"

Lascio a te il compito, visto che ti è tornata la voglia :D

Drin-Drina
21-04-2015, 11:21
' x_Master_x
Dim WshShell, Infinite
Infinite = 0
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run """C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"" --start-fullscreen https://www.google.it/", 1, False
WshShell.AppActivate("Google Chrome")
strcomputer = "."
Set objwmiservice = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Do While Infinite = 0
Set colprocesslist = objwmiservice.execquery("SELECT * FROM Win32_Process WHERE Name = 'chrome.exe'")
if colprocesslist.count >0 Then
'msgbox "bravo"
WshShell.AppActivate("Google Chrome")
WScript.Sleep(100)
else exit do
end if
'set colprocesslist.count = 0
Loop
Sembra funzionare.... Non mi è chiaro se il count si azzera quando ricomincia il loop... però se chiudo chrome lo script si interrompe, e allo stesso tempo l'autofocus funziona... quindi direi che ho (hai) raggiunto il risultato... o no?!
Ottimizzazioni?
Scusa se mi permetto di editarti il codice :D

EDIT: nelle impostazioni di chrome è necessario togliere la spunta alle app in background altrimenti NON si chiudono tutti i task chrome.exe che, come hai già detto te, ne fa aprire una marea all'avvio (ma se chiudo li termina tutti se si toglie la spunta)

Drin-Drina
21-04-2015, 11:46
Dim WshShell, Infinite
Infinite = 0
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run """C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"" --start-fullscreen https://www.google.it", 1, False
WshShell.AppActivate("Google Chrome")
strcomputer = "."
Set objwmiservice = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set colprocesslist = objwmiservice.execquery("SELECT * FROM Win32_Process WHERE Name = 'chrome.exe'")
Do While colprocesslist.count >0
Set colprocesslist = objwmiservice.execquery("SELECT * FROM Win32_Process WHERE Name = 'chrome.exe'")
'msgbox "bravo"
WshShell.AppActivate("Google Chrome")
WScript.Sleep(100)
Loop

Sembra funzionare anche così, peccato per il doppio Set, ma se non metto il secondo non esce dal loop e se non metto il primo non ci entra proprio in loop

Okok adesso sto esagerando :D :D

x_Master_x
21-04-2015, 12:37
' x_Master_x
Option Explicit
Dim WshShell, objWMIService, Infinite, colItems
Infinite = 0

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "notepad.exe", 1, False

Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")

Do While Infinite = 0
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'notepad.exe'")
If colItems.count = 0 Then
WsCript.Echo "Quit"
WScript.Quit
End If
WScript.Sleep(100)
Loop


Chiaro ora? ;)

Drin-Drina
21-04-2015, 12:59
Chiaro ora? ;)

Di più :D

' x_Master_x
Option Explicit
Dim WshShell, objWMIService, Infinite, colItems
Infinite = 0

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run """C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"" --start-fullscreen https://www.google.it", 1, False
WShshell.AppActivate("Google Chrome")
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")

Do While Infinite = 0
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'chrome.exe'")
If colItems.count = 0 Then
'WsCript.Echo "Quit"
WScript.Quit
End If
WshShell.AppActivate("Google Chrome")
WScript.Sleep(100)
Loop

Adesso è proprio perfetto. Grazie 1000, è stato un piacere.

Drin-Drina
21-04-2015, 15:13
Che barba! ho cantato vittoria troppo presto... :doh:
Su vari computer AppActivate non funziona. Che frustrazione... sembra che provi a mettere onfocus la finestra ma resta in loop; nelle versioni di win con aero si vede lampeggiare alla frequenza del loop l'icona di chrome sulla barra delle applicazioni ma non lo mette onfocus. Ho letto in giro di vari problemi su questo dannato AppActivate ma non riesco a capire cosa non vada. Già ieri sera la tua prima versione probabilmente funzionava, solo che lo provavo su un computer "sbagliato". Quando sono arrivato a casa sul pc di casa (con stesso sysop) funzionava tutto e anche stamattina. Poi tornato in ufficio mi sono accorto che qua invece non va... Non funziona proprio l'appactivate.
:muro:

x_Master_x
21-04-2015, 16:25
Te l'avevo detto che i VBS sono limitati. Considerando che non voglio stare qui fino a natale... :D
Un eseguibile, fa tutto lui di quello che hai chiesto. L'unica cosa che devi fare tu è metterlo nella stessa directory dell'.exe di Chrome:
http://www.yourfilelink.com/get.php?fid=1057696

Password:
hwupgrade.it

Drin-Drina
21-04-2015, 16:41
Ma come, io mi sbatto e tu mi porti la pappa pronta?! :D
Mi stavo orientando verso, autoitx e WinActivate... non vorrei abusare della tua pazienza ma non potresti rimuovermi la pagina iniziale di google.it e lasciare quella predefinita del browser? E magari passarmi il sorgente :bimbo: :D

EDIT: dai che natale è vicino :rotfl:

x_Master_x
22-04-2015, 09:53
Fatto. La differenza con il VBS è tutta qui:
GetActiveWindow (https://msdn.microsoft.com/it-it/library/windows/desktop/ms646292(v=vs.85).aspx)
SetActiveWindow (https://msdn.microsoft.com/it-it/library/windows/desktop/ms646311(v=vs.85).aspx)

Drin-Drina
22-04-2015, 10:14
Grazie ancora...
io ero arrivato a questo, ma pare non faccia il loop e non capisco perchè...:muro:

Opt("WinTitleMatchMode", 2)
#include <MsgBoxConstants.au3>
Example()

Func Example()

Run("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe --start-fullscreen")

Local $hWnd = WinWaitActive("[TITLE:Google Chrome]", "", 1)

WinActivate($hWnd)


EndFunc ;==>Example
Do
If WinActive("[TITLE:Google Chrome]") Then ; Check if Notepad is currently active.
Else
WinActivate("[TITLE:Google Chrome]")
EndIf
Sleep(1000)
Until WinExists(("[TITLE:Google Chrome]")) = 1

Drin-Drina
22-04-2015, 11:04
ahahahh ho fatto un po' di casino!

Ce l'ho fatta, grazie 1000! Il tuo exe funziona alla perfezione ma adesso anche il mio scriptino autoit!!!!!
Adesso ricordo perchè mi piaceva programmare! :D :yeah:

Opt("WinTitleMatchMode", 2)
#include <MsgBoxConstants.au3>
Example()
Local $hWnd
Func Example()
Run("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe --start-fullscreen")
Local $hWnd = WinWaitActive("[TITLE:Google Chrome]", "", 1)
WinActivate($hWnd)
While 1
If WinExists("[TITLE:Google Chrome]") = 0 Then
MsgBox($MB_SYSTEMMODAL, "Adieu", "Chrome è stato chiuso", 10)
ExitLoop
Else
WinActivate("[TITLE:Google Chrome]")
EndIf
Sleep(100)
WEnd
EndFunc