#pragma once // 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 AUTOFUNC_EXPORTS // 符号编译的。在使用此 DLL 的 // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将 // AUTOFUNC_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的 // 符号视为是被导出的。 #ifndef AUTOFUNC_EXPORTS #ifdef _WIN64 #ifdef _DEBUG #pragma comment(lib, "AutoFuncX64D.lib") #else #pragma comment(lib, "AutoFuncX64.lib") #endif #else #ifdef _DEBUG #pragma comment(lib, "AutoFuncD.lib") #else #pragma comment(lib, "AutoFunc.lib") #endif #endif #endif #ifdef AUTOFUNC_EXPORTS #define AUTOFUNC_API __declspec(dllexport) #define AUTOFUNC_C_API extern "C" __declspec(dllexport) #else #define AUTOFUNC_API __declspec(dllimport) #define AUTOFUNC_C_API extern "C" __declspec(dllimport) #endif #include #include #include #include #include #include using namespace std; enum{ MCD_RETURN_SUCCESS = 0, MCD_RETURN_FOUND_HID, MCD_RETURN_NO_FOUND_HID, MCD_RETURN_HID_IS_OPENED,//? MCD_RETURN_HID_NO_OPEN,//? }; #define MAX_DELAY (500) #define MAX_READ_DELAY (200) typedef struct _HID_DEVICE { char DevicePath[MAX_PATH]; char DataBuff[MAX_PATH]; bool ReportIDExist; char ReportID; HANDLE HidDevice; // A file handle to the hid device. HIDP_CAPS Caps; // The Capabilities of this hid device. HIDD_ATTRIBUTES Attributes; } HID_DEVICE, *PHID_DEVICE; class AUTOFUNC_API Hid_File { HANDLE _hEventObject; OVERLAPPED _hIDOverlapped; HID_DEVICE _hidDevice; unsigned long _dataWaitProcess; unsigned long _inputReportByteLength; unsigned long _outputReportByteLength; DWORD AddReportID(char *pInputBuff, DWORD BuffLen); public: Hid_File(); virtual ~Hid_File(); bool OpenHid(); void CloseHid(); bool FindHid(); bool WriteToHid(char *pInputBuff, DWORD BuffLen); INT ReadFromHid(char *pOutputBuff, DWORD BuffLen, DWORD timeout = MAX_READ_DELAY); }; #pragma pack(push, 1) typedef struct _Key_Function_Bit { unsigned char LeftControl : 1;//bit0 unsigned char LeftShift : 1;//bit1 unsigned char LeftAlt : 1;//bit2 unsigned char LeftWin : 1;//... unsigned char RightControl : 1; unsigned char RightShift : 1; unsigned char RightAlt : 1; unsigned char RightWin : 1; }KEY_FUNCTION_BIT; typedef struct _Mouse_Function_Bit { unsigned char LeftButton : 1;//bit0 unsigned char RightButton : 1;//bit1 unsigned char MiddleButton : 1;//bit2 unsigned char Rev : 5;//... }MOUSE_FUNCTION_BIT; typedef struct _Light_Function_Bit { unsigned char NumLock : 1;//bit0 unsigned char CapsLock : 1;//bit1 unsigned char ScrollLock : 1;//bit2 unsigned char Rev : 5;//... }LIGHT_FUNCTION_BIT; typedef union _Function_Byte { KEY_FUNCTION_BIT KeyBits; MOUSE_FUNCTION_BIT MouseBits; unsigned char Val; }FUNCTION_BYTE; typedef struct _Key_Cmd { unsigned char Len; unsigned char Cmd; FUNCTION_BYTE Func_Cmd;//byte1 unsigned char Rev;//byte2 unsigned char Keys[6]; }KEY_CMD; typedef struct _Mouse_Cmd { unsigned char Len; unsigned char Cmd; FUNCTION_BYTE Func_Cmd;//byte1 char X;//byte2 char Y;//byte3 char Wheel;//byte4 }MOUSE_CMD; #pragma pack(pop) void InitKeyNode(KEY_CMD *pKey); void InitMouseNode(MOUSE_CMD *pMouse); class AUTOFUNC_API Hid_Cmd : public Hid_File { public: Hid_Cmd(); virtual ~Hid_Cmd(); bool PostKeyCmd(KEY_CMD *pKey); bool PostMouseCmd(MOUSE_CMD *pKey); bool GetLightStatus(LIGHT_FUNCTION_BIT *pVal); bool TryReadErrResponse(char Res, DWORD timeout = 100); }; typedef unsigned char HID_KEY; typedef enum _MouseKeyType { MOUSEKEYLEFT, MOUSEKEYRIGHT, MOUSEKEYMIDDLE, MOUSEKEYMAX }MOUSEKEYTYPE; typedef enum _Hid_Key_ID { HID_A = 0x04, HID_B, HID_C, HID_D, HID_E, HID_F, HID_G, HID_H, HID_I, HID_J, HID_K, HID_L, HID_M, HID_N, HID_O, HID_P, HID_Q, HID_R, HID_S, HID_T, HID_U, HID_V, HID_W, HID_X, HID_Y, HID_Z, HID_1, HID_2, HID_3, HID_4, HID_5, HID_6, HID_7, HID_8, HID_9, HID_0, HID_ENTER, HID_ESC, HID_BACKSPACE, HID_TAB, HID_SPACE, HID_MINUS,//UNDERBAR HID_EQUAL,//PLUS HID_LKUOH,//[ { HID_RKUOH,//] } HID_OR,// \ | //跟实际情况不符,还是HID_OR //HID_TYINH,//` ~(左上1的旁边) HID_FENH = 0x33,//; :分好和冒号 HID_YINH,// ' " //这个位置是正确的 HID_TYINH,//` ~(左上1的旁边) HID_DOUH = 0x36,//, < HID_JUH,// . < HID_XIEH,// /? HID_CAPSLOCK, HID_F1, HID_F2, HID_F3, HID_F4, HID_F5, HID_F6, HID_F7, HID_F8, HID_F9, HID_F10, HID_F11, HID_F12, HID_PRINTSCREEN, HID_SCROLLLOCK, HID_PAUSE, HID_INSERT, HID_HOME, HID_PAGEUP, HID_DEL, HID_END, HID_PAGEDOWN, HID_RIGHT, HID_LEFT, HID_DOWN, HID_UP, HID_NUMLOCK, HID_PAD_DIV, HID_PAD_MULTIPLE, HID_PAD_MINUS, HID_PAD_PLUS, HID_PAD_ENTER, HID_PAD_1, HID_PAD_2, HID_PAD_3, HID_PAD_4, HID_PAD_5, HID_PAD_6, HID_PAD_7, HID_PAD_8, HID_PAD_9, HID_PAD_0, HID_PAD_DEL, HID_APP = 0x65, HID_LEFTCTRL = 0xE0, HID_LEFTSHIFT, HID_LEFTALT, HID_LEFTWIN, HID_RIGHTCTRL, HID_RIGHTSHIFT, HID_RIGHTALT, HID_RIGHTWIN, HID_KEY_MAX }HID_KEY_ID; class AUTOFUNC_API Hid_IF : public Hid_Cmd { map *m_KeyStatus;//当前按下的状态表 bool InitKeyMap(); map *m_MouseKeyStatus; bool InitMouseMap(); void MakeKeyTable(HID_KEY key, KEY_CMD *pCmd, BOOL Press); public: Hid_IF(); virtual ~Hid_IF(); bool InitHid(); bool Key_Down(HID_KEY key); bool Key_Up(HID_KEY key); bool Key_Hit(HID_KEY key, DWORD timeout = 300); bool GetKeyStatus(HID_KEY key); bool MouseKey_Down(MOUSEKEYTYPE key); bool MouseKey_Up(MOUSEKEYTYPE key); bool MouseKey_Hit(MOUSEKEYTYPE key, DWORD timeout = 300); bool Mouse_Move(char x, char y); bool Mouse_Wheel(char offset); }; #define MAX_JUMP_DISTANCE (120) #pragma pack(push, 1) typedef struct _Ascii_Key_COMB { unsigned char Shift; unsigned char HidCode; }ASCII_KEY_COMB; typedef union _ASCII_NODE { WORD val; ASCII_KEY_COMB AsciiComb; }ASCII_NODE; #pragma pack(pop) class AUTOFUNC_API Hid_UI : public Hid_IF { map *m_AsciiMap; void InitAsciiMap(); public: Hid_UI(); virtual ~Hid_UI(); bool InitUI(); bool InputAsciiString(const char *pStr, DWORD timeperiod = 0); bool MoveToPos(INT X, INT Y, DWORD Radious);//DESKTOP POS,Absolute pos }; #define ZORDER_ALLSEARCH (0xFFFFFFFF) #define ZORDER_DESKTOP (0) #define NO_WNDTYPE (0xFFFFFFFF) #define NO_GUIID (0xFFFFFFFF) #define NORMAL_WAIT_TM (10000) typedef enum _HitMethod { HM_NOTIFY_PARENT, HM_HIT, HM_CLICK, HM_REALCLICK, HM_MAX }HITMETHOD; class AUTOFUNC_API ExpObject { public: ExpObject(void); ExpObject(const TCHAR *pContent); virtual ~ExpObject(void); const char *ExpContext(); TCHAR m_szExpContent[MAX_PATH]; }; class AUTOFUNC_API SystemCmds { public: SystemCmds(void); virtual ~SystemCmds(void); static BOOL EnableComputerCtrl(); static BOOL CreateTheProcess_Console(const TCHAR *pfullFilePath, PROCESS_INFORMATION &pinfo, bool HideWindow = false); static BOOL RunTheProcess(const TCHAR *fullFilePath, bool HideWindow = false); static DWORD FindProcess(const TCHAR *strProcessName); static DWORD KillProcess(const TCHAR *strProcessName); static BOOL ShutDownComputer(BOOL Shutdown); }; class AUTOFUNC_API InputCmds { public: InputCmds(void); virtual ~InputCmds(void); static BOOL NotifyParentHitButton(HWND wnd); static BOOL ClickLB(HWND wnd, BOOL real = FALSE); //static BOOL HitKeyDown(HWND wnd,UINT key,BOOL real = FALSE); //static BOOL HitKeyUp(HWND wnd,UINT key,BOOL real = FALSE); static BOOL HitMouse(HWND wnd, DWORD MsgType, DWORD ExKey, int x, int y, BOOL real = FALSE); //static BOOL HitMouseDown(HWND wnd,UINT key,BOOL real = FALSE); //static BOOL HitMouseUp(HWND wnd,UINT key,BOOL real = FALSE); //static BOOL Scroll(HWND wnd,UINT key,BOOL real = FALSE); static BOOL MouseMove(HWND wnd, BOOL real); static BOOL MouseMove(HWND wnd, int x, int y, BOOL real = FALSE); static BOOL SetText(HWND Wnd, TCHAR *pContext, BOOL real = FALSE); static BOOL HitKey(HWND wnd, DWORD vk, BOOL real = FALSE); //static BOOL HitVKey(HWND wnd, DWORD vk, BOOL real = FALSE); static void SendKeysReal(TCHAR *msg); static BOOL MakeFocus(HWND wnd, BOOL real = FALSE); static BOOL MakeFocusOfThis(HWND wnd, BOOL real = FALSE); //static BOOL GetText(HWND wnd,wstring &text); }; class AUTOFUNC_API SysControl { HWND m_ResHwnd; public: SysControl(void); virtual ~SysControl(void); //text box ,button etc. bool GetHwndTitle(TCHAR *pszTitle, DWORD size); bool HitMenu(WORD MenuId); //check box bool GetCheckBoxStr(TCHAR *pszTitle, DWORD size); bool SetCheckBox(INT Set); INT GetCheckBoxStatus();// <0:failed,0:Gray,1:not sel,2:sel //list box INT GetListCount(); bool GetListBoxTitle(DWORD Idx, TCHAR *pszTitle); bool AddStringListBox(TCHAR *pszTitle); //combo box INT GetComboCount(); INT GetComboCurSelIdx(); bool GetComboCurSelStr(TCHAR *pszTitle, DWORD size); bool SetComboCurSel(DWORD Idx); INT SetComboCurSel(const char* pKey); //tab control INT GetTabControlCount(); void GetTabControlSelect(int &sel); BOOL SetTabControlSelect(DWORD sel, BOOL real = FALSE); bool GetTabControlTitles(DWORD Idx, TCHAR *pszTitle, DWORD size); //list view control void GetListViewControlSize(INT &Count, INT &Column); bool GetListViewItemTitle(DWORD Column, TCHAR *pszTitle, DWORD size); bool GetListViewItemContext(DWORD hang, DWORD lie, TCHAR *pszTitle, DWORD size); INT ListViewMakeSelection(TCHAR *pszName); bool ListViewMakeChecked(TCHAR *pszName, BOOL Checked); DWORD GetListViewControlSelect(INT *pList, DWORD size);//not tested bool ListViewControlHit(BOOL dbClick, DWORD hang, DWORD lie, BOOL real = FALSE);//not tested //tree view control //void GetTreeSelection(vector &TreeRoute); //BOOL HitTreeNode(BOOL dbClick,vector &OneTreeRoute,BOOL real = FALSE); BOOL TreeViewSelectAB(DWORD firstLevel, DWORD secondLevel); BOOL TreeViewSelectAB(DWORD firstLevel, INT secondLevel, BOOL Focus); bool TreeViewGetSelectedItemTitle(TCHAR *pszTitle); bool TreeViewMakeSelection(TCHAR *pszName); bool TreeViewMakeIdxChecked(DWORD Idx, BOOL Checked); bool TreeViewMakeChecked(TCHAR *pszName, BOOL Checked); bool TreeViewMakeCheckedItem(HTREEITEM hFound, BOOL Checked); bool TreeViewMakeCheckedAB(DWORD firstLevel, INT secondLevel); void Sethand(HWND Hand); //common BOOL IsObjectValid(); private: bool GetTreeViewNodeName(PVOID hItem, TCHAR *pszBuff); //BOOL HitSpecificTreeNode(BOOL dbClick,HTREEITEM &hItem,BOOL real); PVOID FindSpecificTreeNode(PVOID hItem, TCHAR *pszNodeName); }; class WindNode; class AUTOFUNC_API WindowObject { BOOL MakeParentTree(); //BOOL FilterWindowsByParent(vector &list1); public: WindowObject(void); virtual ~WindowObject(void); void ClearObject(); void ClearLocateData(); HWND GetLocatedHwnd(); POINT GetLocatedTopLeft(); const TCHAR* GetProcessName(); const TCHAR* GetTitle(); virtual BOOL LoadConfig(const TCHAR * pRFilePath); virtual INT LocateWindow(BOOL Visible = TRUE);//1 ok,0 multi,-1 ng virtual INT WaitLocateWindow(DWORD tmPeriod = NORMAL_WAIT_TM, BOOL Visible = TRUE, BOOL Exp = TRUE); INT IsObjectVisible();//-1:no hwnd,0:hide,1:show 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 virtual BOOL SendMessageTo(DWORD msg, DWORD wp, DWORD lp, BOOL sendFlag = TRUE); virtual BOOL MakeFocus(BOOL real = FALSE); virtual BOOL SetText(TCHAR *pContext, BOOL real = FALSE); virtual BOOL NotifyParentHitButton(); virtual BOOL ClickLB(BOOL real = FALSE); virtual BOOL MouseMove(BOOL real); BOOL DoClick(BOOL real = FALSE); virtual BOOL MouseMove(int x, int y, BOOL real = FALSE); virtual BOOL HitMouse(DWORD MsgType, DWORD ExKey, int x, int y, BOOL real = FALSE); virtual BOOL HitKey(DWORD vk, BOOL real = FALSE); virtual BOOL HitVKey(DWORD vk, BOOL real = FALSE); WindowObject &operator [](TCHAR *pID); WindowObject& operator = (WindNode &node); map *m_SubNodes; string *m_ConfigName; string *m_ID; string *m_Process; string *m_ReqTitle; string *m_ExistTitle; string *m_Class; INT m_Style; INT m_StyleEx; INT m_Width; INT m_Height; INT m_zOrder; DWORD m_GuiID; string *m_Dict; string *m_DictKey; DWORD m_DictRgb; RECT m_DictArea; WindowObject *m_pParent; //results HWND m_ResHwnd;//for search and result POINT m_ResDictKey; }; AUTOFUNC_C_API WindowObject* GetWindowObject(void); AUTOFUNC_C_API void ReleaseWindowObject(WindowObject* &pObj);