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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
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);
        }
 
    }
}

  

posted @   程序员一诺  阅读(440)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示