Переключение на Главную Страницу Страницы: 1 2 [3] 4 5  ОтправитьПечать
Очень популярная тема (более 25 ответов) Как определить, что кликнули на пустом месте? (число прочтений - 18804 )
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Как определить, что кликнули на пустом месте?
Ответ #30 - 23. Сентября 2013 :: 14:12
Печать  
alyuev писал(а) 23. Сентября 2013 :: 09:07:
На одной из машин, на которой Win Serv 2003 класс выдает такую ошибку:

"КлассОкна=класс.ПолучитьКлассОкна();
{Глобальный модуль(63404)}: DWX.ClickOnWindow::ПолучитьКлассОкна() : Microsoft VBScript runtime error: Object doesn't support this property or method: 'Wrap.GetCursorPos'
Возврат ScrptCtrl.Run("GetClassName");
{D:\copy\CopyAC\ACIni\Classes\Systems\DWX.ClickOnWindow.ert(83) }"

С чем бы это могло быть связано?


Вот оказывается с чем - для WindowFromPhysicalPoint function

Minimum supported client      Windows Vista [desktop apps only]
Minimum supported server      Windows Server 2008 [desktop apps only]

  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Как определить, что кликнули на пустом месте?
Ответ #31 - 23. Сентября 2013 :: 14:17
Печать  
Замени на WindowFromPoint в 2 местах.
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 855
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Как определить, что кликнули на пустом месте?
Ответ #32 - 23. Сентября 2013 :: 15:04
Печать  
Как всегда - снимаю шляпу!
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 855
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Как определить, что кликнули на пустом месте?
Ответ #33 - 01. Октября 2013 :: 10:55
Печать  
Появился еще вопрос: как получить hwnd для MDIClient?
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Как определить, что кликнули на пустом месте?
Ответ #34 - 01. Октября 2013 :: 13:41
Печать  
alyuev писал(а) 01. Октября 2013 :: 10:55:
Появился еще вопрос: как получить hwnd для MDIClient?


Во Frame.dll есть экспортная
class CMDIFrameWnd * __cdecl GetMainFrame(void)
вроде она возвращает именно его. Сорри, там указатель на CWND. По смещению +20h лежит хэндл.
Это первый вариант.

Второй - я показывал, как получить хэндл приложения - натрави на него GetWindow.

  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 855
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Как определить, что кликнули на пустом месте?
Ответ #35 - 01. Октября 2013 :: 13:55
Печать  
Я пока сделал так:

Код
Выбрать все
    Враппер = СоздатьОбъект("DynamicWrapper");
    Враппер.Register("user32.dll",	"FindWindowExA",			"i=llsl",	"f=s", "r=l");
    Враппер.Register("user32.dll",	"FindWindowW",				"i=ll",		"f=s", "r=l");
    Враппер.Register("user32.dll",	"GetWindow",				"i=ll",		"f=s", "r=l");
    Враппер.Register("user32.dll",	"GetParent",				"i=l",		"f=s", "r=l");
    Враппер.Register("User32.dll",	"GetWindowThreadProcessId",	"i=ll",		"f=s", "r=l");
    Враппер.Register("kernel32.dll", "GetCurrentThreadId", "f=s", "r=l");
    Хендл = Враппер.FindWindowW(0, 0);
    Пока Хендл <> 0 Цикл
	  Если Враппер.GetParent(Хендл)=0 Тогда
		Нить=Враппер.GetWindowThreadProcessId(Хендл, 0);
		Если Нить=Враппер.GetCurrentThreadId() Тогда
		    Прервать;
		КонецЕсли;
	  КонецЕсли;
	  Хендл = Враппер.GetWindow(Хендл, 2);
    КонецЦикла;
   Дескриптор_MDIClient=Враппер.FindWindowExA(Хендл,0,"MDIClient",0);
   Возврат Дескриптор_MDIClient; 

  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 855
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Как определить, что кликнули на пустом месте?
Ответ #36 - 01. Октября 2013 :: 14:43
Печать  
Код
Выбрать все
Функция Дескриптор1С()
   Wrap = СоздатьОбъект("DynamicWrapperX");
   Wrap.Register("Kernel32", "GetProcAddress" , "i=hl", "r=u");
   Wrap.Register("Kernel32", "LoadLibrary"    , "i=s" , "r=h");
   handle  = Wrap.LoadLibrary("mfc42");
   func    = Wrap.GetProcAddress(handle, 6575); //AfxGetMainWnd(void)
   Wrap.RegisterAddr(func, "AfxGetMainWnd", "r=l");

   h1C = Wrap.NumGet(Wrap.AfxGetMainWnd(), 32);
   Возврат h1C;
