none
关于软键盘窗体的问题! RRS feed

  • 问题

  • 有VS2008做了一个软键盘可是,窗体焦点问题一直无法解决!请问怎么做才能像QQ这样的软键盘?
    2010年4月16日 2:05

答案

  • 我用的是VB.net


    您不早说呢。:-) 雪峰的思路是对的。至于VB.NET的代码:

    Public Partial Class Form1
     Inherits Form
     Protected Overrides ReadOnly Property CreateParams() As CreateParams
     Get
      Dim cp As CreateParams = MyBase.CreateParams
      cp.ExStyle = cp.ExStyle Or CInt(&H8000000L)
      '把窗体设置成WS_EX_NOACTIVATE样式
      Return cp
     End Get
     End Property
     Public Sub New()
     Me.TopMost = True
     InitializeComponent()
     End Sub
    
     Private Sub button1_Click(sender As Object, e As EventArgs)
     SendKeys.Send("A")
     End Sub
    End Class
    

    网上有很多C#和VB.NET互转的工具,搜一下就有。上面的代码就是用工具直接把雪峰的C#代码转过来的。


    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    If you have any feedback, please tell us.

    The All-In-One Code Framework Project
    My Blog (in Simplified Chinese)
    2010年12月29日 5:30

全部回复

  • 用一个全局的鼠标钩子,当屏幕键盘获取焦点是 调用SetWindowLong API

    这篇blog 讲的很详细: http://www.cnblogs.com/youzai/archive/2008/05/19/1202732.html (我这边貌似打不开 http://www.qqread.com/csharp/p411330_4.html 是完全引用那篇blog的)


    Please remember to click “Mark as Answer” on the post that helps you, and to click “Unmark as Answer” if a marked post does not actually answer your question. This can be beneficial to other community members reading the thread.
    2010年4月22日 3:46
  • 你好!

    大体思路是这样的:
    按键可以使用SendKeys.Send()方法来模拟,主要的难点是输入焦点的处理!
    默认情况下,如果你点击屏幕键 盘上的按钮,则你的窗体会获得输入焦点,你要输入文字的那个窗体会失去输入焦点,这样也就没有办法输入文字了!
    对于这个问题,我们可以通过重写窗 体的CreateParams属性,把窗体的扩展样式设置成WS_EX_NOACTIVATE,这样按下窗体上的按钮的时候就不会获得输入焦点了,具体事 例代码如下:

      public partial class Form1 : Form
      {
        protected override CreateParams CreateParams
        {
          get
          {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= (int)0x08000000L;   //把窗体设置成WS_EX_NOACTIVATE样式
             return cp;
          }
        }
        public Form1()
        {
          this.TopMost = true;
          InitializeComponent();
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
          SendKeys.Send("A");
        }
      }

     


    周雪峰
    2010年4月23日 7:38
    版主
  • 我用的是VB.net
    2010年12月29日 3:49
  • 我用的是VB.net


    您不早说呢。:-) 雪峰的思路是对的。至于VB.NET的代码:

    Public Partial Class Form1
     Inherits Form
     Protected Overrides ReadOnly Property CreateParams() As CreateParams
     Get
      Dim cp As CreateParams = MyBase.CreateParams
      cp.ExStyle = cp.ExStyle Or CInt(&H8000000L)
      '把窗体设置成WS_EX_NOACTIVATE样式
      Return cp
     End Get
     End Property
     Public Sub New()
     Me.TopMost = True
     InitializeComponent()
     End Sub
    
     Private Sub button1_Click(sender As Object, e As EventArgs)
     SendKeys.Send("A")
     End Sub
    End Class
    

    网上有很多C#和VB.NET互转的工具,搜一下就有。上面的代码就是用工具直接把雪峰的C#代码转过来的。


    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    If you have any feedback, please tell us.

    The All-In-One Code Framework Project
    My Blog (in Simplified Chinese)
    2010年12月29日 5:30
  • 你好

    感谢楼上的大拿所给的代码片段。蓝龙科技,如你有任何问题,欢迎继续询问。

    与此同时,微软一站式示例代码库项目组将会为你编写一个完整的软键盘示例代码,并通过一站式示例代码库的每月更新提供给你。关于我们的示例代码请求服务的介绍,请参见http://www.cnblogs.com/Jialiang/archive/2010/10/28/MSSampleRequestService.html。 谢谢。


    Regards,
    Jialiang Ge
    MSDN Subscriber Support in Forum
    If you have any feedback of our support, please contact msdnmg@microsoft.com.
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    2010年12月30日 3:46