none
SendMessage怎么发不了tab键和enter键 RRS feed

  • 问题

  • 我把代码弄上来,大侠帮帮忙。。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    
    namespace 热键
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
        }
        //注册热键API
        [DllImport("user32.dll")]
        public static extern bool RegisterHotKey(IntPtr hWnd,int id,uint control,Keys vk);
        [DllImport("user32.dll")]
        public static extern bool UnregisterHotKey(IntPtr hWnd,int id);
        //注销热键API
        [DllImport("user32.dll")]
        public static extern IntPtr FindWindow(string IpClassName, string IpWindowName);
        //获取鼠标坐标API
        [DllImport("user32.dll")]
        public static extern bool GetCursorPos(ref Point lpPoing);
        //根据坐标获取窗口句柄
        [DllImport("user32")]
        private static extern IntPtr WindowFromPoint( Point Point);
        //根据句柄获得窗口类名
        [DllImport("user32.dll")]
        private static extern int GetClassName(IntPtr hWnd,StringBuilder lpString,int nMaxCount);
        //向指定窗口发送消息
        [DllImport("user32.dll")]
        private static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
    
    
        private void Form1_Load(object sender, EventArgs e)
        {
          RegisterHotKey(this.Handle,888,0,Keys.Home);
        }
    
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
          UnregisterHotKey(this.Handle, 888);
        }
    
        public void InputStr(IntPtr myIntPtr, string Input)
        {
          byte[] ch = (ASCIIEncoding.ASCII.GetBytes(Input));
          for (int i = 0; i < ch.Length; i++)
          {
            SendMessage(myIntPtr, 0X102, ch[i], 0);
          }
        }
        protected override void WndProc(ref Message m)
        {
          switch (m.Msg)
          {
            case 0x0312:
              if (m.WParam.ToString().Equals("888"))
              {
                Point defPnt = new Point();
                GetCursorPos(ref defPnt);
                IntPtr fromHandle = WindowFromPoint(defPnt);
                InputStr(fromHandle, this.textBox1.Text);
                SendMessage(fromHandle, 0X104, 0X9,0);//tab
                SendMessage(fromHandle, 0X105, 0X9, 0);//释放tab
                InputStr(fromHandle,this.textBox2.Text);
                SendMessage(fromHandle, 0X104, 0Xd, 0);//enter
                SendMessage(fromHandle, 0X105, 0Xd, 0);//释放enter
                
                StringBuilder className = new StringBuilder(256);
                GetClassName(fromHandle, className, className.Capacity);
                MessageBox.Show(fromHandle.ToString()+"类名为:"+className.ToString());
                break;
              }
              break;
          }
          base.WndProc(ref m);
        }
    
    
    
      }
    }
    
    2010年10月30日 7:09

答案

  • 既然是SendMessage,那么找对文本框的句柄很重要,我没有做代码验证,这里先猜测一下。

    发送Tab的目标句柄应该是用户名文本框的句柄,而发送Enter的目标句柄应该是密码文本框的句柄,而你的代码,无论是输入用户名、Tab、密码、回车,都是发向同一个句柄,感觉不太对。



    理解的越多,需要记忆的就越少
    2010年11月1日 7:53
    版主
  • SendKeys 内部实现不就是 SendMessage?发送 WM_CHAR 消息是唯一方法。

    楼上说的很对,检查一下句柄。还要看看文本框的设置,AcceptTab 和 AcceptEnter 是不是设置为 true,要确保他们设置为 false。


    Mark Zhou
    2010年11月1日 11:47

全部回复

  • 试试:

    System.Windows.Forms.SendKeys.Send( "{Enter}");


    http://www.cnblogs.com/2gua
    2010年10月31日 1:33
  • 同意楼上,设置你要发送文字的框焦点,然后用

    SendKeys.Send("{Enter}");

    SendKeys.Send("{Tab}");

    2010年10月31日 14:23
  • sendkeys是模拟键盘发送吧,模拟键盘就不用sendmessage了。我用sendmessage就是想实现后台输入账号密码登录;
    2010年11月1日 5:07
  • 既然是SendMessage,那么找对文本框的句柄很重要,我没有做代码验证,这里先猜测一下。

    发送Tab的目标句柄应该是用户名文本框的句柄,而发送Enter的目标句柄应该是密码文本框的句柄,而你的代码,无论是输入用户名、Tab、密码、回车,都是发向同一个句柄,感觉不太对。



    理解的越多,需要记忆的就越少
    2010年11月1日 7:53
    版主
  • SendKeys 内部实现不就是 SendMessage?发送 WM_CHAR 消息是唯一方法。

    楼上说的很对,检查一下句柄。还要看看文本框的设置,AcceptTab 和 AcceptEnter 是不是设置为 true,要确保他们设置为 false。


    Mark Zhou
    2010年11月1日 11:47