【问题标题】:What is the right way to execute c# code in a powershell script?在 powershell 脚本中执行 c# 代码的正确方法是什么?
【发布时间】:2020-05-24 15:28:34
【问题描述】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      至于你在语法方面尝试了什么

      [UniversalSandbox.Form1]::button1_Click

      试图访问一个名为button1_Clickstatic (::)public成员。

      如果有这样一个方法(没有,因为(a)你已经把它变成了一个实例方法并且( b) 您已将其设为私有),不带括号访问它()(包括必需的参数)将打印方法的签名(它的返回类型、名称、参数名称和类型)而不是调用它。

      【讨论】:

        猜你喜欢
        • 2018-04-16
        • 2017-05-22
        • 1970-01-01
        • 2011-08-30
        • 1970-01-01
        • 2015-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多