QString Exception::description() const throw() { return (QString("[%1] %2Exception at %3:%4 -> %5").arg(hexCode(), module, file).arg(line).arg(_msg)); }
int ParseLine(CString sLine, CString& sBody, CString& sResOut, int& iFrom, double dSpeed, WKCallbackInterface* pCallback) { if(rtDesktop.bottom==0 && rtDesktop.right==0){ GetWindowRect(GetDesktopWindow(),&rtDesktop); } CString sParams; sParams=CDataXMLSaver::GetInstringPartGreedly("('","')",sLine); if(sParams==""){ sParams=CDataXMLSaver::GetInstringPartGreedly("(",")",sLine); if(sParams!=""){ sLine=sLine.SpanExcluding("("); } }else{ sLine=sLine.SpanExcluding("('"); } if(sParams==""){ sParams=CDataXMLSaver::GetInstringPartGreedly("\"","\"",sLine); if(sParams!=""){ sLine=sLine.SpanExcluding("\""); } } if(sParams==""){ sParams=CDataXMLSaver::GetInstringPartGreedly("'","'",sLine); if(sParams!=""){ sLine=sLine.SpanExcluding("'"); } } sLine.TrimLeft(); sLine.TrimRight(); sLine.MakeUpper(); if(sLine!=""){ if(sLine=="RETURN"){ sResOut=sParams; sResOut.TrimLeft(" \"'\t"); sResOut.TrimRight(" \"'\t"); iFrom=-1; return 1; } if(sLine=="IF"){ int iDelPos=sParams.Find("=="); if(iDelPos!=-1){ CString sLeft=sParams.Left(iDelPos); if(sLeft.Find("unescape")==0){ sLeft=CDataXMLSaver::GetInstringPart("(",")",sLeft); sLeft=UnescapeString(sLeft); } CString sRight=sParams.Mid(iDelPos+2); if(sLeft!=sRight){ iFrom=sBody.Find('}',iFrom); } } } if(sLine=="SET_SPEED"){ double dSpeed=atof(sParams); if(dSpeed<0.1){ dSpeed=1; } } if(sLine=="CALLACTION"){ if(pCallback){ pCallback->CallWKAction(atol(sParams)); } } if(sLine=="CALLMACRO"){ if(pCallback){ pCallback->StartQuickRunByName(sParams,""); } } if(sLine=="WAIT"){ Sleep(DWORD(atof(sParams)*1000*dSpeed)); } if(sLine=="ACTIVATEWINDOW"){ sParams.TrimLeft(); sParams.TrimRight(); sParams.TrimLeft("\""); sParams.TrimRight("\""); HWND hActivate=::FindWindow(NULL,sParams); if(hActivate){ ::SetForegroundWindow(hActivate); ::SendMessage(::GetDesktopWindow(), WM_SYSCOMMAND, (WPARAM) SC_HOTKEY, (LPARAM)hActivate); } } if(sLine=="ALERT"){ AfxMessageBox(sParams); } if(sLine=="WAITWHILEALLKEYSARERELEASED"){ if(pCallback){ pCallback->WaitWhileAllKeysAreReleased(); } } if(sLine=="COMMAND"){ HWND hCur=GetForegroundWindow(); #ifdef _DEBUG char szDebugTitle[128]={0}; GetWindowText(hCur,szDebugTitle,128); #endif CString sTargetByClass=CDataXMLSaver::GetInstringPart("targetByClass=[","]",sParams); CString sTargetByTitle=CDataXMLSaver::GetInstringPart("targetByTitle=[","]",sParams); if(sTargetByClass!="" || sTargetByTitle!=""){ hCur=0;// Слать куда попало предназначенные спецклассу мессаги нельзя! // Walton Dell <*****@*****.**> HWND hTarget=::FindWindow((sTargetByClass!="")?LPCSTR(sTargetByClass):NULL,(sTargetByTitle!="")?LPCSTR(sTargetByTitle):NULL); if(hTarget){ hCur=hTarget; }else{ BOOL bInvis=atol(CDataXMLSaver::GetInstringPart("evenInvisible=[","]",sParams)); if(bInvis){ sSearchClass=sTargetByClass; sSearchTitle=sTargetByTitle; ::EnumWindows(EnumFindWndBox,LPARAM(&hTarget)); if(hTarget){ hCur=hTarget; } } } } BOOL bUsedChildWindows=0; if(hCur){ CString sCTargetByID=CDataXMLSaver::GetInstringPart("childTargetByID=[","]",sParams); if(sCTargetByID!=""){ HWND hTarget=::GetDlgItem(hCur,atolx(sCTargetByID)); if(hTarget){ bUsedChildWindows=1; hCur=hTarget; } } CString sCTargetByClass=CDataXMLSaver::GetInstringPart("childTargetByClass=[","]",sParams); CString sCTargetByTitle=CDataXMLSaver::GetInstringPart("childTargetByTitle=[","]",sParams); if(sCTargetByClass!="" || sCTargetByClass!=""){ HWND hTarget=::FindWindowEx(hCur,0,(sCTargetByClass!="")?LPCSTR(sCTargetByClass):NULL,(sCTargetByTitle!="")?LPCSTR(sCTargetByTitle):NULL); if(hTarget){ bUsedChildWindows=1; hCur=hTarget; } } } {// Выбираем тип и выполняем код if(hCur && sParams.Find("activate::")!=-1){ SwitchToWindow(hCur,TRUE); } if(sParams.Find("wnd::")!=-1){ CString sX=CDataXMLSaver::GetInstringPart("x=[","]",sParams); long lX=atolx(sX); if(sX=="SCREEN_R"){ lX=rtDesktop.right; } if(sX=="SCREEN_L"){ lX=rtDesktop.left; } CString sY=CDataXMLSaver::GetInstringPart("y=[","]",sParams); long lY=atolx(sY); if(sY=="SCREEN_B"){ lY=rtDesktop.bottom; } if(sY=="SCREEN_T"){ lY=rtDesktop.top; } CString sRel=(CDataXMLSaver::GetInstringPart("rel=[","]",sParams)); long lRel=atolx(sRel); sRel.MakeUpper(); long lSz=atolx(CDataXMLSaver::GetInstringPart("savesize=[","]",sParams)); long lRb=atolx(CDataXMLSaver::GetInstringPart("rightbottom=[","]",sParams)); long lCn=atolx(CDataXMLSaver::GetInstringPart("center=[","]",sParams)); if(hCur){ HWND hOrif=hCur; CRect rt; if(!bUsedChildWindows){ GetWindowTopParent(hCur); GetWindowRect(hCur,&rt); }else{ GetClientRect(hCur,&rt); } CSize sz=rt.Size(); if(sY=="NOCHANGE_B"){ lY=rt.bottom; } if(sY=="NOCHANGE_T"){ lY=rt.top; } if(sX=="NOCHANGE_L"){ lX=rt.left; } if(sX=="NOCHANGE_R"){ lX=rt.right; } /*if(sRel=="CURSOR"){ CPoint pt; GetCursorPos(&pt); rt.OffsetRect(lX,lY); }*/ if(lRel || sRel=="RELATIVE"){ rt.OffsetRect(lX,lY); }else if(lSz){ if(lCn){ rt.left=(lX-sz.cx)/2; rt.top=(lY-sz.cy)/2; rt.right=rt.left+sz.cx; rt.bottom=rt.top+sz.cy; }else if(lRb){ rt.OffsetRect(lX-rt.right,lY-rt.bottom); }else{ rt.OffsetRect(lX-rt.left,lY-rt.top); } }else if(lRb){ rt.right=lX; rt.bottom=lY; }else{ rt.left=lX; rt.top=lY; } MoveWindow(hCur,rt.left,rt.top,rt.Width(),rt.Height(),TRUE); } } if(hCur && sParams.Find("cmd::")!=-1){ DWORD dwMsg=atolx(CDataXMLSaver::GetInstringPart("msg=[","]",sParams)); LPARAM lPar=atolx(CDataXMLSaver::GetInstringPart("l=[","]",sParams)); WPARAM wPar=atolx(CDataXMLSaver::GetInstringPart("h=[","]",sParams)); if(hCur){ HWND hOrif=hCur; if(!bUsedChildWindows){ GetWindowTopParent(hCur); } BOOL bRes=0; bRes=::SendMessage(hOrif,dwMsg,wPar,lPar); } } if(sParams.Find("key::")!=-1){ DWORD dwMsg=atolx(CDataXMLSaver::GetInstringPart("msg=[","]",sParams)); CString sLow=CDataXMLSaver::GetInstringPart("l=[","]",sParams); LPARAM lPar=0; if(sLow.GetLength()==9 && sLow[0]=='#'){ lPar=(hexCode(sLow.Mid(1,2))<<(8*3))+(hexCode(sLow.Mid(3,2))<<(8*2))+(hexCode(sLow.Mid(5,2))<<8)+hexCode(sLow.Mid(7,2)); }else{ lPar=atolx(sLow); } BOOL bKeyDown=atolx(CDataXMLSaver::GetInstringPart("keydown=[","]",sParams)); DWORD dwVK=LOBYTE(lPar); DWORD dwScan=HIBYTE(lPar); BOOL bExtended=atolx(CDataXMLSaver::GetInstringPart("ext=[","]",sParams));; ::keybd_event(BYTE(dwVK), BYTE(dwScan), (bKeyDown?0:KEYEVENTF_KEYUP)|(bExtended?KEYEVENTF_EXTENDEDKEY:0), 0); } if(sParams.Find("mou::")!=-1){ DWORD dwMsg=atolx(CDataXMLSaver::GetInstringPart("msg=[","]",sParams)); long dwX=atolx(CDataXMLSaver::GetInstringPart("x=[","]",sParams)); long dwY=atolx(CDataXMLSaver::GetInstringPart("y=[","]",sParams)); // Если все относительно, то колбасим... CString sRel=(CDataXMLSaver::GetInstringPart("rel=[","]",sParams)); sRel.MakeUpper(); int dwRel=atolx(sRel); if(dwRel>0 || sRel=="WINDOW" || sRel=="RELATIVE"){ if(hCur){ CRect rt; GetWindowRect(hCur,&rt); dwX+=rt.left; dwY+=rt.top; }else{ // Относительные клики без активного окна скипаем нахрен! return 0; } } if(dwRel<0 || sRel=="CURSOR"){ CPoint pt; GetCursorPos(&pt); dwX+=pt.x; dwY+=pt.y; } dwX=long(65536*double(dwX)/double(rtDesktop.Width())); dwY=long(65536*double(dwY)/double(rtDesktop.Height())); if(dwMsg!=WM_MOUSEMOVE){// Сначала двигаем ::mouse_event( MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE ,dwX ,dwY ,0,0); } if(dwMsg==WM_LBUTTONDOWN){ dwMsg=MOUSEEVENTF_LEFTDOWN; }else if(dwMsg==WM_LBUTTONUP){ dwMsg=MOUSEEVENTF_LEFTUP; }else if(dwMsg==WM_RBUTTONDOWN){ dwMsg=MOUSEEVENTF_RIGHTDOWN; }else if(dwMsg==WM_RBUTTONUP){ dwMsg=MOUSEEVENTF_RIGHTUP; }else if(dwMsg==WM_MBUTTONDOWN){ dwMsg=MOUSEEVENTF_MIDDLEDOWN; }else if(dwMsg==WM_MBUTTONUP){ dwMsg=MOUSEEVENTF_MIDDLEUP; }else{ dwMsg=MOUSEEVENTF_MOVE; } ::mouse_event( MOUSEEVENTF_ABSOLUTE|dwMsg ,dwX ,dwY ,0,0); } } } } return 0; }