目的のウィンドウがアクティブな場合にのみ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は、このプロジェクトに固有のものです。他の目的に使用しないでください。
私たちが行っていることの詳細
ユーザーごとにインストールする必要がある場合は、登録する代わりにregasmを使用してregfileを作成します。次に、HKCR
へのすべての参照をHKCU\Software\Classes
に変更します。次に、regedit /s regfile.reg
とマージします。
ファイルを移動するには、新しい場所でRegasmを実行する必要があります。 batファイルのコマンドを参照してください。
もちろん、正確な歴史的目的のためにMSサイトで提起されます。
これは使用するための更新バージョンです。前の答えはそれが機能するために必要な最小限です。
これは、ここでの答え( 複数の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
バッチファイルはエラーなしで実行する必要があります。
最初のコマンドは、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ページやヘルプシステムなどのブラウザベースのドキュメントから対処すると、キャリッジリターンが目に見えない形でメモ帳に挿入されることがあります。