Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Прозрачность некоторых системных форм (число прочтений - 4591 )
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Прозрачность некоторых системных форм
20. Февраля 2008 :: 07:26
Печать  
По следам темы http://www.1cpp.ru/forum/YaBB.pl?num=1183482682/9

Некоторые части некоторых системных форм "прозрачны" для мышиных событий FormEx.
Тест: открываем приложенную обработку, затем открываем окно "Сервис / Параметры...", размещаем окно над тестовой формой, и начинаем тыкать мышкой в разные места окна настроек. При тыкании в элементы дилога,  типа Edit'ов или CheckBox'ов  сообщение "просачивается" из окна настроек в тестовое окно. При тыкании на пустое место или Static сообщение не просачивается.

Очень хотелось бы как-то исправить такое поведение.  Если это вообще возможно.

У нас это вылезло следующим образом: на форме документа есть текст, при тыкании в этот текст открывается модальная форма редактирования реквизитов шапки документа. Если записываем новый документ, то вылазит окошко ввода времени для нового документа.  Если кнопка ОК этого окошка оказывается над текстом, то открывается окошко с реквизитами шапки, мы его закрываем, и на этом всё - система перестаёт вообще реагировать на что-либо.  Жуткое дело.
  

FormExTest_SysFormsTransparency.ert ( 5 KB | Загрузки )
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Прозрачность некоторых системных форм
Ответ #1 - 20. Февраля 2008 :: 07:33
Печать  
  
Наверх
 
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1532
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Прозрачность некоторых системных форм
Ответ #2 - 20. Февраля 2008 :: 09:09
Печать  
Это давнишняя проблема. Я пытался ее победить, но пока безуспешно. Похоже, не удается все варианты окон описать при движении мыши.
  

FormEx developer
Наверх
www  
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Прозрачность некоторых системных форм
Ответ #3 - 20. Февраля 2008 :: 09:10
Печать  
А если не движения, а, хотя бы, клик и даблклик?
  
Наверх
 
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1532
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Прозрачность некоторых системных форм
Ответ #4 - 20. Февраля 2008 :: 09:12
Печать  
Так там все одно какое событие отрабатывать. Код-то один на определение контекста окна. Наверное, надо будет попробовать поставить просто заглушки на определенные типы окон.
  

FormEx developer
Наверх
www  
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Прозрачность некоторых системных форм
Ответ #5 - 20. Февраля 2008 :: 09:16
Печать  
А может быть хотя бы паллиативное решение сделать, типа того что описано в предыдущей ветке?  Т.е. получать активное модальное окно и сравнивать его с окном формы в событии?
  
Наверх
 
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1532
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Прозрачность некоторых системных форм
Ответ #6 - 20. Февраля 2008 :: 09:18
Печать  
Вот код отработки события мыши. Может вы чего подскажите?

