小弟用c# (.net2005)写了个P2P聊天程序,类似QQ的界面,支持点发送按钮发送消息和按CTRL+ENTER发送消息。
可是现在小弟碰到个难题困扰了几天了,就是点发送一切正常,而CTRL+ENTER发送消息后(完全调用点发送按钮那个事件)会莫名的空出第一行(焦点定位在第二行,以后按Ctrl+Enter发送一直定位在第二行),而用ALT+ENTER或SHIFT+ENTER却没这个毛病,是不是CTRL+ENTER会强制先获得焦点再换一行??难道是WINDOWS本身的设定么?怎么改呢?
大概代码如下
private void rTSend_KeyDown(object src, KeyEventArgs a)
        {
            if (a.KeyCode == Keys.Enter && a.Control) 
            {
                
                button1_Click(this, new EventArgs());
            }        }
button1_Click中关键代码是
  TcpClient tcpClient = new TcpClient(tBIP.Text, tBPort.Text);                NetworkStream tcpStream = tcpClient.GetStream(); //获得网络访问的数据流                StreamWriter streamW = new StreamWriter(tcpStream);
                streamW.Write(msg); //将字符串写入流                streamW.Flush();    //将缓冲区数据写入网络流                tcpStream.Close();  //关闭网络流                tcpClient.Close();  //关闭连接                this.rTRe.AppendText(msg);
                
                this.rTSend.Clear();//最后两行用于清空输入筐并获得焦点,可能问题就在这
                
                this.rTSend.Focus();

解决方案 »

  1.   

    第一次按ctrl+enter能调用函数么?
    并且看看是不是两个ctrl都一样
      

  2.   

    回二楼的话
    1.第一次就能调用
    2.两个CTRL都一样。而且不可能是我个人的键盘问题,别人用也一样。是不是CTRL和SHIFT以及ALT作为keydown事件的辅助参数,本身的性能就有区别?
    还是要使用keyPress或者keyUp事件完善组合键的输入?
    实在百思不得其解
      

  3.   

    好像应该覆写ProcessCmdKey方法,在那里判断。
      

  4.   

    protected override bool IsInputKey(Keys keyData)
    {
          if (((keyData & Keys.Control) == Keys.None))
          {
                Keys keys1 = keyData & Keys.KeyCode;
                if (keys1 == Keys.Return)
                {
                      return this.acceptsReturn;
                }
          }
          return base.IsInputKey(keyData);
    }
      

  5.   

    如下的就不会处理这个Control+Enter了:using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Text;
    using System.Windows.Forms;
    using System.Collections;namespace treeViewApp
    {
    public partial class UserControl1 : RichTextBox
    {
    public UserControl1()
    {
    InitializeComponent();
    } protected override bool ProcessDialogKey(Keys keyData)
    {
    if (((keyData & Keys.Control) == Keys.Control))
    {
    Keys keys1 = keyData & Keys.KeyCode;
    if (keys1 == Keys.Return)
    {
    return true;
    }
    }
    return base.ProcessDialogKey(keyData);
    }
    }
    }