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


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

Сообщений: 855
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Как определить, что кликнули на пустом месте?
11. Сентября 2013 :: 07:49
Печать  
Т.е. кликнули на рабочем поле и под курсором ничего не должно быть - ни формы, ни таблицы, ни текста?

Форму еще можно отловить по контексту в ПриНажатииПравойКнопки(). А таблицу как определить, или окно с текстом?
  

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: Как определить, что кликнули на пустом месте?
Ответ #1 - 11. Сентября 2013 :: 08:21
Печать  
к таблице можно прицепить МенеджерТабличногоДокумента из tabledoc - там есть события
извиняюсь не сразу понял, что требуется
  

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


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

Сообщений: 855
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Как определить, что кликнули на пустом месте?
Ответ #2 - 11. Сентября 2013 :: 08:50
Печать  
Вот тут нашел скрипт по определению всех открытых дочерних окон: http://www.forum.mista.ru/topic.php?id=397261

Теперь бы определить координаты этих окон. Тогда определить - куда кликнули - секундное дело.
  

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


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

Сообщений: 855
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Как определить, что кликнули на пустом месте?
Ответ #3 - 11. Сентября 2013 :: 10:27
Печать  
Ага, а как координаты окна по хендлу находить - см. здесь: http://www.1cpp.ru/forum/YaBB.pl?num=1227526095
  

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



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


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

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

Сразу после загрузки 1С скрипт почему-то показывает в ТЗ те окна, которые были открыты в предыдущем сеансе. Как это???

Хотя в реальности ничего не открыто.
  

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



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Как определить, что кликнули на пустом месте?
Ответ #6 - 11. Сентября 2013 :: 12:02
Печать  
Что-то там слишком мудрено.
Тебе какой список окон нужен?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Как определить, что кликнули на пустом месте?
Ответ #7 - 11. Сентября 2013 :: 12:20
Печать  
alyuev писал(а) 11. Сентября 2013 :: 08:50:
Вот тут нашел скрипт по определению всех открытых дочерних окон

а не MDI окна не интересуют? модальнооткрытые формы и прочие диалоги
  

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


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

Сообщений: 855
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Как определить, что кликнули на пустом месте?
Ответ #8 - 11. Сентября 2013 :: 12:29
Печать  
Тоже интересуют. Т.к. нужно отловить клик на пустом рабочем поле.
  

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



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Как определить, что кликнули на пустом месте?
Ответ #9 - 11. Сентября 2013 :: 13:27
Печать  
alyuev писал(а) 11. Сентября 2013 :: 12:29:
Тоже интересуют. Т.к. нужно отловить клик на пустом рабочем поле.


А ты ловишь нажатие глобальной процедурой "ПриНажатииКнопкиМыши"?
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


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

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

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



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Как определить, что кликнули на пустом месте?
Ответ #11 - 11. Сентября 2013 :: 14:03
Печать  
alyuev писал(а) 11. Сентября 2013 :: 13:55:
Да. ПриНажатииЛевойКнопки() или ПриНажатииПравойКнопки().

А в результате что нужно получить - хэндл окна по которому щелкнули?
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


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

Сообщений: 855
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Как определить, что кликнули на пустом месте?
Ответ #12 - 11. Сентября 2013 :: 14:30
Печать  
В результате клика нужно узнать, что под курсором ничего нет, т.е. в координатах клика нет ни одного дочернего окна.!
Просто рабочее поле.
  

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



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Как определить, что кликнули на пустом месте?
Ответ #13 - 11. Сентября 2013 :: 18:51
Печать  
Рабочее поле это MDI окно?
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


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

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

RabPole.jpg ( 12 KB | Загрузки )
RabPole.jpg

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



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Как определить, что кликнули на пустом месте?
Ответ #15 - 12. Сентября 2013 :: 08:29
Печать  
alyuev писал(а) 12. Сентября 2013 :: 08:14:
Стрелкой показал на скриншоте


