Нажмите клавишу из другого приложения C # - PullRequest
1 голос
/ 26 ноября 2011

Я бы хотел, чтобы пользователь нажал клавишу в другом приложении.Например, в блокноте, а не в самой программе.Вот мое кодирование, в котором используется метод PostMessage для непрерывной отправки клавиши в блокнот, но, тем не менее, я хочу остановить ее при нажатии какой-либо клавиши.

using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;

       [DllImport("user32.dll")]
public static extern IntPtr FindWindow(
    string ClassName,
    string WindowName);

[DllImport("User32.dll")]
public static extern IntPtr FindWindowEx(
    IntPtr Parent,
    IntPtr Child,
    string lpszClass,
    string lpszWindows);

[DllImport("User32.dll")]
public static extern Int32 PostMessage(
    IntPtr hWnd,
    int Msg,
    int wParam,
    int lParam);

private const int WM_KEYDOWN = 0x100;

public Form1()
{
    InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
    Thread t = new Thread(new ThreadStart(Test));
    t.Start();
}

Boolean ControlKeyDown = true;

public void Test()
{
    // retrieve Notepad main window handle
    IntPtr Notepad = FindWindow("Notepad", "Untitled - Notepad");

    if (!Notepad.Equals(IntPtr.Zero))
    {
        // retrieve Edit window handle of Notepad
        IntPtr Checking = FindWindowEx(Notepad, IntPtr.Zero, "Edit", null);

        if (!Checking.Equals(IntPtr.Zero))
        {

            while (ControlKeyDown)
            {                        
                Thread.Sleep(100);

                PostMessage(Checking, WM_KEYDOWN, (int)Keys.A, 0);                                                             
            }
        }
    }
}

Следовательно, моя идея установить для ControlKeyDown значениеfalse когда пользователь нажал кнопку X в блокноте.После исследования через интернет я узнал этот код и отредактировал:

protected override void OnKeyDown(KeyEventArgs kea)
{
    if (kea.KeyCode == Keys.X)
    ControlKeyDown = false;
}

Да, этим он определенно остановит цикл, но это не так, как я хочу, так как он остановит цикл, когда пользователь нажмет X ключ к программе, но не в блокноте.Это потому, что KeyEventArgs это System.Windows.Forms.KeyEventArgs, а не Блокнот.

Нужна помощь: (

Ответы [ 2 ]

2 голосов
/ 26 ноября 2011

Я думаю, вы ищете перехват клавиатуры. См. Эту статью , это c ++, но в p / invoke вы выглядите гибкими, так что вы, вероятно, поймете, как его легко портировать.

0 голосов
/ 26 ноября 2011

Возможно, вы захотите взглянуть на функцию SetWindowsHookEx в user32.dll.

Я также использую библиотеку gma.UserActivity , чтобы сделать это в проекте.

...