Код
Выбрать все
LRESULT __stdcall Mouse_Hook(int code, WPARAM wParam, LPARAM lParam)
{
//	CBLModule* pExeMod = CBLModule::GetExecutedModule();

	LRESULT ret = 0;
	if((code>=0) && /*(pExeMod == NULL)*/ (bStopHook == false))
	{
		PMOUSEHOOKSTRUCT mStruct;
		mStruct = (PMOUSEHOOKSTRUCT)lParam;
		POINT pt;
		pt.x = mStruct->pt.x;
		pt.y = mStruct->pt.y;

		CWnd* pWnd = CWnd::FromHandle(mStruct->hwnd);
		if(pWnd)
		{
			if(pWnd->IsKindOf(RUNTIME_CLASS(CGetDlg)) || pWnd->IsKindOf(RUNTIME_CLASS(CDialog)));
			else
			{
				CWnd* pPWnd = pWnd->GetParent();
				bool f = true;
				while(pPWnd && f)
				{
					if(!pPWnd->IsKindOf(RUNTIME_CLASS(CDialog)) &&
						!pPWnd->IsKindOf(RUNTIME_CLASS(CGetDlg)))
						pPWnd = pPWnd->GetParent();
					else
						f = false;
				}
				if(f == false)
				{
					if(pPWnd && pPWnd->IsKindOf(RUNTIME_CLASS(CGetDlg)))
						pWnd = pPWnd;
					else
						pWnd = NULL;
				}
			}
		}

		if(pWnd == NULL)
		{
			CMDIFrameWnd * pMainFrame = GetMainFrame();
			POINT pt1;
			pt1.x = pt.x;
			pt1.y = pt.y;
			CWnd* pWnd_1 = pMainFrame;
			while(pWnd_1)
			{
				pWnd_1->ScreenToClient(&pt1);
				pWnd = pWnd_1->ChildWindowFromPoint(pt1);
				pWnd_1->ClientToScreen(&pt1);
				if((pWnd == NULL) || (pWnd == pWnd_1))
				{
					pWnd = pWnd_1;
					pWnd_1 = NULL;
				}
				else
					pWnd_1 = pWnd;
			}

			if(pWnd == NULL)
				pWnd = CWnd::FromHandle(mStruct->hwnd);
		}

		if(pWnd)
		{
			CGetDoc7* pDoc7 = NULL;
			if(pWnd->IsKindOf(RUNTIME_CLASS(CGetDlg))) //CString("CGetDlg") == pWnd->GetRuntimeClass()->m_lpszClassName)
			{
				//pDoc7 = CGetDlg::GetTopmostDocunent();
				pDoc7 = ((CGetDlg*)pWnd)->m_pDoc;
				if((pDoc7 != NULL) && (pDoc7->GetFrame() != pWnd))
					pDoc7 = NULL;

			}
			else if(!pWnd->IsKindOf(RUNTIME_CLASS(CTabFrame))) //CString("CTabFrame") != pWnd->GetRuntimeClass()->m_lpszClassName)
			{
				CWnd* pPWnd = pWnd->GetParent();
				bool f = true;
				while(pPWnd && f)
				{
					if(!pPWnd->IsKindOf(RUNTIME_CLASS(CTabFrame)) && //(CString("CTabFrame") != pPWnd->GetRuntimeClass()->m_lpszClassName) &&
						!pPWnd->IsKindOf(RUNTIME_CLASS(CGetDlg)) &&
						!pPWnd->IsKindOf(RUNTIME_CLASS(CDialog))) //(CString("CGetDlg") != pPWnd->GetRuntimeClass()->m_lpszClassName))
						pPWnd = pPWnd->GetParent();
					else
						f = false;
				}
				if(pPWnd)
				{
					if(pPWnd->IsKindOf(RUNTIME_CLASS(CTabFrame)))//CString("CTabFrame") == pPWnd->GetRuntimeClass()->m_lpszClassName)
						//pDoc7 = (CGetDoc7*)((CTabFrame*)pPWnd)->GetActiveDocument();
					{
						CView* pView7 = ((CTabFrame*)pPWnd)->GetActiveView();
						if(pView7)
							pDoc7 = (CGetDoc7*)pView7->GetDocument();
						else
							pDoc7 = (CGetDoc7*)((CTabFrame*)pPWnd)->GetActiveDocument();
					}
					else if(pPWnd->IsKindOf(RUNTIME_CLASS(CGetDlg)))//CString("CGetDlg") == pPWnd->GetRuntimeClass()->m_lpszClassName)
					{
						pDoc7 = ((CGetDlg*)pPWnd)->m_pDoc;
						//pDoc7 = CGetDlg::GetTopmostDocunent();
						if(pDoc7->GetFrame() != pPWnd)
							pDoc7 = NULL;
					}
					else
					{
						pDoc7 = NULL;
					}
				}
			}
			else
				pDoc7 = (CGetDoc7*)((CTabFrame*)pWnd)->GetActiveDocument();

			//if(pDoc7)
			if((pDoc7 == NULL) || 7")))
			{
				UINT nKeyState = 0;
				short sKeyState = GetKeyState(VK_SHIFT);
				if(sKeyState & 0x80) nKeyState |= MK_SHIFT;

				sKeyState = GetKeyState(VK_LBUTTON);
				if(sKeyState & 0x80) nKeyState |= MK_LBUTTON;

				sKeyState = GetKeyState(VK_RBUTTON);
				if(sKeyState & 0x80) nKeyState |= MK_RBUTTON;

				sKeyState = GetKeyState(VK_MBUTTON);
				if(sKeyState & 0x80) nKeyState |= MK_MBUTTON;

				sKeyState = GetKeyState(VK_CONTROL);
				if(sKeyState & 0x80) nKeyState |= MK_CONTROL;

				CWnd* pView = NULL;
				if(pDoc7)
				{
// 					POSITION aPOS = ((CDocument*)pDoc7)->GetFirstViewPosition();
// 					pView = (CWnd*)((CDocument*)pDoc7)->GetNextView(aPOS);
					pView = GetFormView(pDoc7);
					if(pView == NULL)
						pView = pDoc7->GetFrame();
				}
				else
					pView = GetMainFrame();

				if(pView)
					pView->ScreenToClient(&pt);

				CValue Flags = nKeyState;
				CValue x = pt.x;
				CValue y = pt.y;
				CValue r = 1;
				CValue d = 0L;
				CValue *lArray[5] = {&Flags, &x, &y, &r, &d};

				bStopHook = true;
 


  

FormEx developer
Наверх
www  
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1532
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Прозрачность некоторых системных форм
Ответ #7 - 20. Февраля 2008 :: 09:20
Печать  
Код
Выбрать все
				switch (wParam)
				{
					case WM_MOUSEMOVE:
					case WM_NCMOUSEMOVE:
						{
							//_CallModuleProc(pDoc7,"ПриДвиженииМыши","OnMouseMove", 4, lArray);
// 							if (CEventsManager::GetManager().IsHandlerExists(pDoc7, meOnMouseMove))
								CEventsManager::GetManager().SendEvent(pDoc7, meOnMouseMove, lArray);
							break;
						}
					case WM_NCRBUTTONDOWN:
					case WM_RBUTTONDOWN:
						{
							//_CallModuleProc(pDoc7,"ПриНажатииПравойКнопки","OnRButtonDown", 4, lArray);
// 							if (CEventsManager::GetManager().IsHandlerExists(pDoc7, meOnRButtonDown))
								CEventsManager::GetManager().SendEvent(pDoc7, meOnRButtonDown, lArray);
							break;
						}
					case WM_NCRBUTTONUP:
					case WM_RBUTTONUP:
						{
							//_CallModuleProc(pDoc7,"ПриОтжатииПравойКнопки","OnRButtonUp", 4, lArray);
// 							if (CEventsManager::GetManager().IsHandlerExists(pDoc7, meOnRButtonUp))
								CEventsManager::GetManager().SendEvent(pDoc7, meOnRButtonUp, lArray);
							break;
						}
					case WM_NCRBUTTONDBLCLK:
					case WM_RBUTTONDBLCLK:
						{
							//_CallModuleProc(pDoc7,"ПриДвойномНажатииПравойКнопки","OnRButtonDblClk", 4, lArray);
// 							if (CEventsManager::GetManager().IsHandlerExists(pDoc7, meOnRButtonDblClk))
								CEventsManager::GetManager().SendEvent(pDoc7, meOnRButtonDblClk, lArray);
							break;
						}
					case WM_NCLBUTTONDOWN:
					case WM_LBUTTONDOWN:
						{
							//_CallModuleProc(pDoc7,"ПриНажатииЛевойКнопки","OnLButtonDown", 4, lArray);
// 							if (CEventsManager::GetManager().IsHandlerExists(pDoc7, meOnLButtonDown))
								CEventsManager::GetManager().SendEvent(pDoc7, meOnLButtonDown, lArray);
							break;
						}
					case WM_NCLBUTTONUP:
					case WM_LBUTTONUP:
						{
							//_CallModuleProc(pDoc7,"ПриОтжатииЛевойКнопки","OnLButtonUp", 4, lArray);
// 							if (CEventsManager::GetManager().IsHandlerExists(pDoc7, meOnLButtonUp))
								CEventsManager::GetManager().SendEvent(pDoc7, meOnLButtonUp, lArray);
							break;
						}
					case WM_NCLBUTTONDBLCLK:
					case WM_LBUTTONDBLCLK:
						{
							//_CallModuleProc(pDoc7,"ПриДвойномНажатииЛевойКнопки","OnLButtonDblClk", 4, lArray);
// 							if (CEventsManager::GetManager().IsHandlerExists(pDoc7, meOnLButtonDblClk))
								CEventsManager::GetManager().SendEvent(pDoc7, meOnLButtonDblClk, lArray);
							break;
						}
					case WM_NCMBUTTONDOWN:
					case WM_MBUTTONDOWN:
						{
							//_CallModuleProc(pDoc7,"ПриНажатииСреднейКнопки","OnMButtonDown", 4, lArray);
// 							if (CEventsManager::GetManager().IsHandlerExists(pDoc7, meOnMButtonDown))
								CEventsManager::GetManager().SendEvent(pDoc7, meOnMButtonDown, lArray);
							break;
						}
					case WM_NCMBUTTONUP:
					case WM_MBUTTONUP:
						{
							//_CallModuleProc(pDoc7,"ПриОтжатииСреднейКнопки","OnMButtonUp", 4, lArray);
// 							if (CEventsManager::GetManager().IsHandlerExists(pDoc7, meOnMButtonUp))
								CEventsManager::GetManager().SendEvent(pDoc7, meOnMButtonUp, lArray);
							break;
						}
					case WM_NCMBUTTONDBLCLK:
					case WM_MBUTTONDBLCLK:
						{
							//_CallModuleProc(pDoc7,"ПриДвойномНажатииСреднейКнопки","OnMButtonDblClk", 4, lArray);
// 							if (CEventsManager::GetManager().IsHandlerExists(pDoc7, meOnMButtonDblClk))
								CEventsManager::GetManager().SendEvent(pDoc7, meOnMButtonDblClk, lArray);
							break;
						}
					case WM_MOUSEWHEEL:
						{
							//WHEEL_DELTA
							d = (short)HIWORD(((PMOUSEHOOKSTRUCT_EX)mStruct)->dwData);

							//_CallModuleProc(pDoc7,"ПриПрокруткеКолесаМыши","OnMouseWheel", 5, lArray);
// 							if (CEventsManager::GetManager().IsHandlerExists(pDoc7, meOnMouseWheel))
								CEventsManager::GetManager().SendEvent(pDoc7, meOnMouseWheel, lArray);
							break;
						}
				}
				bStopHook = false;
				if(r.GetNumeric() == 0) ret = 1;
			}
		}
		if(ret == 1) CallNextHookEx(MouseHookHandle, code, wParam, lParam);
		else ret = CallNextHookEx(MouseHookHandle, code, wParam, lParam);
		//CallNextHookEx(MouseHookHandle, code, wParam, lParam);
	}
	else
		ret = CallNextHookEx(MouseHookHandle, code, wParam, lParam);
	//if(ret == 1) CallNextHookEx(MouseHookHandle, code, wParam, lParam);
	//else ret = CallNextHookEx(MouseHookHandle, code, wParam, lParam);
	return ret;
}

 

  

FormEx developer
Наверх
www  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Прозрачность некоторых системных форм
Ответ #8 - 24. Июня 2008 :: 11:02
Печать  
Да, данное поведение является 100% багом.
И я нашел, где его исправить.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Прозрачность некоторых системных форм
Ответ #9 - 24. Июня 2008 :: 11:09
Печать  
п.1 - гуд!
п.2 - ХЗ - мне вроде и не надо...
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Прозрачность некоторых системных форм
Ответ #10 - 24. Июня 2008 :: 11:22
Печать  
Arta писал(а) 24. Июня 2008 :: 11:09:
п.1 - гуд!
п.2 - ХЗ - мне вроде и не надо...

в этих пунктах я ошибся Печаль
Этот баг актуален именно для мышиных событий, там используется спец.механизм поиска окна по координатам и его хендлу.
А сейчас я хочу отключить выдачу мышиных событий, если текущее окно является системным + модальным.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Прозрачность некоторых системных форм
Ответ #11 - 24. Июня 2008 :: 14:04
Печать  
Пофиксил баг.
Выкладываю тестовую сборку ФормЕкс.
Прошу заинтересованных лиц проверить сборку и сообщить о результатах.
  

FormExArtbear88_4_240608.rar ( 183 KB | Загрузки )

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Прозрачность некоторых системных форм
Ответ #12 - 24. Июня 2008 :: 14:10
Печать  
В общем, написал спец.функцию
Код
Выбрать все
bool VerifyActiveWindowIsModalSystemWindow()
{
	CMDIFrameWnd * pMainFrame1 = GetMainFrame();
	CWnd* pActiveWnd = pMainFrame1->GetActiveWindow();

	if(!pMainFrame1 || !pActiveWnd) // pActiveWnd = NULL, если над окном 1С открыто немодальное окно от другого приложения
		return false;

	if(pMainFrame1->GetSafeHwnd() != pActiveWnd->GetSafeHwnd())
		if (pActiveWnd->ContinueModal())
			return true;

	return false;
}
 


которая и решила проблему Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Прозрачность некоторых системных форм
Ответ #13 - 24. Июня 2008 :: 14:14
Печать  
artbear писал(а) 24. Июня 2008 :: 14:08:
В общем, написал спец.функцию
Код
Выбрать все
潢汯嘠牥晩䅹瑣癩坥湩潤䥷䵳摯污祓瑳浥楗摮睯⤨਍ൻऊ䵃䥄牆浡坥摮⨠瀠慍湩牆浡ㅥ㴠䜠瑥慍湩牆浡⡥㬩਍䌉湗⩤瀠捁楴敶湗⁤‽䵰楡䙮慲敭ⴱ䜾瑥捁楴敶楗摮睯⤨഻ऊ਍椉⡦瀡慍
湩牆浡ㅥ簠⁼瀡捁楴敶湗⥤⼠ 䅰瑣癩坥摮㴠丠䱕ⱌ⃨⃤⃬턱ﯰ⃮෿ऊ爉瑥牵慦獬㭥਍ഉऊ晩瀨慍湩牆浡ㅥ㸭敇却晡䡥湷
⡤
㴡瀠捁楴敶湗ⵤ䜾瑥慓敦睈摮⤨ഩऊ椉⁦瀨捁楴敶湗ⵤ䌾湯楴畮䵥摯污⤨ഩऊउ敲畴湲琠畲㭥਍਍爉瑥牵慦獬㭥਍ൽ 

которая и решила проблему Улыбка

Артур перепрофилировался  Смех
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Прозрачность некоторых системных форм
Ответ #14 - 24. Июня 2008 :: 19:52
Печать  
artbear писал(а) 24. Июня 2008 :: 14:04:
Прошу заинтересованных лиц проверить сборку и сообщить о результатах.


Фунициклирует!  Очень довольный

Сенкс!


P.S. Замечено, чем больше народа пожалуется на баг - тем быстрее за него возьмется Артур  Смех
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать