【问题标题】:script vbs to windows api run脚本 vbs 到 windows api 运行
【发布时间】:2022-06-11 10:36:11
【问题描述】:

我有一个播放 mp3 的 vbs 脚本,正常的做法是通过将 mp3 文件拖到 vbs 来调用它或使用命令行指定 mp3。

Set objArgs = Wscript.Arguments
if (objArgs.Count = 0) then
    Wscript.echo "Necesito un archivo MP3"
    WScript.Quit 123
end if
'Wscript.echo "Playing: " & objArgs(0) & "..."
Set objPlayer = createobject("Wmplayer.OCX.7")
With objPlayer  ' saves typing
    .settings.autoStart = True
    .settings.volume = 100  ' 0 - 100
    .settings.balance = 0  ' -100 to 100
    .settings.enableErrorDialogs = False
    .enableContextMenu = False
    .URL = objArgs(0)
    WScript.Sleep(10000)  ' time to load and start playing
    '.Controls.Pause()  ' stop
End With
WScript.Quit 0
' MsgBox "if WMP is still playing, clicking OK will end it", _
' vbInformation, "WMP Demo finished"

为了简单起见,我需要在不创建 vbs 文件的情况下调用此代码。 这可以通过 Windows API 完成吗?

例如 callvbsfunction("mycodevbs") 并运行它?

当我提到 windows api 时,我指的是类似于这些的功能

MessageBox( 0, "Test", "Title here", MB_OK )
GetSystemMetrics( SM_CXSCREEN )
ShellExecute( 0, "open", "c:\myfile.txt", 0, 0, 1 )
Beep( 1000, 250 )

还有更多...

【问题讨论】:

  • 您可以使用custom COM capable DLL 使用Windows API。不幸的是,无法使用 VBScript 开箱即用地访问 Windows API。
  • @user692942 即使 .NET 很难注册支持 COM 的 DLL,你是否要编写这个支持 COM 的 DLL。
  • @user18521918 如果他们想在 VBScript 中使用 Windows API,那就是过程。

标签: api vbscript window


【解决方案1】:

请注意,您的 VBScript 有错误。

VBScript 不能调用 API 调用。 VB.Net可以

将 VBScript 转换为 VB.Net

  1. 删除Set 关键字。所以只需objPlayer = createobject("Wmplayer.OCX.7")

  2. Dim 每个变量as Object,API 调用除外。

  3. 将以下行放在文件的顶部。

    Imports System
    Imports System.Runtime.InteropServices
    Public Module AnythingYouWantToCallIt
    Sub Main
    

在底部

End Sub
End Module
  1. 所有参数都必须放在括号中,包括Sub。在 VBScript 中,只有函数需要括号,而子函数不需要括号。在 VB.Net 中,函数和子函数都需要括号。

  2. 这将处理 VBScript 转换。请注意,WScript 顶级对象不可用。对于WScript.Arguments,请使用Command()

调用 API 调用

您必须使用declare 关键字。你把Declare放在Sub Main之前和Module之后。

Public Declare Function Lib "User32" GetSystemMetrics(ByVal SM as Integer) As Integer
Const SM_CXSCREEN = 0

您可以从文档中获得Declare 的函数原型。 https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getsystemmetrics

然后在你的代码中

x = GetSystemMetrics(SM_CXSCREEN)

要编译,请在命令提示符下键入修复文件名

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\vbc.exe" /target:winexe /out:"%~dp0\DeDup.exe" "%~dp0\DeDup.vb" 

这是我关于在编写 VBA 代码时将 VBA 移植到 VB.Net 的博客。记住合法的 VBScript 是合法的 VBA。 https://winsourcecode.blogspot.com

   Imports System
   Imports System.Runtime.InteropServices
   Public Module AnythingYouWantToCallIt

   Public Declare Function GetSystemMetrics Lib "User32" (ByVal SM as Integer) As Integer
   Const SM_CXSCREEN = 0

   Sub Main
       Dim X as Object
       MsgBox( "Test", 0, "Title here")
       x = GetSystemMetrics( SM_CXSCREEN )
       Msgbox(X) 
   End Sub
   End Module

【讨论】:

  • VBScript 可以通过CreateObject() 方法通过支持 COM 的 DLL 调用 API。我不确定有人问如何在 VBScript 中执行此操作会转化为在 VB.Net 中重写他们的脚本?如果他们无法访问 VB.Net 怎么办? VBScript 已融入操作系统,建议将其代码转换为 VB.Net 有点飞跃。为什么不是 Python、C++?如果他们使用 C++,他们就可以完全访问 Windows API。
  • VB.Net 已融入操作系统。每个人都可以访问 Windows 内置的编译器。 VBScript 是 99% 的 VB.Net。所以 1 搜索并将 Set 替换为空。 2Sub 调用周围加上括号。 3 使所有变量 as Object 变暗。 4 将标准的 6 行添加到文件中。 那么 VBScript 就是一个 VB.Net 程序。 VB.Net 就是这样设计的。 @user692942
  • @user692942 "C:\Windows\Microsoft.NET\Framework\v4.0.30319\vbc.exe" Windows 内置了 4 个 VB.Net (VBC.exe)、4 个 C# (CSC.exe) 和 4 个 JScript.Net (JSC.exe) 编译器。
  • 这是我关于在编写 VBA 时将 VBA 移植到 VB.Net 的博客。记住合法的 VBScript 是合法的 VBA。 winsourcecode.blogspot.com
  • @user692942 在 .Net Ver 1 Beta 中,VB.Net 和 C# 也是脚本语言。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多