Как найти окно Заголовок активного (переднего плана) windows с помощью Window Script Host

Я хочу найти заголовок windows, которое в настоящее время активно (с фокусом) с помощью Window Script Host (WSH), потому что я хочу, чтобы мой скрипт WSH был только Sendkeys. Если желаемое окно активно.

Примечание. * Я не в состоянии использовать альтернативу, т.е. активировать нужное окно перед вызовом sendkeys.

Любая помощь приветствуется.

Короткий ответ: вы не можете. По крайней мере, не без написания COM-оболочки для соответствующих вызовов Windows API.

Не можете ли вы просто использовать AppActivate и проверить результат?

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

Длинный ответ. Чтобы получить заголовок активного windows, вам нужно вызвать функцию GetWindowText Windows API и передать GetForegroundWindow() . VBScript и Windows Script Host не поддерживают вызовы Windows API, поэтому вам нужно написать COM-обертку вокруг этих функций, которую вы можете использовать в своем скрипте. Вот примеры:

Получить текущий активный заголовок windows в C

Как получить заголовок текущего активного windows с помощью c #?

Вы можете создать COM-объект с помощью GetForegroundWindow и GetWindowText.

Поместите следующие строки в wso.cls и сохраните папку wso на рабочем столе.

 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 

Затем создайте файл bat в той же папке, что и 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 

Использовать в vbs после запуска файла bat.

 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- файлы-из-командной строки-без-сторонние инструменты? форум = скриптинг

Если вы должны выполнить установку для каждого пользователя, используйте regasm, чтобы создать regfile, а не регистрировать его. Затем измените все ссылки на HKCR на HKCU\Software\Classes . Затем объединитесь с regedit /s regfile.reg .

Чтобы переместить файл, вам нужно запустить Regasm на нем в новом месте. См. Команду в файле bat.

Будет поставлен на месте MS, конечно, для точных исторических целей.

Это обновленная версия для использования. Предыдущий ответ – минимальный, необходимый для его работы.

Это также заменяет ответ здесь ( appactivate между несколькими экземплярами Internet explorer ), поскольку он не работает для Windows 7 и более поздних версий из-за того, что sendmail является зарезервированным именем для этих ОС.

 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 

Пакетный файл должен работать без ошибок.

Первая команда делает dll из файла cls. Он скажет « Компиляция Sucessfull» . Он ожидает, что файлы будут находиться в папке wso на вашем рабочем столе.

Вторая команда регистрирует его на машину. Вы должны быть администратором, чтобы сделать это. Если вы не являетесь администратором, вы должны создать рег-файл и изменить все 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 и заголовок windows (и код ошибки). Обратите внимание, что при запуске скрипта нет активного windows в течение примерно двух секунд (windows ждут, когда ваша программа будет создавать одну из них, чтобы она активировалась, она только ждет 2 секунды). Обычно при запуске программы, но и в других случаях, в течение коротких периодов не будет активного windows. Вы должны заманить в ловушку. Вот сценарий, который делает.

 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> 

—- EDIT —-

Похоже, вы попали в блокнотную ошибку при вставке с веб-страниц из смешного интервала имени объекта в сообщении об ошибке.

Если вы используете блокнот, чтобы записать его, скопируйте и вставьте в текстовый блок, чтобы проверить разрывы строк. Блокнот полностью игнорирует и скрывает возврат каретки, но другие программы этого не делают. Блокнот только ищет линии. Если копирование из документации на основе браузера, такой как веб-страницы и справочные системы, иногда бродячие возвращения каретки становятся незаметно вставленными в блокнот.

Interesting Posts
Давайте будем гением компьютера.