Как я могу отправить нажатие клавиши в другое приложение Windows? - PullRequest
0 голосов
/ 21 сентября 2018

В этой части из класса я фиксирую все окна рабочих процессов:

private static bool EnumWindowsCallback(IntPtr hWnd, IntPtr lParam)
        {
            bool specialCapturing = false;

            if (hWnd == IntPtr.Zero) return false;

            if (!IsWindowVisible(hWnd)) return true;

            if (!countMinimizedWindows)
            {
                if (IsIconic(hWnd)) return true;
            }
            else if (IsIconic(hWnd) && useSpecialCapturing) specialCapturing = true;

            if (GetWindowText(hWnd) == PROGRAMMANAGER) return true;

            if (GetWindowText(hWnd).Contains("Test"))
                windowSnaps.Add(new WindowSnap(hWnd, specialCapturing));

            return true;
        }

        /// <summary>
        /// Get the collection of WindowSnap instances fro all available windows
        /// </summary>
        /// <param name="minimized">Capture a window even it's Minimized</param>
        /// <param name="specialCapturring">use special capturing method to capture minmized windows</param>
        /// <returns>return collections of WindowSnap instances</returns>
        public static WindowSnapCollection GetAllWindows(bool minimized, bool specialCapturring)
        {
            windowSnaps = new WindowSnapCollection();
            countMinimizedWindows = minimized;//set minimized flag capture
            useSpecialCapturing = specialCapturring;//set specialcapturing flag
            EnumWindowsCallbackHandler callback = new EnumWindowsCallbackHandler(EnumWindowsCallback);
            EnumWindows(callback, IntPtr.Zero);

            return new WindowSnapCollection(windowSnaps.ToArray(), true);
        }

В конце у меня в windowSnaps, например, два элемента, два окна приложений с именем Test.

В Form1:

private void buttonSnap_Click(object sender, EventArgs e)
        {
            this.listBoxSnap.Items.Clear();
            this.pictureBoxSnap.Image = null;
            this.listBoxSnap.Items.AddRange
                (
            WindowSnap.GetAllWindows(this.checkBoxMinimized.Checked, this.checkBoxSpecialMode.Checked).ToArray()
                );
        }

Теперь в listBox (listBoxSnap) я хочу сделать это, когда я выбираю один из элементов, например, элемент в индексе 0 автоматически отправляет в это приложение нажатие клавиши,Например, отправьте в это конкретное окно приложения комбинацию клавиш ctrl + s, но не перемещайте окно приложения на передний план или не фокусируйте его.

ОБНОВЛЕНИЕ, что я пытался:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

namespace MinimizeCapture
{
    public partial class Form1 : Form
    {
        [DllImport("user32.dll")]
        static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
        [DllImport("user32.dll")]
        static extern bool SetForegroundWindow(IntPtr hWnd);

        // windows messages
        const int WM_KEYDOWN = 0x100;
        const int WM_KEYUP = 0x101;

        // "Ctrl key" virtual key-code
        const int VK_CONTROL = 0x11;

        public Form1()
        {
            InitializeComponent();
        }

        private void buttonSnap_Click(object sender, EventArgs e)
        {
            this.listBoxSnap.Items.Clear();
            this.pictureBoxSnap.Image = null;
            this.listBoxSnap.Items.AddRange
                (
            WindowSnap.GetAllWindows(this.checkBoxMinimized.Checked, this.checkBoxSpecialMode.Checked).ToArray()
                );
        }

        private void listBoxSnap_SelectedIndexChanged(object sender, EventArgs e)
        {
            WindowSnap snap = this.listBoxSnap.SelectedItem as WindowSnap;

            this.pictureBoxSnap.Image = snap.Image;


            SetForegroundWindow(snap.Handle);

            // hWnd is a handle of a window which should receive Ctrl+S
            SendMessage(snap.Handle, WM_KEYDOWN, VK_CONTROL, 0);
            SendMessage(snap.Handle, WM_KEYDOWN, (int)'s', 0);
            SendMessage(snap.Handle, WM_KEYUP, (int)'s', 0);
            SendMessage(snap.Handle, WM_KEYUP, VK_CONTROL, 0);

        }

Строка:

SetForegroundWindow(snap.Handle);

Вывод выбранного окна на передний план, но Ctrl + s, кажется, не влияет наокно вообще.

1 Ответ

0 голосов
/ 21 сентября 2018

Насколько я вижу из ваших комментариев, вам нужно отправить Ctrl+S нажатие клавиши в другое окно.Если это так, вам нужно использовать SendMessage WinAPI с WM_KEYDOWN и WM_KEYUP сообщениями.

Я предполагаю, что вы уже знаете, как получить дескриптор окна, поэтому проверьте этот код:

[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);

// windows messages
const int WM_KEYDOWN = 0x100;
const int WM_KEYUP = 0x101;

// "Ctrl key" virtual key-code
const int VK_CONTROL = 0x11;

// hWnd is a handle of a window which should receive Ctrl+S
SendMessage(hWnd, WM_KEYDOWN, VK_CONTROL, 0);
SendMessage(hWnd, WM_KEYDOWN, (int)'s', 0);
SendMessage(hWnd, WM_KEYUP, (int)'s', 0);
SendMessage(hWnd, WM_KEYUP, VK_CONTROL, 0);

Обратите внимание : окно, которое должно получить это сообщение, должно быть в фокусе!

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