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;
}
Beispiel #2
0
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;
}