VBS:InputBox位置与从WMIC检索的屏幕尺寸不正确相关

时间:2019-09-19 23:13:50

标签: vbscript screen-resolution wmic

此批处理代码以“ 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

但是,不是。这是因为VBS InputBox函数中的PosXPosY变量是用Twips而不是Pixels测量的。

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

有什么方法可以仅使用Batch和VBScript将Pixels转换为Twips

1 个答案:

答案 0 :(得分:1)

我在创建错误消息自定义程序时遇到了一个解决方案。这个想法是从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>