Понятно, это MDI окно.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Как определить, что кликнули на пустом месте?
Ответ #16 - 12. Сентября 2013 :: 09:00
Печать  
стрелка показывает на MDIClient
но не все окна процесса являются дочерними к MDIClient
поэтому скрипт из топика на Мисте не решает твоей задачи в полной мере
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Как определить, что кликнули на пустом месте?
Ответ #17 - 12. Сентября 2013 :: 09:08
Печать  
но можно попробовать так:
получить hwnd MDIClient - это в примере есть
и получить hwnd WindowFromPhysicalPoint, если DynamicWrapper позволяет передавать структуры в качестве параметров
и сравнить
  

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



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Как определить, что кликнули на пустом месте?
Ответ #18 - 12. Сентября 2013 :: 11:31
Печать  
trad писал(а) 12. Сентября 2013 :: 09:08:
если DynamicWrapper позволяет передавать структуры в качестве параметров


Может.

  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Как определить, что кликнули на пустом месте?
Ответ #19 - 12. Сентября 2013 :: 12:39
Печать  
chessman писал(а) 12. Сентября 2013 :: 11:31:
trad писал(а) 12. Сентября 2013 :: 09:08:
если DynamicWrapper позволяет передавать структуры в качестве параметров


Может.


в двух словах, как ?
тут http://www.script-coding.com/dynwrapx.html#inparams не нашел
  

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



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Как определить, что кликнули на пустом месте?
Ответ #20 - 12. Сентября 2013 :: 13:03
Печать  
1. Выделяешь память под структуру. Во всех примерах народ пользуется внутренней ф-й Space/StrPtr. Я использую системные HeapAlloc/HeapFree. В общем дело вкуса.
2. Заполняешь структуру. DWX имеет прямой доступ к памяти (NumPut).
3. Передаешь в ф-ю указатель на структуру.

  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Как определить, что кликнули на пустом месте?
Ответ #21 - 12. Сентября 2013 :: 13:45
Печать  
это передача указателя, а если структура в функцию передается непосредственно через стек, как POINT в WindowFromPhysicalPoint, тоже сработает?
  

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



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Как определить, что кликнули на пустом месте?
Ответ #22 - 12. Сентября 2013 :: 14:08
Печать  
trad писал(а) 12. Сентября 2013 :: 13:45:
это передача указателя, а если структура в функцию передается непосредственно через стек, как POINT в WindowFromPhysicalPoint, тоже сработает?


Там все параметры передаются через стэк.
Чтоб передать через ECX нужно написать бинарную вставку.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Как определить, что кликнули на пустом месте?
Ответ #23 - 12. Сентября 2013 :: 15:43
Печать  
понятно что через стек, но ты предлагаешь передать через стек указатель на структуру, тогда как я говорю про передачу структуры через стек
  

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



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Как определить, что кликнули на пустом месте?
Ответ #24 - 12. Сентября 2013 :: 19:58
Печать  
trad писал(а) 12. Сентября 2013 :: 15:43:
понятно что через стек, но ты предлагаешь передать через стек указатель на структуру, тогда как я говорю про передачу структуры через стек

Просто описываешь столько параметров у ф-и, сколько DWORD'ов в структуре. В данном случае 2 параметра.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Как определить, что кликнули на пустом месте?
Ответ #25 - 13. Сентября 2013 :: 04:57
Печать  
понятно. хитро Улыбка
  

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



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Как определить, что кликнули на пустом месте?
Ответ #26 - 13. Сентября 2013 :: 05:59
Печать  
trad писал(а) 13. Сентября 2013 :: 04:57:
понятно. хитро Улыбка


Я ни разу так не делал Улыбка, но должно работать.
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Как определить, что кликнули на пустом месте?
Ответ #27 - 13. Сентября 2013 :: 07:31
Печать  
Небольшой класс для определения класса окна под мышкой.
  

DWX_HitTest.zip ( 2 KB | Загрузки )
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


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

Сообщений: 855
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Как определить, что кликнули на пустом месте?
Ответ #28 - 13. Сентября 2013 :: 08:58
Печать  
Спасибо! Это то, что нужно! А именно ПолучитьКлассОкна="MDIClient"!
  

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


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

