我正在尝试播放/暂停媒体,但发现了一些C#代码,但是当我尝试将其实现到我的Powershell脚本中时,什么也没发生...这是我尝试过的事情:
Add-Type @'
using System;
using System.Windows;
using System.Runtime.InteropServices;
namespace UniversalSandbox
{
public partial class Form1
{
public const int KEYEVENTF_EXTENTEDKEY = 1;
public const int KEYEVENTF_KEYUP = 0;
public const int VK_MEDIA_NEXT_TRACK = 0xB0;
public const int VK_MEDIA_PLAY_PAUSE = 0xB3;
public const int VK_MEDIA_PREV_TRACK = 0xB1;
[DllImport("user32.dll")]
public static extern void keybd_event(byte virtualKey, byte scanCode, uint flags, IntPtr extraInfo);
private void button1_Click(object sender, EventArgs e)
{
keybd_event(VK_MEDIA_PLAY_PAUSE, 0, KEYEVENTF_EXTENTEDKEY, IntPtr.Zero);
}
private void button2_Click(object sender, EventArgs e)
{
keybd_event(VK_MEDIA_PREV_TRACK, 0, KEYEVENTF_EXTENTEDKEY, IntPtr.Zero);
}
private void button3_Click(object sender, EventArgs e)
{
keybd_event(VK_MEDIA_NEXT_TRACK, 0, KEYEVENTF_EXTENTEDKEY, IntPtr.Zero);
}
}
}
'@
[UniversalSandbox.Form1]::button1_Click;
我使用[UniversalSandbox.Form1] :: button1_Click调用播放/暂停事件;但是什么也没发生...我的语法错误吗?
((我找到了C#代码here)
您的示例是Windows窗体应用。您需要添加一些额外的按钮并创建表单实例(GUI),然后单击按钮进行操作。 button1_click是您需要分配给按钮控件的事件(不能直接调用它)。下面是更新的示例。
Add-Type @'
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Runtime.InteropServices;
namespace UniversalSandbox
{
public partial class Form1 : Form
{
public const int KEYEVENTF_EXTENTEDKEY = 1;
public const int KEYEVENTF_KEYUP = 0;
public const int VK_MEDIA_NEXT_TRACK = 0xB0;
public const int VK_MEDIA_PLAY_PAUSE = 0xB3;
public const int VK_MEDIA_PREV_TRACK = 0xB1;
[DllImport("user32.dll")]
public static extern void keybd_event(byte virtualKey, byte scanCode, uint flags, IntPtr extraInfo);
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void InitializeComponent(){
var button1 = new Button();
var button2 = new Button();
var button3 = new Button();
button1.Text = "Play";
button1.Location = new Point(20, 100);
button1.Click += new EventHandler(button1_Click);
button2.Text = "Prev";
button2.Location = new Point(110, 100);
button2.Click += new EventHandler(button2_Click);
button3.Text = "Next";
button3.Location = new Point(200, 100);
button3.Click += new EventHandler(button3_Click);
this.Controls.Add(button1);
this.Controls.Add(button2);
this.Controls.Add(button3);
}
private void button1_Click(object sender, EventArgs e)
{
keybd_event(VK_MEDIA_PLAY_PAUSE, 0, KEYEVENTF_EXTENTEDKEY, IntPtr.Zero);
}
private void button2_Click(object sender, EventArgs e)
{
keybd_event(VK_MEDIA_PREV_TRACK, 0, KEYEVENTF_EXTENTEDKEY, IntPtr.Zero);
}
private void button3_Click(object sender, EventArgs e)
{
keybd_event(VK_MEDIA_NEXT_TRACK, 0, KEYEVENTF_EXTENTEDKEY, IntPtr.Zero);
}
}
}
'@ -ReferencedAssemblies System.Windows.Forms, System.Drawing
$player = [UniversalSandbox.Form1]::new()
$player.ShowDialog()
[Mike Twc's answer显示了一个有效的解决方案,它添加了代码中缺少的许多部分。
关于您尝试了什么,用语法:
[UniversalSandbox.Form1]::button1_Click
尝试访问static(::
)public名为button1_Click
的成员。
如果存在方法这样的[[方法(没有,因为(a)您将其设置为instance方法,而(b)您将其设置为私有),访问它无括号 ()
(包括必需的参数)将打印方法的签名(其返回类型,名称,参数名称和类型),而不是call。