Come trovare la finestra Titolo della finestra triggers (in primo piano) utilizzando Window Script Host

Voglio trovare il titolo della finestra che è attualmente triggers (con focus) usando Window Script Host (WSH) perché voglio che il mio script WSH solo su Sendkeys Se la finestra desiderata è triggers.

Nota * Non sono in grado di utilizzare l’alternativa, ovvero l’triggerszione della finestra desiderata prima di richiamare i sendkeys.

Qualsiasi aiuto è apprezzato.

Risposta breve: non puoi. Almeno non senza scrivere un wrapper COM per le chiamate API di Windows rilevanti.

Non puoi semplicemente usare AppActivate e controllare il risultato?

 Set oShell = CreateObject("WScript.Shell") If oShell.AppActivate "Untitled - Notepad" Then oShell.SendKeys "Hello, world!" End If 

Risposta lunga: per ottenere il titolo della finestra triggers, è necessario chiamare la funzione GetWindowText dell’API di Windows e passare l’ GetForegroundWindow() . VBScript e Windows Script Host non supportano le chiamate API di Windows, quindi è necessario scrivere un wrapper COM attorno a queste funzioni, che è ansible utilizzare nel proprio script. Ecco alcuni esempi:

Ottieni il titolo attuale della finestra attivo in C

Come ottengo il titolo della finestra triggers corrente usando c #?

È ansible creare un object COM con GetForegroundWindow e GetWindowText.

Inserisci le seguenti righe in wso.cls e store è una cartella denominata wso sul desktop.

 Imports System Imports System.Runtime.InteropServices Imports Microsoft.Win32 Namespace WindowScriptingObject  _ Public Interface _WindowScriptingObject  Function ActiveWindow() As Integer  Function WindowText(ByVal hWnd As Integer) As String End Interface  Public Class WindowScriptingObject Implements _WindowScriptingObject Public WindowScriptingObject() Public Declare Auto Function GetForegroundWindow Lib "user32" Alias "GetForegroundWindow"() As Integer Public Declare Auto Function GetWindowText Lib "user32.dll" (ByVal hwnd As Int32,  ByVal lpString As System.Text.StringBuilder, ByVal cch As Int32) As Int32 Public Function ActiveWindow() As Integer Implements _WindowScriptingObject.ActiveWindow ActiveWindow=GetForegroundWindow() End Function Public Function WindowText(hwnd as Integer) As String Implements _WindowScriptingObject.WindowText on error resume next Dim b As New System.Text.StringBuilder(ChrW(0), 512) Dim ret = GetWindowText(hWnd, b, b.Capacity) WindowText = b.tostring End Function End Class End Namespace 

Quindi creare un file bat nella stessa cartella denominata wso.bat.

 "C:\Windows\Microsoft.NET\Framework\v4.0.30319\vbc.exe" /target:library /out:"%userprofile%\desktop\wso\wso.dll" "%userprofile%\desktop\wso\wso.cls" /verbose "C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm" /codebase "%userprofile%\desktop\wso\wso.dll" /tlb:"%userprofile%\desktop\wso\wso.tlb" /v If /i "%cmdcmdline:~0,6%"=="cmd /c" pause 

Da utilizzare in vbs dopo aver eseguito il file bat.

 Set wso=CreateObject("WindowScriptingObject") x = wso.ActiveWindow msgbox x, , "vbs" msgbox wso.windowtext(x), , "vbs" 

I GUID qui utilizzati sono specifici per questo progetto. Non usarli per altri scopi.

Maggiori informazioni su ciò che stiamo facendo

http://social.msdn.microsoft.com/Forums/en-US/adcae113-4758-481a-a367-60d5d14d97d6/this-is-how-to-turn-vbs-and-js-files-into-exe- file-from-the-riga di comando, senza-di terze parti-tools? forum = scripting

Se è necessario eseguire un’installazione per utente, utilizzare regasm per creare un regfile anziché registrarlo. Quindi modificare tutti i riferimenti a HKCR a HKCU\Software\Classes . Quindi unire con regedit /s regfile.reg .

Per spostare il file è necessario eseguire Regasm su di esso nella sua nuova posizione. Vedi comando nel file bat.

Sarà posto sul sito di MS naturalmente per fini storici accurati.

Questa è una versione aggiornata per l’uso. La risposta precedente è il minimo necessario per il suo funzionamento.

