none
点击按钮,光标不改变 RRS feed

  • 问题

  • 我想做一个类似软键盘的功能,就是里面是储存的是一些特殊字符,当自己点击时,把当前按钮对应的特殊字符发送到当前光标处.
    我该怎么实现呢,我试用了SendKeys方法,但是在点击按钮时老是发送不了,不过通过光标停留在按钮上门触发事件就可以发送了
    2009年8月31日 5:42

答案

  • 你好!
         找了半天,终于找到你的这个帖子了,这几天一直在想这个问题,后来请教了一个朋友,
        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"); } }
    这个问题成功解决了,现在把代码分享给你,希望对你有帮助:

    周雪峰
    • 已标记为答案 石建雄 2009年9月10日 14:08
    2009年9月8日 12:11
    版主

全部回复

  • 什么意思,没有明白!
    2009年8月31日 6:13
  • 通过 SelectionStart 这个属性来做,点击按钮 TextBox.SelectionStart 位置插入你的字符串,并重新设置 TextBox.SelectionStart 和重新将 TextBox 设为焦点 TextBox.Focus();
    知识改变命运,奋斗成就人生!
    2009年8月31日 6:22
    版主
  • 就像电脑上的小键盘一样,如果打开一个word文档,且焦点在word上面,如果点击里面的按钮就发送该按钮对应的字符串到word文档里面,但是光标的焦点还是在word文档里面
    2009年8月31日 6:22
  • 小键盘上点击一个字符按钮时,将字符传到文档上面显示这个并不难,等显示的代码结束后,加一个显示部分获取焦点就可以了!
    2009年8月31日 6:25
  • 能不能给点具体的代码啊,我才刚接触C#不久
    2009年8月31日 6:26
  • private void buttonX1_Click(object sender, EventArgs e)
            {
                textBoxX1.Text += "字符";
                textBoxX1.Focus();
                textBoxX1.SelectionStart = textBoxX1.Text.Length;
            }
    2009年8月31日 6:34
  • 这个是不是只能对本身的程序有效呢,如果另外一个应用程序怎么获得焦点呢

    2009年8月31日 6:43
  • 这个例子已经下载下来了,但还是看不大明白
    2009年8月31日 7:51
  • 你好!
         可以使用SendKeys的Send方法来实现这个目的,这个方法可以向活动的应用程序发送一个按键:
         SendKeys.Send("A");
    周雪峰
    2009年8月31日 13:50
    版主
  • 周老师你好,我有试过用SendKeys这个方法,但是,在button点击的时候焦点就已经改变了.所以不能发送到原来的焦点处,有什么办法可以解决嘛
    2009年8月31日 14:49
  • 刚才试了一下,输入焦点始终没有处理好,这是我的思路,希望大家指教啊!
    using System;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using System.Threading;
    
    namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {
            [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
            private static extern IntPtr GetForegroundWindow();   //WINAPI 获取当前活动窗体的句柄
            [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
            private static extern bool SetForegroundWindow(IntPtr hWnd); //WINAPI 设置当前活动窗体的句柄
            
            private IntPtr activeWindowsHandle;
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                
                SendKeys.Send("A");
            }
    
            private void form1_Deactive(object sender, EventArgs e)
            {
                activeWindowsHandle = GetForegroundWindow();             
            }
    
            private void form1_Activated(object sender, EventArgs e)
            {
                SetForegroundWindow(activeWindowsHandle);
            }
        }
    }

    周雪峰
    2009年8月31日 15:03
    版主
  • 试了下这段代码,好像焦点有时候还是会停留在原焦点,有时候又不会.但SendKeys 还是没有发送出文字来,大家还有没有方法控制原来的焦点不改变.
    希望大家帮帮忙
    2009年8月31日 15:18
  • 不知道用SendMessage的方法行不行,SendMessge的方法参数有点复杂,我搞不明白
    2009年8月31日 15:19
  • SendMessage面临同样的问题,也是需要处理输入焦点的!
    我上面的方法行不通,我正在考虑其他的办法!
    周雪峰
    2009年8月31日 16:04
    版主
  • 先谢谢了

    2009年9月1日 1:32
  • 你好!
         找了半天,终于找到你的这个帖子了,这几天一直在想这个问题,后来请教了一个朋友,
        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"); } }
    这个问题成功解决了,现在把代码分享给你,希望对你有帮助:

    周雪峰
    • 已标记为答案 石建雄 2009年9月10日 14:08
    2009年9月8日 12:11
    版主
  • 周老师:

          你好,非常感谢你!我以为你已经大家都不会在来回复这个问题,你真的很让我感动.用您上面的方法问题解决了,再次感谢!

    • 已标记为答案 石建雄 2009年9月10日 14:07
    • 取消答案标记 石建雄 2009年9月10日 14:08
    2009年9月10日 14:03
  • 不用客气啊!我试了多种方法都行不通,后来请教了一个朋友才知道这种方法!
    周雪峰
    2009年9月11日 5:14
    版主
  • 周老师你好,
          我还想问你几个问题,我有一个TabControl里面有TablePage1和TablePage2。TablePage1里面放了个TextBox,TablePage2放了一些特殊字符(目的就是当用户点击就把字符发送到当前电脑的焦点处)。现在的问题是,当我把窗体设置成WS_EX_NOACTIVATE样式后,在TablePage1的TextBox中也不能输入文字了。
          我试了把 一个窗体设置成WS_EX_NOACTIVATE样式后
    ,做成个单独的控件放入TablePage2。但是只要是Form中的不设置成那种样式就不能向当前电脑焦点处发送字符。请问下怎样可以解决?谢谢。
         
    2009年9月21日 5:36
  • 你好!
         可以尝试使用this.Activate();重新激活窗体!
    周雪峰
    2009年9月21日 5:53
    版主
  • 改好了,再次感谢!
    2009年9月21日 6:14
  • 不客气啊!
    周雪峰
    2009年9月21日 10:35
    版主