none
C# Winform 按键焦点的改变

    问题

  • 我们知道在Winform中,点击键盘上的Tab键,会让按钮的焦点以Tabindex的大小顺序进行改变。我的需求是:通过C#上位机的串口获取一帧特定的数据帧,从而使得按钮的焦点发生改变。(也就是上位机读取串口数据后,就相当于在键盘上按下Tab按键)目前我获取数据帧可以实现,但是不知道通过什么命令改变按钮的焦点。试过SendKeys.Send("{TAB}"),但是没有任何反应。请诸位大神指点一二
    2015年11月19日 2:25

答案

  • 我写了个简单的程序,在Timer里面调用 SendKeys.Send("{TAB}");是可以的。

    如果你那里不行试一试使用GetNextControl取得下一个Control然后设置焦点。参考我下面的代码:

            private void timer1_Tick(object sender, EventArgs e)
            {
                //SendKeys.Send("{TAB}");
    
                Control nextControl = this.GetNextControl(GetFocusedControl(), true);
                if (nextControl == null)
                {
                    timer1.Enabled = false;
                    return;
                }
                nextControl.Select();
    
                
            }
    
            private Control GetFocusedControl()
            {
                Control focusedControl = null;
                // To get hold of the focused control:
                IntPtr focusedHandle = GetFocus();
                if (focusedHandle != IntPtr.Zero)
                    // Note that if the focused Control is not a .Net control, then this will return null.
                    focusedControl = Control.FromHandle(focusedHandle);
                return focusedControl;
            }
    
            [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)]
            internal static extern IntPtr GetFocus();

    2015年11月19日 4:00

全部回复

  • 我写了个简单的程序,在Timer里面调用 SendKeys.Send("{TAB}");是可以的。

    如果你那里不行试一试使用GetNextControl取得下一个Control然后设置焦点。参考我下面的代码:

            private void timer1_Tick(object sender, EventArgs e)
            {
                //SendKeys.Send("{TAB}");
    
                Control nextControl = this.GetNextControl(GetFocusedControl(), true);
                if (nextControl == null)
                {
                    timer1.Enabled = false;
                    return;
                }
                nextControl.Select();
    
                
            }
    
            private Control GetFocusedControl()
            {
                Control focusedControl = null;
                // To get hold of the focused control:
                IntPtr focusedHandle = GetFocus();
                if (focusedHandle != IntPtr.Zero)
                    // Note that if the focused Control is not a .Net control, then this will return null.
                    focusedControl = Control.FromHandle(focusedHandle);
                return focusedControl;
            }
    
            [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)]
            internal static extern IntPtr GetFocus();

    2015年11月19日 4:00
  • 我用SendKeys会出现如下错误:

    其他信息: SendKeys 无法在此应用程序内运行,原因是此应用程序不处理 Windows 消息。  请将此应用程序更改为可处理消息,或者使用 SendKeys.SendWait 方法。

    若使用SendWait则程序不会报错但并没有反应。您有空能帮我解释下这是什么问题吗?

    看了您的答案,我使用GetNextControl,已经可以让焦点移动到下个控件上了。然后我想请问与GetNextControl类似的,能不能运行焦点所在的控件?

    万般感谢!


    • 已编辑 安静晴天 2015年11月19日 7:40 问题解决了
    2015年11月19日 7:31