Сообщений: 855
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Как определить, что кликнули на пустом месте?
Ответ #29 - 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) }"

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

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
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 записан
 
chessman
God Member
*****
Отсутствует



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


Ты в терминалке тестируешь?
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


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

Сообщений: 855
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Как определить, что кликнули на пустом месте?
Ответ #46 - 02. Октября 2013 :: 12:08
Печать  
Да. 1С как удаленное приложение. Но SPY я запускаю на том же сервере, где крутится 1С, под моей же сессией.
  

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



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Как определить, что кликнули на пустом месте?
Ответ #47 - 02. Октября 2013 :: 12:19
Печать  
alyuev писал(а) 02. Октября 2013 :: 12:08:
Да. 1С как удаленное приложение. Но SPY я запускаю на том же сервере, где крутится 1С, под моей же сессией.


что же там MDI не первое доченее окно у Приложения?
хендл 1С-ки то правильный?

а поищи по хэндлу, из моего варианта, что это за окно?
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


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

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

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



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Как определить, что кликнули на пустом месте?
Ответ #49 - 02. Октября 2013 :: 12:21
Печать  
alyuev писал(а) 02. Октября 2013 :: 12:20:
Да, хендл 1С правильный.


а поищи по хэндлу в SPY++, из моего варианта MDI, что это за окно?
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


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

Сообщений: 855
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Как определить, что кликнули на пустом месте?
Ответ #50 - 02. Октября 2013 :: 12:34
Печать  
Хм.... ничего не понимаю.... Сейчас выдает нормально.... Чувствуешь себя, мягко говоря, неловко... Вроде не пил... Улыбка Сам хотел проверить по хендлу, что это за окно. Но не догадался, что можно ввести хендл в поиске, а начал водить прицелом. При наведении на MDIClient выдал мне нужный хендл (мой). А твой найти не успел. Я перезапускал приложение. И после этого, как запустил все скрипты, - всё ок.... ??? Странно.....

В общем - буду держать под контролем хендлы Улыбка

« Последняя редакция: 03. Октября 2013 :: 08:54 - alyuev »  

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



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


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

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

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



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


А картинку из SPY++ выложи.
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


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

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

Spy.jpg ( 102 KB | Загрузки )
Spy.jpg

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: Как определить, что кликнули на пустом месте?
Ответ #55 - 03. Октября 2013 :: 05:19
Печать  
Можно попробовать действовать не через WinAPI ::GetWindow(..., GW_CHILD),
а через MFC класс CMDIFrameWnd коим является фрейм главного окна
У него есть такой член:
public:
     HWND m_hWndMDIClient;       // MDI Client window handle
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Как определить, что кликнули на пустом месте?
Ответ #56 - 03. Октября 2013 :: 05:24
Печать  
надо только в выражении
Wrap.NumGet(Wrap.GetMainFrame(), 32)
заменить смещение и получим непосредственно хендл МДИ клиента
  

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



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Как определить, что кликнули на пустом месте?
Ответ #57 - 03. Октября 2013 :: 06:53
Печать  
trad писал(а) 03. Октября 2013 :: 05:24:
надо только в выражении
Wrap.NumGet(Wrap.GetMainFrame(), 32)
заменить смещение и получим непосредственно хендл МДИ клиента


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


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

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

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


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

Сообщений: 855
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Как определить, что кликнули на пустом месте?
Ответ #59 - 21. Ноября 2013 :: 12:46
Печать  
Еще в продолжение этой темы.

Задача похожая. Как определить, что кликнули на пункте меню?

Возникла ситуация, когда перехватываю клик мыши на шапке табличной части, и поверх шапки как раз выведено меню. Так вот, когда кликаешь на пункт меню, который над шапкой - срабатывал не выбор, а обработка шапки. Т.е. меню становилось прозрачным для клика.

Пока выкрутился так. У нас есть глобальная функция по выводу меню. Так вот в ней поднимаю глПеременную, что мол сейчас обрабатываем меню.

  

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



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


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

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

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