Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C#/Windows API的虚拟键盘-发送按键输入,但不';不要抓住焦点_C#_.net_Winapi_Virtual Keyboard - Fatal编程技术网

使用C#/Windows API的虚拟键盘-发送按键输入,但不';不要抓住焦点

使用C#/Windows API的虚拟键盘-发送按键输入,但不';不要抓住焦点,c#,.net,winapi,virtual-keyboard,C#,.net,Winapi,Virtual Keyboard,我正在用C#构建一个定制的虚拟键盘 要点是向当前有焦点的窗口发送特定的按键。但是,通常情况下,虚拟键盘上的键在按下后会抓住焦点 我假设应该为此使用某种Windows API。如果是,哪一个,如果不是,正确的方法是什么?这里有一个关于这个主题的好资源: 基本上,创建一个表单并为键使用标签,而不是按钮。您需要重写CreateParams以设置正确的样式。您还必须覆盖WndProc并过滤掉通常向表单发送焦点的消息。然后将单击事件添加到标签中,并使用SendKeys.Send(按键)将实际击键发送到具有

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

要点是向当前有焦点的窗口发送特定的按键。但是,通常情况下,虚拟键盘上的键在按下后会抓住焦点


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

这里有一个关于这个主题的好资源:

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

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

    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);
    }

以下是有关此主题的好资源:

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

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

    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);
    }
我在面板(keyb)中使用面板(用于关键点)和自定义绘制例程来在中心绘制文本

单击事件为SendKeys.Send(“1”);等等

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

不必处理任何窗口消息,效果很好。我对10键没有任何焦点问题,输入被发送到光标所在的位置。简单。

我使用面板(键B)中的面板(用于键)和自定义绘制例程在中间绘制文本

单击事件为SendKeys.Send(“1”);等等

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


不必处理任何窗口消息,效果很好。我对10键没有任何焦点问题,输入被发送到光标所在的位置。简单。

处理此类问题的最佳方法是提供一种选择要将输入发送到的进程的方法。处理此类问题的最佳方法是提供一种选择要将输入发送到的进程的方法。