Как правильно выполнить код c# в сценарии powershell? - PullRequest
0 голосов
/ 09 февраля 2020

Я пытаюсь воспроизвести / приостановить воспроизведение мультимедиа и обнаружил некоторый код 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# код здесь )

Ответы [ 2 ]

0 голосов
/ 09 февраля 2020

Ваш пример - приложение Windows Forms. Вам нужно добавить несколько дополнительных кнопок и создать экземпляр формы (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 голосов
/ 09 февраля 2020

Ответ Майка Тв c показывает эффективное решение, которое добавляет множество фрагментов, отсутствующих в вашем коде.

Что касается того, что вы пытались в * синтаксис :

[UniversalSandbox.Form1]::button1_Click

пытается получить доступ к stati c (::) publi c член с именем button1_Click.

Если бы были такой метод (нет, потому что (a) вы сделали это экземпляр метод и (б) вы сделали его приватным), доступ к нему без скобок () (включая необходимые аргументы) напечатает подпись метода (его возвращаемый тип, имя, имена и типы параметров), а не вызов it.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...