КонецФункции

Функция ДескрипторMDIClient()
    Враппер = СоздатьОбъект("DynamicWrapper");
    Враппер.Register("user32.dll",	"FindWindowExA",			"i=llsl",	"f=s", "r=l");
    Враппер.Register("user32.dll",	"GetWindow",				"i=ll",		"f=s", "r=l");
    Хендл = Враппер.GetWindow(Дескриптор1С(), 2);
    MDI=Враппер.FindWindowExA(Хендл,0,"MDIClient",0);
    Возврат MDI;
КонецФункции
 



ДескрипторMDIClient() - возращает 0
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Как определить, что кликнули на пустом месте?
Ответ #37 - 01. Октября 2013 :: 17:12
Печать  
А зачем Find используешь?
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Как определить, что кликнули на пустом месте?
Ответ #38 - 02. Октября 2013 :: 07:11
Печать  
А в GetWindow нужно использовать GW_CHILD 5
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Как определить, что кликнули на пустом месте?
Ответ #39 - 02. Октября 2013 :: 07:28
Печать  
На счет GetMainFrame был неправ (уже забыл). Она возвращает указатель на CWND приложения.


Вот скритп, возвращающий хэндл главного окна и MDI

Код
Выбрать все
	ТекстМодуля = "
		|Public Const GW_CHILD					= &h5
		|
		|Set Wrap = CreateObject(""DynamicWrapperX"")
		|Wrap.Register ""kernel32"", ""LoadLibrary"" 	,	""i=s"", ""r=h""
		|Wrap.Register ""kernel32"", ""GetProcAddress"" ,	""i=hs"", ""r=u""
		|Wrap.Register ""user32"", ""GetWindow""	, ""i=hl"", ""r=l""
		|
		|handle  = Wrap.LoadLibrary(""frame"")
		|func    = Wrap.GetProcAddress(handle, ""?GetMainFrame@@YAPAVCMDIFrameWnd@@XZ"") 'GetMainFrame(void)
		|r 	= Wrap.RegisterAddr(func, ""GetMainFrame"", ""f=s"", ""r=p"")
		|h1C	  = Wrap.NumGet(Wrap.GetMainFrame(), 32)
		|
		|MsgBox Hex(h1C)
		|
		|hMDI = Wrap.GetWindow(h1C, GW_CHILD)
		|
		|MsgBox Hex(hMDI)
		|";
 

  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 855
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Как определить, что кликнули на пустом месте?
Ответ #40 - 02. Октября 2013 :: 10:30
Печать  
hMDI - выдает неправильный результат.

Я сравниваю со своим вариантом http://www.1cpp.ru/forum/YaBB.pl?num=1378885783/35#35, где нахожу дескриптор для MDIClient. Далее я, используя дескриптор, нахожу координаты ЛВПН.
Сравнивая результаты вижу, что твой вариант выдает другой дескриптор.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Как определить, что кликнули на пустом месте?
Ответ #41 - 02. Октября 2013 :: 10:42
Печать  
так то там чайлдов (у фрейма главного окна) кроме МДИКлиента еще 6 штук: 4 контролбара, статусбар и панел окон
может быть в этом дело?
хотя МДИКлиент вроде бы всегда первый
  

1&&2&&3
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Как определить, что кликнули на пустом месте?
Ответ #42 - 02. Октября 2013 :: 10:46
Печать  
alyuev писал(а) 02. Октября 2013 :: 10:30:
hMDI - выдает неправильный результат.


Это нереально.
Spy++ есть?
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 855
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Как определить, что кликнули на пустом месте?
Ответ #43 - 02. Октября 2013 :: 10:56
Печать  
Spy++ нет. Просто попробуй сравни результаты двух вариантов.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 855
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Как определить, что кликнули на пустом месте?
Ответ #44 - 02. Октября 2013 :: 11:11
Печать  
Посмотрел в Spy - дескриптор для MDIClient, как раз тот, что выдает мой вариант.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 [3] 4 5 
ОтправитьПечать