web-dev-qa-db-ja.com

ウィンドウスクリプトホストを使用してアクティブ(フォアグラウンド)ウィンドウのウィンドウタイトルを見つける方法

目的のウィンドウがアクティブな場合にのみWSHスクリプトをSendkeysに送信したいので、Window Script Host(WSH)を使用して現在アクティブな(フォーカスがある)ウィンドウのタイトルを見つけたいと思います。

注*私は代替手段を使用できる状態ではありません。つまり、送信キーを呼び出す前に目的のウィンドウをアクティブ化することはできません。

どんな助けでも大歓迎です。

GetForegroundWindowとGetWindowTextを使用してCOMオブジェクトを作成できます。

次の行をwso.clsに入力すると、デスクトップにwsoというフォルダーが保存されます。

Imports System
Imports System.Runtime.InteropServices
Imports Microsoft.Win32

Namespace WindowScriptingObject

    <Guid("7448E08D-ED0F-4E23-B528-91937BB41756"), _
    InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> _
   Public Interface _WindowScriptingObject
        <DispId(1)> Function ActiveWindow() As Integer
        <DispId(2)> Function WindowText(ByVal hWnd As Integer) As String
    End Interface

    <Guid("B146BF9E-78FC-4DB0-ABFE-9FF026B43E4D"), _
     ClassInterface(ClassInterfaceType.None), _
     ProgId("WindowScriptingObject")> 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, <Out()> 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

次に、wso.batという同じフォルダーに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

Batファイルを実行した後にvbsで使用します。

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

ここで使用されるGUIDは、このプロジェクトに固有のものです。他の目的に使用しないでください。

私たちが行っていることの詳細

http://social.msdn.Microsoft.com/Forums/en-US/adcae113-4758-481a-a367-60d5d14d97d6/this-is-how-to-turn-vbs-and-js-files- into-exe-files-from-the-command-line-without-third-party-tools?forum = scripting

ユーザーごとにインストールする必要がある場合は、登録する代わりにregasmを使用してregfileを作成します。次に、HKCRへのすべての参照をHKCU\Software\Classesに変更します。次に、regedit /s regfile.regとマージします。

ファイルを移動するには、新しい場所でRegasmを実行する必要があります。 batファイルのコマンドを参照してください。

もちろん、正確な歴史的目的のためにMSサイトで提起されます。

4

これは使用するための更新バージョンです。前の答えはそれが機能するために必要な最小限です。

これは、ここでの答え( 複数のInternet Explorerインスタンス間でappactivate )も置き換えます。これは、sendmailがこれらのOSで予約された名前であるため、Windows7以降では機能しなかったためです。

Imports System
Imports System.Runtime.InteropServices
Imports Microsoft.Win32

Namespace WindowScriptingObject

    <Guid("7448E08D-ED0F-4E23-B528-91937BB41756"), _
    InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> _
   Public Interface _WindowScriptingObject
        <DispId(1)> Function ActiveWindow() As UInteger
        <DispId(2)> Function WindowText(ByVal hWnd As UInteger) As String
        <DispId(3)> Function WindowPID(ByVal hWnd As UInteger) As UInteger
    End Interface

    <Guid("B146BF9E-78FC-4DB0-ABFE-9FF026B43E4D"), _
     ClassInterface(ClassInterfaceType.None), _
     ProgId("WindowScriptingObject")> 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, <Out()> 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
2
triggeradeadcat

バッチファイルはエラーなしで実行する必要があります。

最初のコマンドは、clsファイルからdllを作成します。 Compilation Sucessfullと表示されます。それはファイルがあなたのデスクトップ上のwsoと呼ばれるフォルダにあることを期待しています。

2番目のコマンドは、マシンごとにそれを登録します。これを行うには、管理者である必要があります。管理者でない場合は、regファイルを生成し、すべてのHKEY_CURRENT_ROOTをHKEY_CURRENT_USER\Software\Classesに変更する必要があります。

Regfileを生成するには

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

Wso.regを編集した後、

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

そして、コマンドの結果を読む必要があります。

これは、hwnd、PID、およびウィンドウタイトル(およびエラーコード)を示す実行中のスクリプトです。スクリプトの開始時に、アクティブなウィンドウが約2秒間ないことに注意してください(ウィンドウは、プログラムがアクティブにするためにプログラムが作成するのを待機しています。2秒間だけ待機します)。通常、プログラムの開始時ですが、それ以外の場合は、アクティブなウィンドウが短期間存在しません。これをトラップする必要があります。これが実行するスクリプトです。

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

これは、コマンドプロンプトでCScriptを使用して実行した場合の外観です。

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>

----[〜#〜]編集[〜#〜] ----

エラーメッセージのオブジェクト名の面白い間隔からWebページから貼り付けるときに、メモ帳のバグに見舞われたようです。

メモ帳を使用して書き込む場合は、コピーしてワードパッドに貼り付け、改行を確認します。メモ帳はキャリッジリターンを完全に無視して非表示にしますが、他のプログラムはそうではありません。メモ帳は改行のみを検索します。 Webページやヘルプシステムなどのブラウザベースのドキュメントから対処すると、キャリッジリターンが目に見えない形でメモ帳に挿入されることがあります。

1
triggeradeadcat