AutoFunc.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599
  1. #pragma once
  2. // 下列 ifdef 块是创建使从 DLL 导出更简单的
  3. // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 AUTOFUNC_EXPORTS
  4. // 符号编译的。在使用此 DLL 的
  5. // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
  6. // AUTOFUNC_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
  7. // 符号视为是被导出的。
  8. #ifndef AUTOFUNC_EXPORTS
  9. #ifdef _WIN64
  10. #ifdef _DEBUG
  11. #pragma comment(lib, "AutoFuncX64D.lib")
  12. #else
  13. #pragma comment(lib, "AutoFuncX64.lib")
  14. #endif
  15. #else
  16. #ifdef _DEBUG
  17. #pragma comment(lib, "AutoFuncD.lib")
  18. #else
  19. #pragma comment(lib, "AutoFunc.lib")
  20. #endif
  21. #endif
  22. #endif
  23. #ifdef AUTOFUNC_EXPORTS
  24. #define AUTOFUNC_API __declspec(dllexport)
  25. #define AUTOFUNC_C_API extern "C" __declspec(dllexport)
  26. #else
  27. #define AUTOFUNC_API __declspec(dllimport)
  28. #define AUTOFUNC_C_API extern "C" __declspec(dllimport)
  29. #endif
  30. #include <map>
  31. #include <vector>
  32. #include <string.h>
  33. #include <setupapi.h>
  34. #include <hidsdi.h>
  35. #include <dbt.h>
  36. using namespace std;
  37. enum{
  38. MCD_RETURN_SUCCESS = 0,
  39. MCD_RETURN_FOUND_HID,
  40. MCD_RETURN_NO_FOUND_HID,
  41. MCD_RETURN_HID_IS_OPENED,//?
  42. MCD_RETURN_HID_NO_OPEN,//?
  43. };
  44. #define MAX_DELAY (500)
  45. #define MAX_READ_DELAY (200)
  46. typedef struct _HID_DEVICE {
  47. char DevicePath[MAX_PATH];
  48. char DataBuff[MAX_PATH];
  49. bool ReportIDExist;
  50. char ReportID;
  51. HANDLE HidDevice; // A file handle to the hid device.
  52. HIDP_CAPS Caps; // The Capabilities of this hid device.
  53. HIDD_ATTRIBUTES Attributes;
  54. } HID_DEVICE, *PHID_DEVICE;
  55. class AUTOFUNC_API Hid_File
  56. {
  57. HANDLE _hEventObject;
  58. OVERLAPPED _hIDOverlapped;
  59. HID_DEVICE _hidDevice;
  60. unsigned long _dataWaitProcess;
  61. unsigned long _inputReportByteLength;
  62. unsigned long _outputReportByteLength;
  63. DWORD AddReportID(char *pInputBuff, DWORD BuffLen);
  64. public:
  65. Hid_File();
  66. virtual ~Hid_File();
  67. bool OpenHid();
  68. void CloseHid();
  69. bool FindHid();
  70. bool WriteToHid(char *pInputBuff, DWORD BuffLen);
  71. INT ReadFromHid(char *pOutputBuff, DWORD BuffLen, DWORD timeout = MAX_READ_DELAY);
  72. };
  73. #pragma pack(push, 1)
  74. typedef struct _Key_Function_Bit
  75. {
  76. unsigned char LeftControl : 1;//bit0
  77. unsigned char LeftShift : 1;//bit1
  78. unsigned char LeftAlt : 1;//bit2
  79. unsigned char LeftWin : 1;//...
  80. unsigned char RightControl : 1;
  81. unsigned char RightShift : 1;
  82. unsigned char RightAlt : 1;
  83. unsigned char RightWin : 1;
  84. }KEY_FUNCTION_BIT;
  85. typedef struct _Mouse_Function_Bit
  86. {
  87. unsigned char LeftButton : 1;//bit0
  88. unsigned char RightButton : 1;//bit1
  89. unsigned char MiddleButton : 1;//bit2
  90. unsigned char Rev : 5;//...
  91. }MOUSE_FUNCTION_BIT;
  92. typedef struct _Light_Function_Bit
  93. {
  94. unsigned char NumLock : 1;//bit0
  95. unsigned char CapsLock : 1;//bit1
  96. unsigned char ScrollLock : 1;//bit2
  97. unsigned char Rev : 5;//...
  98. }LIGHT_FUNCTION_BIT;
  99. typedef union _Function_Byte
  100. {
  101. KEY_FUNCTION_BIT KeyBits;
  102. MOUSE_FUNCTION_BIT MouseBits;
  103. unsigned char Val;
  104. }FUNCTION_BYTE;
  105. typedef struct _Key_Cmd {
  106. unsigned char Len;
  107. unsigned char Cmd;
  108. FUNCTION_BYTE Func_Cmd;//byte1
  109. unsigned char Rev;//byte2
  110. unsigned char Keys[6];
  111. }KEY_CMD;
  112. typedef struct _Mouse_Cmd {
  113. unsigned char Len;
  114. unsigned char Cmd;
  115. FUNCTION_BYTE Func_Cmd;//byte1
  116. char X;//byte2
  117. char Y;//byte3
  118. char Wheel;//byte4
  119. }MOUSE_CMD;
  120. #pragma pack(pop)
  121. void InitKeyNode(KEY_CMD *pKey);
  122. void InitMouseNode(MOUSE_CMD *pMouse);
  123. class AUTOFUNC_API Hid_Cmd : public Hid_File
  124. {
  125. public:
  126. Hid_Cmd();
  127. virtual ~Hid_Cmd();
  128. bool PostKeyCmd(KEY_CMD *pKey);
  129. bool PostMouseCmd(MOUSE_CMD *pKey);
  130. bool GetLightStatus(LIGHT_FUNCTION_BIT *pVal);
  131. bool TryReadErrResponse(char Res, DWORD timeout = 100);
  132. };
  133. typedef unsigned char HID_KEY;
  134. typedef enum _MouseKeyType {
  135. MOUSEKEYLEFT,
  136. MOUSEKEYRIGHT,
  137. MOUSEKEYMIDDLE,
  138. MOUSEKEYMAX
  139. }MOUSEKEYTYPE;
  140. typedef enum _Hid_Key_ID {
  141. HID_A = 0x04,
  142. HID_B,
  143. HID_C,
  144. HID_D,
  145. HID_E,
  146. HID_F,
  147. HID_G,
  148. HID_H,
  149. HID_I,
  150. HID_J,
  151. HID_K,
  152. HID_L,
  153. HID_M,
  154. HID_N,
  155. HID_O,
  156. HID_P,
  157. HID_Q,
  158. HID_R,
  159. HID_S,
  160. HID_T,
  161. HID_U,
  162. HID_V,
  163. HID_W,
  164. HID_X,
  165. HID_Y,
  166. HID_Z,
  167. HID_1,
  168. HID_2,
  169. HID_3,
  170. HID_4,
  171. HID_5,
  172. HID_6,
  173. HID_7,
  174. HID_8,
  175. HID_9,
  176. HID_0,
  177. HID_ENTER,
  178. HID_ESC,
  179. HID_BACKSPACE,
  180. HID_TAB,
  181. HID_SPACE,
  182. HID_MINUS,//UNDERBAR
  183. HID_EQUAL,//PLUS
  184. HID_LKUOH,//[ {
  185. HID_RKUOH,//] }
  186. HID_OR,// \ |
  187. //跟实际情况不符,还是HID_OR
  188. //HID_TYINH,//` ~(左上1的旁边)
  189. HID_FENH = 0x33,//; :分好和冒号
  190. HID_YINH,// ' "
  191. //这个位置是正确的
  192. HID_TYINH,//` ~(左上1的旁边)
  193. HID_DOUH = 0x36,//, <
  194. HID_JUH,// . <
  195. HID_XIEH,// /?
  196. HID_CAPSLOCK,
  197. HID_F1,
  198. HID_F2,
  199. HID_F3,
  200. HID_F4,
  201. HID_F5,
  202. HID_F6,
  203. HID_F7,
  204. HID_F8,
  205. HID_F9,
  206. HID_F10,
  207. HID_F11,
  208. HID_F12,
  209. HID_PRINTSCREEN,
  210. HID_SCROLLLOCK,
  211. HID_PAUSE,
  212. HID_INSERT,
  213. HID_HOME,
  214. HID_PAGEUP,
  215. HID_DEL,
  216. HID_END,
  217. HID_PAGEDOWN,
  218. HID_RIGHT,
  219. HID_LEFT,
  220. HID_DOWN,
  221. HID_UP,
  222. HID_NUMLOCK,
  223. HID_PAD_DIV,
  224. HID_PAD_MULTIPLE,
  225. HID_PAD_MINUS,
  226. HID_PAD_PLUS,
  227. HID_PAD_ENTER,
  228. HID_PAD_1,
  229. HID_PAD_2,
  230. HID_PAD_3,
  231. HID_PAD_4,
  232. HID_PAD_5,
  233. HID_PAD_6,
  234. HID_PAD_7,
  235. HID_PAD_8,
  236. HID_PAD_9,
  237. HID_PAD_0,
  238. HID_PAD_DEL,
  239. HID_APP = 0x65,
  240. HID_LEFTCTRL = 0xE0,
  241. HID_LEFTSHIFT,
  242. HID_LEFTALT,
  243. HID_LEFTWIN,
  244. HID_RIGHTCTRL,
  245. HID_RIGHTSHIFT,
  246. HID_RIGHTALT,
  247. HID_RIGHTWIN,
  248. HID_KEY_MAX
  249. }HID_KEY_ID;
  250. class AUTOFUNC_API Hid_IF : public Hid_Cmd
  251. {
  252. map<HID_KEY, bool> *m_KeyStatus;//当前按下的状态表
  253. bool InitKeyMap();
  254. map<MOUSEKEYTYPE, bool> *m_MouseKeyStatus;
  255. bool InitMouseMap();
  256. void MakeKeyTable(HID_KEY key, KEY_CMD *pCmd, BOOL Press);
  257. public:
  258. Hid_IF();
  259. virtual ~Hid_IF();
  260. bool InitHid();
  261. bool Key_Down(HID_KEY key);
  262. bool Key_Up(HID_KEY key);
  263. bool Key_Hit(HID_KEY key, DWORD timeout = 300);
  264. bool GetKeyStatus(HID_KEY key);
  265. bool MouseKey_Down(MOUSEKEYTYPE key);
  266. bool MouseKey_Up(MOUSEKEYTYPE key);
  267. bool MouseKey_Hit(MOUSEKEYTYPE key, DWORD timeout = 300);
  268. bool Mouse_Move(char x, char y);
  269. bool Mouse_Wheel(char offset);
  270. };
  271. #define MAX_JUMP_DISTANCE (120)
  272. #pragma pack(push, 1)
  273. typedef struct _Ascii_Key_COMB {
  274. unsigned char Shift;
  275. unsigned char HidCode;
  276. }ASCII_KEY_COMB;
  277. typedef union _ASCII_NODE
  278. {
  279. WORD val;
  280. ASCII_KEY_COMB AsciiComb;
  281. }ASCII_NODE;
  282. #pragma pack(pop)
  283. class AUTOFUNC_API Hid_UI : public Hid_IF
  284. {
  285. map<char, ASCII_NODE> *m_AsciiMap;
  286. void InitAsciiMap();
  287. public:
  288. Hid_UI();
  289. virtual ~Hid_UI();
  290. bool InitUI();
  291. bool InputAsciiString(const char *pStr, DWORD timeperiod = 0);
  292. bool MoveToPos(INT X, INT Y, DWORD Radious);//DESKTOP POS,Absolute pos
  293. };
  294. #define ZORDER_ALLSEARCH (0xFFFFFFFF)
  295. #define ZORDER_DESKTOP (0)
  296. #define NO_WNDTYPE (0xFFFFFFFF)
  297. #define NO_GUIID (0xFFFFFFFF)
  298. #define NORMAL_WAIT_TM (10000)
  299. typedef enum _HitMethod {
  300. HM_NOTIFY_PARENT,
  301. HM_HIT,
  302. HM_CLICK,
  303. HM_REALCLICK,
  304. HM_MAX
  305. }HITMETHOD;
  306. class AUTOFUNC_API ExpObject
  307. {
  308. public:
  309. ExpObject(void);
  310. ExpObject(const TCHAR *pContent);
  311. virtual ~ExpObject(void);
  312. const char *ExpContext();
  313. TCHAR m_szExpContent[MAX_PATH];
  314. };
  315. class AUTOFUNC_API SystemCmds
  316. {
  317. public:
  318. SystemCmds(void);
  319. virtual ~SystemCmds(void);
  320. static BOOL EnableComputerCtrl();
  321. static BOOL CreateTheProcess_Console(const TCHAR *pfullFilePath, PROCESS_INFORMATION &pinfo, bool HideWindow = false);
  322. static BOOL RunTheProcess(const TCHAR *fullFilePath, bool HideWindow = false);
  323. static DWORD FindProcess(const TCHAR *strProcessName);
  324. static DWORD KillProcess(const TCHAR *strProcessName);
  325. static BOOL ShutDownComputer(BOOL Shutdown);
  326. };
  327. class AUTOFUNC_API InputCmds
  328. {
  329. public:
  330. InputCmds(void);
  331. virtual ~InputCmds(void);
  332. static BOOL NotifyParentHitButton(HWND wnd);
  333. static BOOL ClickLB(HWND wnd, BOOL real = FALSE);
  334. //static BOOL HitKeyDown(HWND wnd,UINT key,BOOL real = FALSE);
  335. //static BOOL HitKeyUp(HWND wnd,UINT key,BOOL real = FALSE);
  336. static BOOL HitMouse(HWND wnd, DWORD MsgType, DWORD ExKey, int x, int y, BOOL real = FALSE);
  337. //static BOOL HitMouseDown(HWND wnd,UINT key,BOOL real = FALSE);
  338. //static BOOL HitMouseUp(HWND wnd,UINT key,BOOL real = FALSE);
  339. //static BOOL Scroll(HWND wnd,UINT key,BOOL real = FALSE);
  340. static BOOL MouseMove(HWND wnd, BOOL real);
  341. static BOOL MouseMove(HWND wnd, int x, int y, BOOL real = FALSE);
  342. static BOOL SetText(HWND Wnd, TCHAR *pContext, BOOL real = FALSE);
  343. static BOOL HitKey(HWND wnd, DWORD vk, BOOL real = FALSE);
  344. //static BOOL HitVKey(HWND wnd, DWORD vk, BOOL real = FALSE);
  345. static void SendKeysReal(TCHAR *msg);
  346. static BOOL MakeFocus(HWND wnd, BOOL real = FALSE);
  347. static BOOL MakeFocusOfThis(HWND wnd, BOOL real = FALSE);
  348. //static BOOL GetText(HWND wnd,wstring &text);
  349. };
  350. class AUTOFUNC_API SysControl
  351. {
  352. HWND m_ResHwnd;
  353. public:
  354. SysControl(void);
  355. virtual ~SysControl(void);
  356. //text box ,button etc.
  357. bool GetHwndTitle(TCHAR *pszTitle, DWORD size);
  358. bool HitMenu(WORD MenuId);
  359. //check box
  360. bool GetCheckBoxStr(TCHAR *pszTitle, DWORD size);
  361. bool SetCheckBox(INT Set);
  362. INT GetCheckBoxStatus();// <0:failed,0:Gray,1:not sel,2:sel
  363. //list box
  364. INT GetListCount();
  365. bool GetListBoxTitle(DWORD Idx, TCHAR *pszTitle);
  366. bool AddStringListBox(TCHAR *pszTitle);
  367. //combo box
  368. INT GetComboCount();
  369. INT GetComboCurSelIdx();
  370. bool GetComboCurSelStr(TCHAR *pszTitle, DWORD size);
  371. bool SetComboCurSel(DWORD Idx);
  372. INT SetComboCurSel(const char* pKey);
  373. //tab control
  374. INT GetTabControlCount();
  375. void GetTabControlSelect(int &sel);
  376. BOOL SetTabControlSelect(DWORD sel, BOOL real = FALSE);
  377. bool GetTabControlTitles(DWORD Idx, TCHAR *pszTitle, DWORD size);
  378. //list view control
  379. void GetListViewControlSize(INT &Count, INT &Column);
  380. bool GetListViewItemTitle(DWORD Column, TCHAR *pszTitle, DWORD size);
  381. bool GetListViewItemContext(DWORD hang, DWORD lie, TCHAR *pszTitle, DWORD size);
  382. INT ListViewMakeSelection(TCHAR *pszName);
  383. bool ListViewMakeChecked(TCHAR *pszName, BOOL Checked);
  384. DWORD GetListViewControlSelect(INT *pList, DWORD size);//not tested
  385. bool ListViewControlHit(BOOL dbClick, DWORD hang, DWORD lie, BOOL real = FALSE);//not tested
  386. //tree view control
  387. //void GetTreeSelection(vector<wstring> &TreeRoute);
  388. //BOOL HitTreeNode(BOOL dbClick,vector<wstring> &OneTreeRoute,BOOL real = FALSE);
  389. BOOL TreeViewSelectAB(DWORD firstLevel, DWORD secondLevel);
  390. BOOL TreeViewSelectAB(DWORD firstLevel, INT secondLevel, BOOL Focus);
  391. bool TreeViewGetSelectedItemTitle(TCHAR *pszTitle);
  392. bool TreeViewMakeSelection(TCHAR *pszName);
  393. bool TreeViewMakeIdxChecked(DWORD Idx, BOOL Checked);
  394. bool TreeViewMakeChecked(TCHAR *pszName, BOOL Checked);
  395. bool TreeViewMakeCheckedItem(HTREEITEM hFound, BOOL Checked);
  396. bool TreeViewMakeCheckedAB(DWORD firstLevel, INT secondLevel);
  397. void Sethand(HWND Hand);
  398. //common
  399. BOOL IsObjectValid();
  400. private:
  401. bool GetTreeViewNodeName(PVOID hItem, TCHAR *pszBuff);
  402. //BOOL HitSpecificTreeNode(BOOL dbClick,HTREEITEM &hItem,BOOL real);
  403. PVOID FindSpecificTreeNode(PVOID hItem, TCHAR *pszNodeName);
  404. };
  405. class WindNode;
  406. class AUTOFUNC_API WindowObject
  407. {
  408. BOOL MakeParentTree();
  409. //BOOL FilterWindowsByParent(vector<WindNode> &list1);
  410. public:
  411. WindowObject(void);
  412. virtual ~WindowObject(void);
  413. void ClearObject();
  414. void ClearLocateData();
  415. HWND GetLocatedHwnd();
  416. POINT GetLocatedTopLeft();
  417. const TCHAR* GetProcessName();
  418. const TCHAR* GetTitle();
  419. virtual BOOL LoadConfig(const TCHAR * pRFilePath);
  420. virtual INT LocateWindow(BOOL Visible = TRUE);//1 ok,0 multi,-1 ng
  421. virtual INT WaitLocateWindow(DWORD tmPeriod = NORMAL_WAIT_TM, BOOL Visible = TRUE, BOOL Exp = TRUE);
  422. INT IsObjectVisible();//-1:no hwnd,0:hide,1:show
  423. INT WaitHideWindow(TCHAR *pID, HITMETHOD hm = HM_NOTIFY_PARENT, DWORD tmPeriod = NORMAL_WAIT_TM, BOOL Exp = TRUE,DWORD moretry = 1);//-1:no hwnd,0:show,1:hide
  424. virtual BOOL SendMessageTo(DWORD msg, DWORD wp, DWORD lp, BOOL sendFlag = TRUE);
  425. virtual BOOL MakeFocus(BOOL real = FALSE);
  426. virtual BOOL SetText(TCHAR *pContext, BOOL real = FALSE);
  427. virtual BOOL NotifyParentHitButton();
  428. virtual BOOL ClickLB(BOOL real = FALSE);
  429. virtual BOOL MouseMove(BOOL real);
  430. BOOL DoClick(BOOL real = FALSE);
  431. virtual BOOL MouseMove(int x, int y, BOOL real = FALSE);
  432. virtual BOOL HitMouse(DWORD MsgType, DWORD ExKey, int x, int y, BOOL real = FALSE);
  433. virtual BOOL HitKey(DWORD vk, BOOL real = FALSE);
  434. virtual BOOL HitVKey(DWORD vk, BOOL real = FALSE);
  435. WindowObject &operator [](TCHAR *pID);
  436. WindowObject& operator = (WindNode &node);
  437. map<string, WindowObject*> *m_SubNodes;
  438. string *m_ConfigName;
  439. string *m_ID;
  440. string *m_Process;
  441. string *m_ReqTitle;
  442. string *m_ExistTitle;
  443. string *m_Class;
  444. INT m_Style;
  445. INT m_StyleEx;
  446. INT m_Width;
  447. INT m_Height;
  448. INT m_zOrder;
  449. DWORD m_GuiID;
  450. string *m_Dict;
  451. string *m_DictKey;
  452. DWORD m_DictRgb;
  453. RECT m_DictArea;
  454. WindowObject *m_pParent;
  455. //results
  456. HWND m_ResHwnd;//for search and result
  457. POINT m_ResDictKey;
  458. };
  459. AUTOFUNC_C_API WindowObject* GetWindowObject(void);
  460. AUTOFUNC_C_API void ReleaseWindowObject(WindowObject* &pObj);