【问题标题】:Creating a virtual numpad: stop form from being activated/focused创建一个虚拟小键盘:阻止表单被激活/聚焦
【发布时间】:2009-11-12 13:00:04
【问题描述】:

我想创建一个虚拟小键盘,类似于屏幕键盘。如何防止表单被激活/聚焦,以便当我按下它上的按钮时,SendKeys.Send 调用会转到正确的表单?我确定我必须为此使用非托管 API,但除此之外我什至不知道从哪里开始。感谢您的帮助!

【问题讨论】:

  • 这是适用于任何应用程序(如平板电脑上的虚拟键盘)的键盘还是仅适用于您编写的应用程序?
  • 仅适用于我编写的应用程序。我覆盖了 WndProc 方法以将 message.Result 设置为 MA_NOACTIVATE,但是当我单击按钮时,表单似乎仍在获得焦点。

标签: c# winforms


【解决方案1】:

您可以通过覆盖受保护的 CreateParams 属性来控制表单的创建方式:

protected override CreateParams CreateParams {
  get {
    var cp = base.CreateParams;
    // Configure the CreateParams structure here
    return cp;
  }
}

我建议尝试以下样式:

int WS_EX_NOACTIVATE = 0x08000000;
cp.ExStyle = cp.ExStyle | WS_EX_NOACTIVATE;

WS_EX_NOACTIVATE 样式可防止鼠标输入提供窗口焦点(例如,您可以使用它来创建类似工具提示的窗口。)

您可以将其与其他样式(如WS_EX_TOPMOST)结合使用以获得您所追求的行为。

【讨论】:

    【解决方案2】:

    没有焦点的表单通常不会接收键盘输入。所以我不确定你将如何让它发挥作用。

    【讨论】:

      【解决方案3】:

      如果小键盘只需要在您编写的应用程序中工作,您可以只跟踪最后一个具有焦点的有效输入控件。这样,您就不必担心某些事情会转移注意力。我最近做了类似的事情,将一堆 TextBoxes 的 Enter 事件订阅到同一个事件处理程序,将我的焦点控制句柄设置为 sender 参数。这种确切的方法可能不适合您,但这种方法可能会使它更容易。

      【讨论】:

        【解决方案4】:

        对于您编写的应用程序,请考虑观察者模式。

        在一般情况下,您可以向您的键盘添加一个订阅方法,该方法接受一个委托(也允许取消订阅)。对于您的按键事件处理,循环遍历所有订阅的委托,向其发送字符代码。

        代码(大部分来自内存,sn-ps 可能无法编译,但应该可以帮助您)

        delegate void KeyPadSubscription (char keyPressed);
        List<KeyPadSubscription> subscriptions;
        
        void KeyPress (object sender, KeyPressArgs e)
        {
           foreach (KeyPadSubscription sub in subscriptions)
                sub (e.CharCode)
        }
        
        void Subscribe(KeyPadSubscription s)
        {
            subscriptions.Add(s);
        }
        
        void Unsubscribe(KeyPadSubscription s)
        {
            subscriptions.Remove(s);
        }
        

        在您的情况下,您可能不需要委托列表,一个属性就足够了。然后,当您的表单更改焦点时,活动表单会将其方法设置为您的键盘的委托。

        void MyForm_Activated(...)
        {
            //assumes keypad is global or static
            KeyPad.Subsribe (this.HandleKeyPadPress)
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-07-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多