在powershell脚本中执行c#代码的正确方法是什么?

问题描述 投票:0回答:2

我正在尝试播放/暂停媒体,但发现了一些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

c# winforms powershell
2个回答
0
投票

您的示例是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()

0
投票

[Mike Twc's answer显示了一个有效的解决方案,它添加了代码中缺少的许多部分。

关于您尝试了什么,用语法

[UniversalSandbox.Form1]::button1_Click

尝试访问static::public名为button1_Click的成员。

如果存在方法这样的[[方法(没有,因为(a)您将其设置为instance方法,而(b)您将其设置为私有),访问它无括号 ()(包括必需的参数)将打印方法的签名(其返回类型,名称,参数名称和类型),而不是call

© www.soinside.com 2019 - 2024. All rights reserved.