Событие Sendkeys не обнаружено внутри приложения в приложении Windows Form. - PullRequest
0 голосов
/ 06 июля 2018

Я новичок в разработке приложений для Windows. Я разрабатываю приложение Windows Form, в котором макет выглядит следующим образом:

Существует одно текстовое поле, и я создал клавиатуру внутри приложения, используя событие SendKeys.

Проблема в том, что все другие приложения в системе могут определять ключи, но текстовое поле внутри приложения не может обнаружить ключи.

В основном приложение имеет полноценную клавиатуру, это всего лишь одна кнопка, нажмите код

Что я пробовал:

public partial class Form1 : Form
{
    Control focusedC;
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams param = base.CreateParams;
            param.ExStyle |= 0x08000000;
            return param;
        }
    }

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        FormBorderStyle = FormBorderStyle.None;
        WindowState = FormWindowState.Maximized;
        TopMost = true;
    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Escape) {
            FormBorderStyle = FormBorderStyle.Sizable;
            WindowState = FormWindowState.Normal;
            TopMost = false;
        }
    }

    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        //checkbox is for CapsLock Key
    }

    private void button14_Click(object sender, EventArgs e)
    {
        if (checkBox1.Checked && focusedC != null)
        {
            focusedC.Focus();
            SendKeys.Send("Q");
        }
        else if(focusedC != null)
        {
            focusedC.Focus();
            SendKeys.Send("q");
        }
    }
    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        focusedC = sender as TextBox;
    }
}

Ответы [ 2 ]

0 голосов

Конечно, это не работает на вашем окне. Вы устанавливаете стиль WS_EX_NOACTIVATE ! Это работает на других окнах, но не на вашем, очевидно. Если вы хотите, чтобы он работал на вашем текстовом поле , удалите или прокомментируйте эту строку

param.ExStyle |= 0x08000000;

и он будет отлично работать в окне вашего приложения не другие:

private void button14_Click(object sender, EventArgs e)
{
    if (checkBox1.Checked)
    {
        textBox1.Focus();
        SendKeys.Send("Q");
    }
    else
    {
        textBox1.Focus();
        SendKeys.Send("q");
    }
}
0 голосов
/ 06 июля 2018

Для приложений WPF необходимо использовать SendKeys.SendWait () метод .

SendKeys.SendWait("Q")

SendKeys.Send() будет работать для приложений WinForm.

Другой вариант - использовать WinAPI вместо SendKeys. Больше информации здесь

Редактировать 1

Control focusedC;

//Enter event handler for your TextBox

private void textBox1_TextChanged(object sender, EventArgs e)
{
    focusedC = sender as TextBox;
}

//Click event handler 
private void  button14_Click(object sender, EventArgs e)
{
    if (focusedC != null)
    {
        focusedC.Focus();
        SendKeys.Send("Q");
    }
}

Редактировать 2: Использование WinAPI

[DllImport("user32.dll")]
static extern void SendInput(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);
  public static void PressKey(byte keyCode)
    {
        const int KEYEVENTF_EXTENDEDKEY = 0x1;
        const int KEYEVENTF_KEYUP = 0x2;
        SendInput((byte)keyCode, 0x45, KEYEVENTF_EXTENDEDKEY, 0);
        SendInput((byte)keyCode, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);

    }

Используйте, вызывая функцию PressKey, и коды клавиш можно найти здесь

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