使用c# /Windows API的虚拟键盘-发送键输入,但不要抓取焦点

本文关键字:输入 焦点 抓取 -发 Windows API 键盘 虚拟 使用 | 更新日期: 2023-09-27 17:50:38

我正在用c#构建一个定制的虚拟键盘。

要点是发送一个特定的按键到当前有焦点的窗口。但是,通常情况下,虚拟键盘上的键会在按下后获得焦点。

我假设某种Windows API应该用于此目的。如果是,是哪一个,如果不是,正确的做法是什么?

使用c# /Windows API的虚拟键盘-发送键输入,但不要抓取焦点

关于这个主题有一个很好的资源:http://www.yortondotnet.com/2006/11/on-screen-keyboards.html

基本上,创建一个表单并为键使用标签而不是按钮。您需要重写CreateParams来设置正确的样式。您还必须重写WndProc并过滤掉通常向表单发送焦点的消息。然后将单击事件添加到标签中,并使用SendKeys.Send(keyPressed);将实际击键发送到具有焦点的窗口。

以下是链接中的相关代码:

    private const int WS_EX_NOACTIVATE = 0x08000000;
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams createParams = base.CreateParams;
            createParams.ExStyle = createParams.ExStyle | WS_EX_NOACTIVATE;
            return createParams;
        }
    }
    private const int WM_MOUSEACTIVATE = 0x0021;
    private const int MA_NOACTIVATE = 0x0003;
    protected override void WndProc(ref Message m)
    {
        //If we're being activated because the mouse clicked on us...
        if (m.Msg == WM_MOUSEACTIVATE)
        {
            //Then refuse to be activated, but allow the click event to pass through (don't use MA_NOACTIVATEEAT)
            m.Result = (IntPtr)MA_NOACTIVATE;
        }
        else
            base.WndProc(ref m);
    }

我在面板(键)中使用面板(键),并使用自定义绘画例程在中心绘制文本。

点击事件SendKeys.Send("1");等

这是一个10键控制,所以连接事件是非常容易的。

不需要处理任何窗口消息,它工作得很好。我在10键上没有任何聚焦问题,输入被发送到光标所在的位置。简单。