Questo sostituisce anche la risposta qui (si applica tra più istanze di Internet Explorer ), in quanto non funzionava per Windows 7 e versioni successive a causa del fatto che sendmail era un nome riservato su quei sistemi operativi.

 Imports System Imports System.Runtime.InteropServices Imports Microsoft.Win32 Namespace WindowScriptingObject  _ Public Interface _WindowScriptingObject  Function ActiveWindow() As UInteger  Function WindowText(ByVal hWnd As UInteger) As String  Function WindowPID(ByVal hWnd As UInteger) As UInteger End Interface  Public Class WindowScriptingObject Implements _WindowScriptingObject Public WindowScriptingObject() Public Declare Auto Function GetForegroundWindow Lib "user32" Alias "GetForegroundWindow"() As UInteger Public Declare Auto Function GetWindowText Lib "user32.dll" (ByVal hwnd As Int32,  ByVal lpString As System.Text.StringBuilder, ByVal cch As Int32) As Int32 Public Declare Auto Function GetWindowThreadProcessId Lib "user32" Alias "GetWindowThreadProcessId" (ByVal hwnd As UInteger, ByRef lpdwProcessId As UInteger) As UInteger Public Function ActiveWindow() As UInteger Implements _WindowScriptingObject.ActiveWindow ActiveWindow = GetForegroundWindow() If err.lastdllerror <> 0 then Dim tmp as uinteger = err.lastdllerror and &h80070000 err.raise(tmp, "WindowSystemObject.GetForegroundWindow", "Type net helpmsg " & err.lastdllerror & " in a command prompt for help") Exit Function End If End Function Public Function WindowText(hwnd as UInteger) As String Implements _WindowScriptingObject.WindowText Dim b As New System.Text.StringBuilder(ChrW(0), 512) Dim ret as uinteger = GetWindowText(hWnd, b, b.Capacity) If err.lastdllerror <> 0 then Dim tmp as uinteger = err.lastdllerror and &h80070000 WindowText = "" err.raise(tmp, "WindowSystemObject.GetWindowText", "Type net helpmsg " & err.lastdllerror & " in a command prompt for help") Exit Function End If WindowText = b.tostring End Function Public Function WindowPID(HWnd as UInteger) As UInteger Implements _WindowScriptingObject.WindowPID Dim X as UInteger Dim M as UInteger = 1 X=GetWindowThreadProcessID(HWnd,M) If err.lastdllerror <> 0 then Dim tmp as uinteger = err.lastdllerror and &h80070000 WindowPID = 0 err.raise(tmp, "WindowSystemObject.GetWindowThreadProcessID", "Type net helpmsg " & err.lastdllerror & " in a command prompt for help") Exit Function End If WindowPID = M End Function End Class End Namespace 

Il file batch deve essere eseguito senza errori.

Il primo comando rende la DLL dal file cls. Dirà Compilation Sucessfull . Si aspetta che i file si trovino in una cartella denominata wso sul desktop.

Il secondo comando lo registra per macchina. Devi essere un amministratore per farlo. Se non si è un amministratore, è necessario generare un file reg e modificare tutto HKEY_CURRENT_ROOT in HKEY_CURRENT_USER \ Software \ Classes.

Per generare un regfile

 "C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm" /regfile:"%userprofile%\desktop\wso\wso.reg" "%userprofile%\desktop\wso\wso.dll" /v 

Dopo aver modificato wso.reg, fonderlo con

 regedit /m "%userprofile%\desktop\wso\wso.reg" 

E hai bisogno di leggere i risultati dei comandi.

Ecco lo script in esecuzione che mostra hwnd, PID e titolo della finestra (e codice di errore). Nota come all’avvio dello script non ci sia una finestra triggers per circa due secondi (Windows è in attesa che il tuo programma ne crei uno da rendere attivo. Attende solo 2 secondi). Di solito all’avvio del programma, ma anche altre volte, per brevi periodi non ci sarà una finestra triggers. Devi intrappolare questo. Ecco uno script che fa.

 On error resume next Set wso=CreateObject("WindowScriptingObject") Do x = wso.ActiveWindow wscript.echo x wscript.echo wso.windowtext(x) wscript.echo (err.number) err.clear wscript.echo wso.windowpid(x) wscript.echo (err.number) err.clear wscript.sleep 1000 Loop 

E questo è quello che sembra quando si esegue con CScript in un prompt dei comandi.

 C:\Users\User>cscript "C:\Users\User\Desktop\ActiveWindow.vbs" Microsoft (R) Windows Script Host Version 5.7 Copyright (C) Microsoft Corporation. All rights reserved. -2147024809 -2147024809 3344366 Administrator: Command Prompt - cscript "C:\Users\User\Desktop\ActiveWin dow.vbs" 0 972 0 3344366 Administrator: Command Prompt - cscript "C:\Users\User\Desktop\ActiveWin dow.vbs" 0 972 0 3344366 1312854 vbscript - How to find the window Title of Active(foreground) window using Windo w Script Host - - Windows Internet Explorer 0 4724 0 1312854 vbscript - How to find the window Title of Active(foreground) window using Windo w Script Host - - Windows Internet Explorer 0 4724 0 3344366 Administrator: Command Prompt - cscript "C:\Users\User\Desktop\ActiveWin dow.vbs" 0 972 0 ^C C:\Users\User> 

—- EDIT —-

Sembra che tu sia stato colpito da un bug del blocco note quando incolli dalle pagine web dalla spaziatura divertente del nome dell’object nel messaggio di errore.

Se si utilizza il blocco note per scriverlo, copiare e incollare nel wordpad per controllare le interruzioni di riga. Blocco note ignora completamente e nasconde i ritorni a capo, ma altri programmi no. Blocco note cerca solo line feed. Se si affronta la documentazione basata sul browser come pagine Web e sistemi di guida a volte i ritorni a capo vaganti vengono inseriti invisibilmente nel blocco note.