在Windows窗体应用程序的应用程序内部未检测到Sendkeys事件

时间:2018-07-06 05:26:36

标签: c# windows winforms textbox

我是Windows应用程序开发的新手。我正在开发Windows窗体应用程序,其布局如下:

有一个文本框,我已经使用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 :(得分:1)

当然,它不适用于您的窗口。您设置了 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");
    }
}

答案 1 :(得分:0)

对于WPF应用程序,必须使用SendKeys.SendWait()method

SendKeys.SendWait("Q")

SendKeys.Send()将适用于WinForm应用程序。

另一个选择是使用WinAPI而不是SendKeys。更多信息here

编辑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函数使用,可以找到here