VBS: позиция InputBox не коррелирует с размером экрана, полученным из WMIC - PullRequest
0 голосов
/ 20 сентября 2019

Этот пакетный код извлекает ширину и высоту экрана в формате "WIDTH x HEIGHT"

@echo off
setlocal
for /f %%A in ('wmic path Win32_VideoController get CurrentHorizontalResolution^,CurrentVerticalResolution /value ^| find "="') do set "%%A"
echo %CurrentHorizontalResolution% x %CurrentVerticalResolution%

Теперь, учитывая выходные данные выше, возвращает "1920 x 1080", приведенный ниже код VBScriptдолжен появиться InputBox в правом нижнем углу экрана.

InputBox "","Title","",1920,1080

Однако это не так.Это связано с тем, что переменные PosX и PosY в функции VBS InputBox измеряются в Twips вместо Pixels.

https://docs.microsoft.com/en-us/dotnet/api/microsoft.visualbasic.interaction.inputbox?view=netframework-4.8

Есть ли способ преобразованияPixels до Twips только с Batch и VBScript?

1 Ответ

1 голос
/ 20 сентября 2019

Я столкнулся с решением при создании программы настройки сообщений об ошибках.Идея состоит в том, чтобы взять вторую пару значений из WMIC, известных как «PixelsPerXLogicalInch» и «PixelsPerYLogicalInch»

for /f %%A in ('wmic path Win32_DesktopMonitor get PixelsPerXLogicalInch^,PixelsPerYLogicalInch /value ^| find "="') do set "%%A"
echo %PixelsPerXLogicalInch% x %PixelsPerYLogicalInch%

. Это выведет коэффициент преобразования для преобразования пикселей в дюймы.Поскольку смещение составляет всего 1/1440 от дюйма, разделение этих значений на 1440 приведет к числу смещений на пиксель.

for /f %%A in ('wmic path Win32_DesktopMonitor get PixelsPerXLogicalInch^,PixelsPerYLogicalInch /value ^| find "="') do set "%%A"
set /a TwipsPerPixelX=1440/%PixelsPerXLogicalInch%
set /a TwipsPerPixelY=1440/%PixelsPerYLogicalInch%
echo %TwipsPerPixelX% x %TwipsPerPixelY%

Теперь просто примените эти коэффициенты преобразования к позиционным вычислениям с небольшимумножение.

@echo off
setlocal
for /f %%A in ('wmic path Win32_VideoController get CurrentHorizontalResolution^,CurrentVerticalResolution /value ^| find "="') do set "%%A"
for /f %%A in ('wmic path Win32_DesktopMonitor get PixelsPerXLogicalInch^,PixelsPerYLogicalInch /value ^| find "="') do set "%%A"
set /a TwipX=%CurrentHorizontalResolution%*(1440/%PixelsPerXLogicalInch%)
set /a TwipY=%CurrentVerticalResolution%*(1440/%PixelsPerYLogicalInch%)
echo %TwipX% x %TwipY%

Выходные значения из этого набора команд создадут InputBox сразу за нижним правым углом экрана (так как окна расположены в верхнем левом углу.)

Принимая всеПринимая это во внимание, вы можете создать скрипт, который порождает InputBox в случайной позиции на экране.Это, или запросить у пользователя значение позиции, или даже использовать его в ваших собственных приложениях CMD / VBS для более точного позиционирования ваших блоков ввода.

<!-- :
  @echo off
  setlocal
  for /f %%A in ('wmic path Win32_VideoController get CurrentHorizontalResolution^,CurrentVerticalResolution /value ^| find "="') do set "%%A"
  for /f %%A in ('wmic path Win32_DesktopMonitor get PixelsPerXLogicalInch^,PixelsPerYLogicalInch /value ^| find "="') do set "%%A"
  set /a RandX=(%Random%*%CurrentHorizontalResolution%/32768)*(1440/%PixelsPerXLogicalInch%)
  set /a RandY=(%Random%*%CurrentVerticalResolution%/32768)*(1440/%PixelsPerYLogicalInch%)
  start /b cscript //nologo "%~f0?.wsf" "%RandX%" "%RandY%"
  exit /b
-->

<job><script language="VBScript">
  InputBox "","Randomly-Positioned Input Box","",Wscript.Arguments(0),Wscript.Arguments(1)
</script></job>
...