c# winformQQ自动回复机器人,可以自定义回复话术

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace QQGG
{
    public partial class Form1 : Form
    {

        //import win32api
        //import win32con
        //win32api.keybd_event(17,0,0,0)  #ctrl键位码是17
        //win32api.keybd_event(86,0,0,0)  #v键位码是86
        //win32api.keybd_event(86,0,win32con.KEYEVENTF_KEYUP,0) #释放按键
        //win32api.keybd_event(17,0,win32con.KEYEVENTF_KEYUP,0)

        //附个键位码表:
        //字母和数字键     数字小键盘的键       功能键         其它键 
        //      键   键码   键   键码     键   键码    键      键码 
        //      A   65       0   96        F1   112     Backspace    8 
        //      B   66       1   97        F2   113     Tab       9 
        //      C   67       2   98        F3   114     Clear      12 
        //      D   68       3   99        F4   115     Enter      13 
        //      E   69       4   100       F5   116     Shift      16 
        //      F   70       5   101       F6   117     Control     17 
        //      G   71       6   102       F7   118      Alt       18 
        //      H   72       7   103       F8   119     Caps Lock    20 
        //      I   73       8   104       F9   120     Esc       27 
        //      J   74       9   105       F10  121     Spacebar    32 
        //      K   75       *   106       F11  122     Page Up     33 
        //      L   76       +   107       F12  123     Page Down    34 
        //      M   77       Enter 108       --   --      End       35 
        //      N   78       -   109       --   --       Home      36 
        //      O   79       .   110       --   --      Left Arrow   37 
        //      P   80       /   111       --   --      Up Arrow    38 
        //      Q   81       --   --       --   --      Right Arrow   39 
        //      R   82       --   --       --   --      Down Arrow    40 
        //      S   83       --   --       --   --      Insert      45 
        //      T   84       --   --       --   --      Delete      46 
        //      U   85       --   --       --   --      Help       47 
        //      V   86       --   --       --   --      Num Lock     144 
        //      W   87          
        //      X   88      
        //      Y   89      
        //      Z   90      
        //      0   48      
        //      1   49      
        //      2   50       
        //      3   51       
        //      4   52       
        //      5   53       
        //      6   54       
        //      7   55       
        //      8   56       
        //      9   57

        //这个函数在user32.dll这个库文件里面。我们可以在C:\WINDOWS\system32(XP系统)这个目录下找到这个文件,他是系统自带的。 我们以C#直接调用这个文件中的API为例子来说下怎么进行鼠标操作,首先在我们C#中声明引用,如果是一个基于From的程序,这个声明的位置写在你的From class就可以了 
        //[System.Runtime.InteropServices.DllImport("user32")] 
        //private static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo); 

        //参数 意义 
        //dwFlags Long,下表中标志之一或它们的组合 
        //dx,dy Long,根据MOUSEEVENTF_ABSOLUTE标志,指定x,y方向的绝对位置或相对位置 
        //cButtons Long,没有使用 
        //dwExtraInfo Long,没有使用 

        //dwFlags常数 意义 

        //const int MOUSEEVENTF_MOVE = 0x0001;      移动鼠标 
        //const int MOUSEEVENTF_LEFTDOWN = 0x0002; 模拟鼠标左键按下 
        //const int MOUSEEVENTF_LEFTUP = 0x0004; 模拟鼠标左键抬起 
        //const int MOUSEEVENTF_RIGHTDOWN = 0x0008; 模拟鼠标右键按下 
        //const int MOUSEEVENTF_RIGHTUP = 0x0010; 模拟鼠标右键抬起 
        //const int MOUSEEVENTF_MIDDLEDOWN = 0x0020; 模拟鼠标中键按下 
        //const int MOUSEEVENTF_MIDDLEUP = 0x0040; 模拟鼠标中键抬起 
        //const int MOUSEEVENTF_ABSOLUTE = 0x8000; 标示是否采用绝对坐标 


        //程序中我们直接调用mouse_event函数就可以了 
        //mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 500, 500, 0, 0); 

        //1、这里是鼠标左键按下和松开两个事件的组合即一次单击: 
        //mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 ) 

        //2、模拟鼠标右键单击事件: 
        //mouse_event (MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0 ) 

        //3、两次连续的鼠标左键单击事件 构成一次鼠标双击事件: 
        //mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 ) 
        //mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 ) 

        //4、使用绝对坐标 
        //MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 500, 500, 0, 0 

        //需要说明的是,如果没有使用MOUSEEVENTF_ABSOLUTE,函数默认的是相对于鼠标当前位置的点,如果dx,和dy,用0,0表示,这函数认为是当前鼠标所在的点。5、直接设定绝对坐标并单击 
        //mouse_event(MOUSEEVENTF_LEFTDOWN, X * 65536 / 1024, Y * 65536 / 768, 0, 0); 
        //mouse_event(MOUSEEVENTF_LEFTUP, X * 65536 / 1024, Y * 65536 / 768, 0, 0); 
        //其中X,Y分别是你要点击的点的横坐标和纵坐标 

        //而键盘模拟用 Keybd_event() 

        //Keybd_event能触发一个按键事 件,也就是说回产生一个WM_KEYDOWN或WM_KEYUP消息。当然也可以用产生这两个消息来模拟按键,但是没有直接用这个函数方便。 Keybd_event共有四个参数,第一个为按键的虚拟键值,如回车键为vk_return, tab键为vk_tab。第二个参数为扫描码,一般不用 设置,用0代替就行。第三个参数为选项标志,如果为keydown则置0即可,如果为keyup则设成“KEYEVENTF_KEYUP”,第四个参数一 般也是置0即可。


        [DllImport("user32.dll", EntryPoint = "FindWindow")]
        private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("user32.dll")]
        private static extern int GetWindowText(IntPtr hwnd, StringBuilder lpString, int cch);

        [DllImport("user32.dll", EntryPoint = "SetWindowPos", SetLastError = true)]
        private static extern bool SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);



        private string className, windowText;
        private IntPtr qqWindowHwnd;


        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        public bool IsTargetShow
        {
            get
            {
                qqWindowHwnd = FindWindow(className, windowText);
                if (qqWindowHwnd != IntPtr.Zero) //找到目标窗口
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }
        /// <summary>
        /// 设置鼠标位置
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        static extern bool SetCursorPos(int x, int y);

        [DllImport("user32.dll")]
        static extern bool mouse_event(int dwFlags, int dx, int dy, int dwData, UInt64 dwExtraInfo);

        [DllImport("user32.dll", EntryPoint = "keybd_event")]
        public static extern void keybd_event(byte bVk, //虚拟键值     
            byte bScan,// 一般为0      
            int dwFlags, //这里是整数类型 0 为按下,2为释放      
            int dwExtraInfo //这里是整数类型 一般情况下设成为0      
            );

        public void SendDoubleClick(int x, int y)
        {
            SetCursorPos(x, y);
            mouse_event(0x2, 0, 0, 0, 0);
            mouse_event(0x4, 0, 0, 0, 0);
            YanShi.Delay(10);
            mouse_event(0x2, 0, 0, 0, 0);
            mouse_event(0x4, 0, 0, 0, 0);
        }

        public void SendClick(int x, int y)
        {
            SetCursorPos(x, y);
            mouse_event(0x2, 0, 0, 0, 0);
            mouse_event(0x4, 0, 0, 0, 0);
        }

        public void SendPaste()
        {
            keybd_event(17, 0, 0, 0);
            keybd_event(86, 0, 0, 0);
            keybd_event(86, 0, 2, 0);
            keybd_event(17, 0, 2, 0);
        }

        public void SendEnter()
        {
            keybd_event(13, 0, 0, 0);

            keybd_event(13, 0, 2, 0);
        }

        public void SendDown()
        {
            keybd_event(40, 0, 0, 0);
            keybd_event(40, 0, 2, 0);
            YanShi.Delay(10);
        }

        public void SendCtrlEnter()
        {
            keybd_event(17, 0, 0, 0);
            keybd_event(13, 0, 0, 0);
            keybd_event(13, 0, 2, 0);
            keybd_event(17, 0, 2, 0);
        }
        public void SendCtrlA()
        {
            keybd_event(17, 0, 0, 0);
            keybd_event(65, 0, 0, 0);

            keybd_event(17, 0, 2, 0);
            keybd_event(65, 0, 2, 0);
        }
        public void SendCtrlC()
        {
            keybd_event(17, 0, 0, 0);
            keybd_event(67, 0, 0, 0);
            keybd_event(17, 0, 2, 0);
            keybd_event(67, 0, 2, 0);
        }
        public void SendAltF4()
        {
            keybd_event(18, 0, 0, 0);
            keybd_event(115, 0, 0, 0);
            keybd_event(115, 0, 2, 0);
            keybd_event(18, 0, 2, 0);
        }
       public bool panduan_start_sotp = true;
       public bool panduan_fasong = true;
        private void BtnBeginSend_Click(object sender, EventArgs e)
        {
            if (checkBox1.Checked)
            {
                timer1.Start();

                className = TxtClassName.Text;
                windowText = TxtWindowText.Text;

                if (!IsTargetShow)
                {
                    //MessageBox.Show("没有找到指定的QQ群窗口。");
                    label1.Text = "没有找到【" + TxtWindowText.Text + "】群";
                    return;
                }
                SetWindowPos(qqWindowHwnd, 0, 0, 0, 640, 614, 0);

                //SendClick(450, 131 + 10); //点选群成员,使其获得输入焦点

                //SendEnter();

                //SendClick(140, 440); //点选输入框,使其获得输入焦点
                //SendPaste();

                SendClick(360, 260); // 点击聊天记录窗口准备获取内容
                YanShi.Delay(100);
                SendCtrlA();
                YanShi.Delay(100);
                SendCtrlC();
                YanShi.Delay(100);
                SendCtrlC();
                //YanShi.Delay(100);
                //SendClick(200, 200); // 点击聊天记录窗口准备获取内容


                IDataObject iData = Clipboard.GetDataObject();
                if (iData.GetDataPresent(DataFormats.Text))
                {
                    try
                    {
                        richTextBox1.Text = (String)iData.GetData(DataFormats.Text);

                        richTextBox1.Text = richTextBox1.Lines[richTextBox1.Lines.Length - 2];

                        if (richTextBox1.Text.IndexOf("#开启") > -1)
                        {
                            panduan_start_sotp = true;
                        }
                        if (richTextBox1.Text.IndexOf("#关闭") > -1)
                        {
                            panduan_start_sotp = false;
                        }

                        this.listView2.Items.Clear();
                        foreach (ListViewItem lt in listView1.Items)
                        {
                            //MessageBox.Show(Convert.ToString(lt.SubItems[0].Text));//记问第行记录的第一个字段值
                            if (richTextBox1.Text.IndexOf(lt.SubItems[0].Text) > -1)
                            {
                                //MessageBox.Show(Convert.ToString(lt.SubItems[1].Text));//记问第行记录的第一个字段值
                                this.listView2.Items.Add(lt.SubItems[0].Text).SubItems.Add(lt.SubItems[1].Text);
                            }

                        }


                        Random ran = new Random();
                        int RandKey = ran.Next(1, listView2.Items.Count);
                        int xuanze = 0;
                        foreach (ListViewItem lt in listView2.Items)
                        {

                            xuanze++;
                            if (xuanze == RandKey)
                            {
                                if (panduan_fasong)
                                {
                                    Clipboard.SetText(lt.SubItems[1].Text + "\r\n\r\n");
                                    SendClick(300, 530); // 点击聊天记录窗口准备获取内容
                                    YanShi.Delay(100);
                                    SendPaste();
                                    SendCtrlEnter();
                                    break;
                                }
                                if (panduan_start_sotp)
                                {
                                    panduan_fasong = true;
                                }
                                else
                                {
                                    panduan_fasong = false;
                                }
                            }
                        }
                    }


                    catch (Exception ex)
                    { }
                }
            }
        }
        

        private void button1_Click(object sender, EventArgs e)
        {
            Read("word.txt");
            // Read_data();
        }

        public void Read_data()
        {
            int jiazai_num = 0;
            DataTable dt = Mysql.SelectAccsql("select a1,a2 from word_table");
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                jiazai_num++;
                try
                {
                    string a_left = dt.Rows[i]["a1"].ToString();
                    string a_right = dt.Rows[i]["a2"].ToString();
                    this.listView1.Items.Add(a_left).SubItems.Add(a_right);
                    //YanShi.Delay(1);
                    label3.Text = "共加载 语句:" + jiazai_num.ToString() + "条";
                }
                catch (Exception ex)
                { }

            }
        }



        public void Read(string path)
        {
            StreamReader sr = new StreamReader(path, Encoding.Default);
            String line;
            this.listView1.Items.Clear();
            YanShi.Delay(10);
            this.listView1.Items.Add("正在加载,请稍等...");
            //YanShi.Delay(500);
            this.listView1.Items.Clear();

            int i_ok = 0;
            int i_num = 0;
            while ((line = sr.ReadLine()) != null)
            {
                i_num++;
                //Console.WriteLine(line.ToString());

                //line = "aaa/bbb";
                //ListViewItem item=new ListViewItem();
                //item.add("第一列的内容").subItems.add("第二列的内容");
                //item.SubItems.Add("第2列,");
                //this.listView1.Items.Add(item);  
                //this.listView1.Clear();
                try
                {
                    string line_l = line.Substring(0, line.LastIndexOf("/"));
                    string line_r = line.Substring(line.LastIndexOf("/") + 1);

                    if (line_l.Length >= 1 && line_r.Length >= 1)
                    {
                        try
                        {
                            //Mysql.SaveAccsql("insert into word_table (a1,a2)values('" + line_l + "','" + line_r + "')");
                            i_ok++;

                            this.listView1.Items.Add(line_l).SubItems.Add(line_r);
                        }
                        catch (Exception ex)
                        {

                        }
                    }
                 
                   
                      
                   
                }
                catch(Exception ex)
                {}

                //YanShi.Delay(1);
               // this.Text = "共操作数据【" + i_num + "】,成功数据【" + i_ok + "】";
            }
            label3.Text = "共加载 语句:" + i_ok.ToString() + "条";
        }

        private void timer1_Tick(object sender, EventArgs e)
        {

            RegisterHotKey(Handle, 81, KeyModifiers.None, Keys.F8);
            BtnBeginSend_Click(sender, e);

        }


        #region 定义快捷键
        //===========================================================================================================================
        //如果函数执行成功,返回值不为0。       
        //如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。        
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool RegisterHotKey(
        IntPtr hWnd,                //要定义热键的窗口的句柄            
        int id,                     //定义热键ID(不能与其它ID重复)                       
        KeyModifiers fsModifiers,   //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效         
        Keys vk                     //定义热键的内容            
    );
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool UnregisterHotKey(
            IntPtr hWnd,                //要取消热键的窗口的句柄            
            int id                      //要取消热键的ID            
        );
        //定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值)        
        [Flags()]
        public enum KeyModifiers
        {
            None = 0,
            Alt = 1,
            Ctrl = 2,
            Shift = 4,
            WindowsKey = 8
        }
        #endregion
        protected override void WndProc(ref Message m)
        {
            const int WM_HOTKEY = 0x0312;
            //按快捷键     
            switch (m.Msg)
            {
                case WM_HOTKEY:
                    switch (m.WParam.ToInt32())
                    {
                        case 81:    
                            //Application.Exit();
                            checkBox1.Checked = false;
                            break;
                    }
                    break;
            }
            base.WndProc(ref m);
        }

    }
}

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值