BOOL CDlg_AppInfo::OnInitDialog() { CDialog::OnInitDialog(); Sizer.InitSizer(this,objSettings.iStickPix,HKEY_CURRENT_USER,PROG_REGKEY"\\Wnd_AppInfo"); Sizer.SetOptions(STICKABLE|SIZEABLE); CRect minRect(0,0,260,100); Sizer.SetMinRect(minRect); Sizer.AddDialogElement(IDOK,widthSize|heightSize); Sizer.AddDialogElement(IDC_EDIT,0); Sizer.AddDialogElement(ID_OPEN,widthSize|heightSize); Sizer.AddDialogElement(ID_WNDS,widthSize|heightSize|hidable); Sizer.AddLeftTopAlign(IDC_EDIT,0,4); Sizer.AddRightTopAlign(IDC_EDIT,0,4); Sizer.AddRightBottomAlign(IDOK,0,-4); Sizer.AddBottomAlign(ID_OPEN,0,-4); Sizer.AddBottomAlign(ID_WNDS,0,-4); Sizer.AddRightAlign(ID_OPEN,IDOK,leftPos,-4); Sizer.AddRightAlign(ID_WNDS,ID_OPEN,leftPos,-4); Sizer.AddBottomAlign(IDC_EDIT,IDOK,topPos,-4); SetWindowText(_l("Application info")); GetDlgItem(ID_OPEN)->SetWindowText(_l("Application folder")); GetDlgItem(ID_WNDS)->SetWindowText(_l("Actions")+"..."); SetIcon(theApp.MainImageList.ExtractIcon(13),TRUE); SetIcon(theApp.MainImageList.ExtractIcon(13),FALSE); SetTaskbarButton(this->GetSafeHwnd()); SwitchToWindow(this->GetSafeHwnd()); return TRUE; }
void ShowProcessList() { static bool Active = false; if (Active) return; Active = true; SCOPE_EXIT{ Active = false; }; const auto ProcList = VMenu2::create(msg(lng::MProcessListTitle), {}, ScrY - 4); ProcList->SetMenuFlags(VMENU_WRAPMODE); ProcList->SetPosition({ -1, -1, 0, 0 }); bool ShowImage = false; const auto FillProcList = [&] { ProcList->clear(); ProcInfo Info{ ProcList.get(), ShowImage }; if (!EnumWindows(EnumWindowsProc, reinterpret_cast<LPARAM>(&Info))) { rethrow_if(Info.ExceptionPtr); return false; } ProcList->SortItems([](const MenuItemEx& a, const MenuItemEx& b, SortItemParam&) { return string_sort::less(std::any_cast<const menu_data&>(a.ComplexUserData).Title, std::any_cast<const menu_data&>(b.ComplexUserData).Title); }); return true; }; if (!FillProcList()) return; ProcList->AssignHighlights(FALSE); ProcList->SetBottomTitle(msg(lng::MProcessListBottom)); ProcList->Run([&](const Manager::Key& RawKey) { const auto Key=RawKey(); int KeyProcessed = 1; switch (Key) { case KEY_F1: help::show(L"TaskList"sv); break; case KEY_NUMDEL: case KEY_DEL: { if (const auto MenuData = ProcList->GetComplexUserDataPtr<menu_data>()) { if (Message(MSG_WARNING, msg(lng::MKillProcessTitle), { msg(lng::MAskKillProcess), MenuData->Title, msg(lng::MKillProcessWarning) }, { lng::MKillProcessKill, lng::MCancel }) == Message::first_button) { const os::handle Process(OpenProcess(PROCESS_TERMINATE, FALSE, MenuData->Pid)); if (!Process || !TerminateProcess(Process.native_handle(), 0xFFFFFFFF)) { const auto ErrorState = error_state::fetch(); Message(MSG_WARNING, ErrorState, msg(lng::MKillProcessTitle), { msg(lng::MCannotKillProcess) }, { lng::MOk }); } } } } [[fallthrough]]; case KEY_CTRLR: case KEY_RCTRLR: { if (!FillProcList()) ProcList->Close(-1); break; } case KEY_F2: { // TODO: change titles, don't enumerate again ShowImage = !ShowImage; const auto SelectPos = ProcList->GetSelectPos(); if (!FillProcList()) { ProcList->Close(-1); } else { ProcList->SetSelectPos(SelectPos); } break; } default: KeyProcessed = 0; } return KeyProcessed; }); if (ProcList->GetExitCode() < 0) return; const auto MenuData = ProcList->GetComplexUserDataPtr<menu_data>(); if (!MenuData) return; SwitchToWindow(MenuData->Hwnd); }
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; }