【问题标题】:Sendkeys event is not detected inside the application in windows form application在 Windows 窗体应用程序的应用程序内未检测到 Sendkeys 事件
【发布时间】:2018-07-06 05:26:36
【问题描述】:

我是 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;
    }
}

【问题讨论】:

  • 那么,您是说 sendkeys 没有按照您的代码发送“Q”?
  • 是的,应用程序内部的文本框没有检测到密钥,如果我打开记事本并开始输入,那么它工作正常,如果您希望我添加应用程序的快照,那么我可以做到。
  • 自 Vista 以来,应用程序不应依赖 SendKeys 工作。您可能需要考虑 Microsoft UI 自动化

标签: c# windows winforms textbox


【解决方案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");
    }
}

【讨论】:

    【解决方案2】:

    对于 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函数使用,Keycodes可以在here找到

    【讨论】:

    • 我在 WinForms 应用程序中使用 SendKeys.Send(),如果我将光标放在记事本或任何浏览器中,键工作正常但是当我将光标放在同一个应用程序内的文本框中,然后单击该键,然后它不起作用并且光标被删除并突出显示应用程序中单击的键
    • 所以当你切换窗口时你的焦点没有设置?
    • 那我该怎么做呢?
    • @YogeshYadav - 查看我的更新答案并感谢您用 Winforms 替换 WPF 标签
    • 我试过代码它不起作用,以前在记事本或浏览器中检测到键,但现在记事本也没有检测到键
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多