当前位置:   article > 正文

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

wpf移自动问答机器人

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.IO;
  7. using System.Runtime.InteropServices;
  8. using System.Text;
  9. using System.Threading;
  10. using System.Windows.Forms;
  11. namespace QQGG
  12. {
  13. public partial class Form1 : Form
  14. {
  15. //import win32api
  16. //import win32con
  17. //win32api.keybd_event(17,0,0,0) #ctrl键位码是17
  18. //win32api.keybd_event(86,0,0,0) #v键位码是86
  19. //win32api.keybd_event(86,0,win32con.KEYEVENTF_KEYUP,0) #释放按键
  20. //win32api.keybd_event(17,0,win32con.KEYEVENTF_KEYUP,0)
  21. //附个键位码表:
  22. //字母和数字键 数字小键盘的键 功能键 其它键
  23. // 键 键码 键 键码 键 键码 键 键码
  24. // A 65 0 96 F1 112 Backspace 8
  25. // B 66 1 97 F2 113 Tab 9
  26. // C 67 2 98 F3 114 Clear 12
  27. // D 68 3 99 F4 115 Enter 13
  28. // E 69 4 100 F5 116 Shift 16
  29. // F 70 5 101 F6 117 Control 17
  30. // G 71 6 102 F7 118 Alt 18
  31. // H 72 7 103 F8 119 Caps Lock 20
  32. // I 73 8 104 F9 120 Esc 27
  33. // J 74 9 105 F10 121 Spacebar 32
  34. // K 75 * 106 F11 122 Page Up 33
  35. // L 76 + 107 F12 123 Page Down 34
  36. // M 77 Enter 108 -- -- End 35
  37. // N 78 - 109 -- -- Home 36
  38. // O 79 . 110 -- -- Left Arrow 37
  39. // P 80 / 111 -- -- Up Arrow 38
  40. // Q 81 -- -- -- -- Right Arrow 39
  41. // R 82 -- -- -- -- Down Arrow 40
  42. // S 83 -- -- -- -- Insert 45
  43. // T 84 -- -- -- -- Delete 46
  44. // U 85 -- -- -- -- Help 47
  45. // V 86 -- -- -- -- Num Lock 144
  46. // W 87
  47. // X 88
  48. // Y 89
  49. // Z 90
  50. // 0 48
  51. // 1 49
  52. // 2 50
  53. // 3 51
  54. // 4 52
  55. // 5 53
  56. // 6 54
  57. // 7 55
  58. // 8 56
  59. // 9 57
  60. //这个函数在user32.dll这个库文件里面。我们可以在C:\WINDOWS\system32(XP系统)这个目录下找到这个文件,他是系统自带的。 我们以C#直接调用这个文件中的API为例子来说下怎么进行鼠标操作,首先在我们C#中声明引用,如果是一个基于From的程序,这个声明的位置写在你的From class就可以了
  61. //[System.Runtime.InteropServices.DllImport("user32")]
  62. //private static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
  63. //参数 意义
  64. //dwFlags Long,下表中标志之一或它们的组合
  65. //dx,dy Long,根据MOUSEEVENTF_ABSOLUTE标志,指定x,y方向的绝对位置或相对位置
  66. //cButtons Long,没有使用
  67. //dwExtraInfo Long,没有使用
  68. //dwFlags常数 意义
  69. //const int MOUSEEVENTF_MOVE = 0x0001; 移动鼠标
  70. //const int MOUSEEVENTF_LEFTDOWN = 0x0002; 模拟鼠标左键按下
  71. //const int MOUSEEVENTF_LEFTUP = 0x0004; 模拟鼠标左键抬起
  72. //const int MOUSEEVENTF_RIGHTDOWN = 0x0008; 模拟鼠标右键按下
  73. //const int MOUSEEVENTF_RIGHTUP = 0x0010; 模拟鼠标右键抬起
  74. //const int MOUSEEVENTF_MIDDLEDOWN = 0x0020; 模拟鼠标中键按下
  75. //const int MOUSEEVENTF_MIDDLEUP = 0x0040; 模拟鼠标中键抬起
  76. //const int MOUSEEVENTF_ABSOLUTE = 0x8000; 标示是否采用绝对坐标
  77. //程序中我们直接调用mouse_event函数就可以了
  78. //mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 500, 500, 0, 0);
  79. //1、这里是鼠标左键按下和松开两个事件的组合即一次单击:
  80. //mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )
  81. //2、模拟鼠标右键单击事件:
  82. //mouse_event (MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0 )
  83. //3、两次连续的鼠标左键单击事件 构成一次鼠标双击事件:
  84. //mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )
  85. //mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 )
  86. //4、使用绝对坐标
  87. //MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 500, 500, 0, 0
  88. //需要说明的是,如果没有使用MOUSEEVENTF_ABSOLUTE,函数默认的是相对于鼠标当前位置的点,如果dx,和dy,用0,0表示,这函数认为是当前鼠标所在的点。5、直接设定绝对坐标并单击
  89. //mouse_event(MOUSEEVENTF_LEFTDOWN, X * 65536 / 1024, Y * 65536 / 768, 0, 0);
  90. //mouse_event(MOUSEEVENTF_LEFTUP, X * 65536 / 1024, Y * 65536 / 768, 0, 0);
  91. //其中X,Y分别是你要点击的点的横坐标和纵坐标
  92. //而键盘模拟用 Keybd_event()
  93. //Keybd_event能触发一个按键事 件,也就是说回产生一个WM_KEYDOWN或WM_KEYUP消息。当然也可以用产生这两个消息来模拟按键,但是没有直接用这个函数方便。 Keybd_event共有四个参数,第一个为按键的虚拟键值,如回车键为vk_return, tab键为vk_tab。第二个参数为扫描码,一般不用 设置,用0代替就行。第三个参数为选项标志,如果为keydown则置0即可,如果为keyup则设成“KEYEVENTF_KEYUP”,第四个参数一 般也是置0即可。
  94. [DllImport("user32.dll", EntryPoint = "FindWindow")]
  95. private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);
  96. [DllImport("user32.dll")]
  97. private static extern int GetWindowText(IntPtr hwnd, StringBuilder lpString, int cch);
  98. [DllImport("user32.dll", EntryPoint = "SetWindowPos", SetLastError = true)]
  99. private static extern bool SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);
  100. private string className, windowText;
  101. private IntPtr qqWindowHwnd;
  102. public Form1()
  103. {
  104. InitializeComponent();
  105. }
  106. private void Form1_Load(object sender, EventArgs e)
  107. {
  108. }
  109. public bool IsTargetShow
  110. {
  111. get
  112. {
  113. qqWindowHwnd = FindWindow(className, windowText);
  114. if (qqWindowHwnd != IntPtr.Zero) //找到目标窗口
  115. {
  116. return true;
  117. }
  118. else
  119. {
  120. return false;
  121. }
  122. }
  123. }
  124. /// <summary>
  125. /// 设置鼠标位置
  126. /// </summary>
  127. /// <param name="x"></param>
  128. /// <param name="y"></param>
  129. /// <returns></returns>
  130. [DllImport("user32.dll")]
  131. static extern bool SetCursorPos(int x, int y);
  132. [DllImport("user32.dll")]
  133. static extern bool mouse_event(int dwFlags, int dx, int dy, int dwData, UInt64 dwExtraInfo);
  134. [DllImport("user32.dll", EntryPoint = "keybd_event")]
  135. public static extern void keybd_event(byte bVk, //虚拟键值
  136. byte bScan,// 一般为0
  137. int dwFlags, //这里是整数类型 0 为按下,2为释放
  138. int dwExtraInfo //这里是整数类型 一般情况下设成为0
  139. );
  140. public void SendDoubleClick(int x, int y)
  141. {
  142. SetCursorPos(x, y);
  143. mouse_event(0x2, 0, 0, 0, 0);
  144. mouse_event(0x4, 0, 0, 0, 0);
  145. YanShi.Delay(10);
  146. mouse_event(0x2, 0, 0, 0, 0);
  147. mouse_event(0x4, 0, 0, 0, 0);
  148. }
  149. public void SendClick(int x, int y)
  150. {
  151. SetCursorPos(x, y);
  152. mouse_event(0x2, 0, 0, 0, 0);
  153. mouse_event(0x4, 0, 0, 0, 0);
  154. }
  155. public void SendPaste()
  156. {
  157. keybd_event(17, 0, 0, 0);
  158. keybd_event(86, 0, 0, 0);
  159. keybd_event(86, 0, 2, 0);
  160. keybd_event(17, 0, 2, 0);
  161. }
  162. public void SendEnter()
  163. {
  164. keybd_event(13, 0, 0, 0);
  165. keybd_event(13, 0, 2, 0);
  166. }
  167. public void SendDown()
  168. {
  169. keybd_event(40, 0, 0, 0);
  170. keybd_event(40, 0, 2, 0);
  171. YanShi.Delay(10);
  172. }
  173. public void SendCtrlEnter()
  174. {
  175. keybd_event(17, 0, 0, 0);
  176. keybd_event(13, 0, 0, 0);
  177. keybd_event(13, 0, 2, 0);
  178. keybd_event(17, 0, 2, 0);
  179. }
  180. public void SendCtrlA()
  181. {
  182. keybd_event(17, 0, 0, 0);
  183. keybd_event(65, 0, 0, 0);
  184. keybd_event(17, 0, 2, 0);
  185. keybd_event(65, 0, 2, 0);
  186. }
  187. public void SendCtrlC()
  188. {
  189. keybd_event(17, 0, 0, 0);
  190. keybd_event(67, 0, 0, 0);
  191. keybd_event(17, 0, 2, 0);
  192. keybd_event(67, 0, 2, 0);
  193. }
  194. public void SendAltF4()
  195. {
  196. keybd_event(18, 0, 0, 0);
  197. keybd_event(115, 0, 0, 0);
  198. keybd_event(115, 0, 2, 0);
  199. keybd_event(18, 0, 2, 0);
  200. }
  201. public bool panduan_start_sotp = true;
  202. public bool panduan_fasong = true;
  203. private void BtnBeginSend_Click(object sender, EventArgs e)
  204. {
  205. if (checkBox1.Checked)
  206. {
  207. timer1.Start();
  208. className = TxtClassName.Text;
  209. windowText = TxtWindowText.Text;
  210. if (!IsTargetShow)
  211. {
  212. //MessageBox.Show("没有找到指定的QQ群窗口。");
  213. label1.Text = "没有找到【" + TxtWindowText.Text + "】群";
  214. return;
  215. }
  216. SetWindowPos(qqWindowHwnd, 0, 0, 0, 640, 614, 0);
  217. //SendClick(450, 131 + 10); //点选群成员,使其获得输入焦点
  218. //SendEnter();
  219. //SendClick(140, 440); //点选输入框,使其获得输入焦点
  220. //SendPaste();
  221. SendClick(360, 260); // 点击聊天记录窗口准备获取内容
  222. YanShi.Delay(100);
  223. SendCtrlA();
  224. YanShi.Delay(100);
  225. SendCtrlC();
  226. YanShi.Delay(100);
  227. SendCtrlC();
  228. //YanShi.Delay(100);
  229. //SendClick(200, 200); // 点击聊天记录窗口准备获取内容
  230. IDataObject iData = Clipboard.GetDataObject();
  231. if (iData.GetDataPresent(DataFormats.Text))
  232. {
  233. try
  234. {
  235. richTextBox1.Text = (String)iData.GetData(DataFormats.Text);
  236. richTextBox1.Text = richTextBox1.Lines[richTextBox1.Lines.Length - 2];
  237. if (richTextBox1.Text.IndexOf("#开启") > -1)
  238. {
  239. panduan_start_sotp = true;
  240. }
  241. if (richTextBox1.Text.IndexOf("#关闭") > -1)
  242. {
  243. panduan_start_sotp = false;
  244. }
  245. this.listView2.Items.Clear();
  246. foreach (ListViewItem lt in listView1.Items)
  247. {
  248. //MessageBox.Show(Convert.ToString(lt.SubItems[0].Text));//记问第行记录的第一个字段值
  249. if (richTextBox1.Text.IndexOf(lt.SubItems[0].Text) > -1)
  250. {
  251. //MessageBox.Show(Convert.ToString(lt.SubItems[1].Text));//记问第行记录的第一个字段值
  252. this.listView2.Items.Add(lt.SubItems[0].Text).SubItems.Add(lt.SubItems[1].Text);
  253. }
  254. }
  255. Random ran = new Random();
  256. int RandKey = ran.Next(1, listView2.Items.Count);
  257. int xuanze = 0;
  258. foreach (ListViewItem lt in listView2.Items)
  259. {
  260. xuanze++;
  261. if (xuanze == RandKey)
  262. {
  263. if (panduan_fasong)
  264. {
  265. Clipboard.SetText(lt.SubItems[1].Text + "\r\n\r\n");
  266. SendClick(300, 530); // 点击聊天记录窗口准备获取内容
  267. YanShi.Delay(100);
  268. SendPaste();
  269. SendCtrlEnter();
  270. break;
  271. }
  272. if (panduan_start_sotp)
  273. {
  274. panduan_fasong = true;
  275. }
  276. else
  277. {
  278. panduan_fasong = false;
  279. }
  280. }
  281. }
  282. }
  283. catch (Exception ex)
  284. { }
  285. }
  286. }
  287. }
  288. private void button1_Click(object sender, EventArgs e)
  289. {
  290. Read("word.txt");
  291. // Read_data();
  292. }
  293. public void Read_data()
  294. {
  295. int jiazai_num = 0;
  296. DataTable dt = Mysql.SelectAccsql("select a1,a2 from word_table");
  297. for (int i = 0; i < dt.Rows.Count; i++)
  298. {
  299. jiazai_num++;
  300. try
  301. {
  302. string a_left = dt.Rows[i]["a1"].ToString();
  303. string a_right = dt.Rows[i]["a2"].ToString();
  304. this.listView1.Items.Add(a_left).SubItems.Add(a_right);
  305. //YanShi.Delay(1);
  306. label3.Text = "共加载 语句:" + jiazai_num.ToString() + "条";
  307. }
  308. catch (Exception ex)
  309. { }
  310. }
  311. }
  312. public void Read(string path)
  313. {
  314. StreamReader sr = new StreamReader(path, Encoding.Default);
  315. String line;
  316. this.listView1.Items.Clear();
  317. YanShi.Delay(10);
  318. this.listView1.Items.Add("正在加载,请稍等...");
  319. //YanShi.Delay(500);
  320. this.listView1.Items.Clear();
  321. int i_ok = 0;
  322. int i_num = 0;
  323. while ((line = sr.ReadLine()) != null)
  324. {
  325. i_num++;
  326. //Console.WriteLine(line.ToString());
  327. //line = "aaa/bbb";
  328. //ListViewItem item=new ListViewItem();
  329. //item.add("第一列的内容").subItems.add("第二列的内容");
  330. //item.SubItems.Add("第2列,");
  331. //this.listView1.Items.Add(item);
  332. //this.listView1.Clear();
  333. try
  334. {
  335. string line_l = line.Substring(0, line.LastIndexOf("/"));
  336. string line_r = line.Substring(line.LastIndexOf("/") + 1);
  337. if (line_l.Length >= 1 && line_r.Length >= 1)
  338. {
  339. try
  340. {
  341. //Mysql.SaveAccsql("insert into word_table (a1,a2)values('" + line_l + "','" + line_r + "')");
  342. i_ok++;
  343. this.listView1.Items.Add(line_l).SubItems.Add(line_r);
  344. }
  345. catch (Exception ex)
  346. {
  347. }
  348. }
  349. }
  350. catch(Exception ex)
  351. {}
  352. //YanShi.Delay(1);
  353. // this.Text = "共操作数据【" + i_num + "】,成功数据【" + i_ok + "】";
  354. }
  355. label3.Text = "共加载 语句:" + i_ok.ToString() + "条";
  356. }
  357. private void timer1_Tick(object sender, EventArgs e)
  358. {
  359. RegisterHotKey(Handle, 81, KeyModifiers.None, Keys.F8);
  360. BtnBeginSend_Click(sender, e);
  361. }
  362. #region 定义快捷键
  363. //===========================================================================================================================
  364. //如果函数执行成功,返回值不为0。
  365. //如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。
  366. [DllImport("user32.dll", SetLastError = true)]
  367. public static extern bool RegisterHotKey(
  368. IntPtr hWnd, //要定义热键的窗口的句柄
  369. int id, //定义热键ID(不能与其它ID重复)
  370. KeyModifiers fsModifiers, //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效
  371. Keys vk //定义热键的内容
  372. );
  373. [DllImport("user32.dll", SetLastError = true)]
  374. public static extern bool UnregisterHotKey(
  375. IntPtr hWnd, //要取消热键的窗口的句柄
  376. int id //要取消热键的ID
  377. );
  378. //定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值)
  379. [Flags()]
  380. public enum KeyModifiers
  381. {
  382. None = 0,
  383. Alt = 1,
  384. Ctrl = 2,
  385. Shift = 4,
  386. WindowsKey = 8
  387. }
  388. #endregion
  389. protected override void WndProc(ref Message m)
  390. {
  391. const int WM_HOTKEY = 0x0312;
  392. //按快捷键
  393. switch (m.Msg)
  394. {
  395. case WM_HOTKEY:
  396. switch (m.WParam.ToInt32())
  397. {
  398. case 81:
  399. //Application.Exit();
  400. checkBox1.Checked = false;
  401. break;
  402. }
  403. break;
  404. }
  405. base.WndProc(ref m);
  406. }
  407. }
  408. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/45213
推荐阅读
相关标签
  

闽ICP备14008679号