Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Следующее/предыдущее различие в "сравнивалке" модулей (HotKey) (число прочтений - 6177 )
rt001
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 82
Зарегистрирован: 31. Января 2013
Следующее/предыдущее различие в "сравнивалке" модулей (HotKey)
19. Июня 2013 :: 11:23
Печать  
всегда бесило отсутствие горячих клавиш для переходов между различиями, при сравнивании модулей, а еще долбаная задержка между переходами, т.е. следующий переход произойдет только если ткнуть на кнопку через полсекунды, т.о. быстро долистать до 50го отличия не представляется возможным

может где-то и было, но я не нашел, поэтому сделал
вставляем код в шорткаты.vbs
Код
Выбрать все
'Проверяет является ли активное окно компаратором (сравнивалка модулей "Различие между : %s - %s", в котором отображается различие между модулями)
'и если да, то отправляет в это окно команду
Private Function ModulComparatorSendCommand(TextCommand)
	Const WM_COMMAND =  &H111
	Const WM_MOUSEACTIVATE = &H21
	Const cmdNextDiff = 33203 'cледующее различие
	Const cmdPrevDiff = 33194 'предыдущее различие

	Set Wrapper = CreateObject("DynamicWrapper")
	Wrapper.Register "USER32.DLL", "GetForegroundWindow", "f=s",    "r=l"
	Wrapper.Register "USER32.DLL", "SendMessage",	   "I=llll", "f=s", "r=l"

	Set svc = CreateObject("Svcsvc.Service")
	Title = Space(128)

	ForegroundWnd = Wrapper.GetForegroundWindow
	Title = svc.GetWindowText(ForegroundWnd)

	if Left(Title,17) = "Различие между : " then 'активное окно - это текстовый компаратор
		cmdToSend = 0
		if TextCommand = "cmdNextDiff" then
			cmdToSend = cmdNextDiff
		elseIf TextCommand = "cmdPrevDiff" then
			cmdToSend = cmdPrevDiff
		elseIf TextCommand = "cmdSetFocusToNextPrevTextField" then
			'т.к. нам нужны всего два фрейма и нам известна глубина, на которой они находятся
			'поэтому не будем делать рекурсию и тратить время на CreateObject()
			Wrapper.Register "USER32.DLL", "GetClassName", "I=lrl", "f=s", "r=l"
			ClassName = Space(255)
			hwnd_AfxFrameOrView1 = 0
			hwnd_AfxFrameOrView2 = 0
			Wrapper.Register "USER32.DLL", "FindWindowExA", "I=llll", "f=s", "r=l"
			hwnd = Wrapper.FindWindowExA (ForegroundWnd,0,0,0)
			do while hwnd <> 0
				cnt = Wrapper.GetClassName(hwnd, ClassName, 255)
				ClassName = Left(cstr(ClassName), cnt)
				if ClassName = "AfxMDIFrame42" then 'нашли основной фрейм
					'теперь нужно в нем найти два поля класса AfxFrameOrView42, с текстами модулей
					'т.к. эти поля идут по порядку, а платформу вряд ли кто-то перекомпилит, изменив порядок,
					'значит нет смысла проверять класс на соответствие
					hwnd_AfxFrameOrView1 = Wrapper.FindWindowExA (hwnd,0,0,0)
					hwnd_AfxFrameOrView2 = Wrapper.FindWindowExA (hwnd,hwnd_AfxFrameOrView1,0,0)
					Wrapper.Register "USER32.DLL", "GetFocus",	  "f=s", "r=l"
					Wrapper.Register "USER32.DLL", "SetFocus", "I=l", "f=s", "r=l"
					hwnd_CurFocused = Wrapper.GetFocus()

					if hwnd_CurFocused = hwnd_AfxFrameOrView1 then
						hwnd_NewFocus = hwnd_AfxFrameOrView2
					elseIf hwnd_CurFocused = hwnd_AfxFrameOrView2 then
						hwnd_NewFocus = hwnd_AfxFrameOrView1
					else
						'непонятно куда он успел деться, ну да ладно, значит не будем ничего делать :)
						hwnd_NewFocus = 0
					end if

					if hwnd_NewFocus <> 0 then
						Wrapper.SetFocus (hwnd_NewFocus)
						HTCLIENT = 1
						Wrapper.SendMessage hwnd_NewFocus, WM_MOUSEACTIVATE, ForegroundWnd, HTCLIENT
					end if

					exit do
				end if
				hwnd = Wrapper.FindWindowExA (ForegroundWnd,hwnd,0,0)
			loop
		elseIf TextCommand = "cmdMaximizeWindow" then
			Dim document, info, DesktopWidth, DesktopHeight
			set document = CreateObject("htmlfile")
			With document.parentWindow.screen
				DesktopWidth = .availWidth
				DesktopHeight = .availHeight
			End With

			Wrapper.Register "USER32.DLL", "SetWindowPos", "i=lllllll", "f=s", "r=l"
			Wrapper.SetWindowPos ForegroundWnd,0,-4,-4,DesktopWidth+8,DesktopHeight+8,0
		end if

		if cmdToSend <> 0 then
			Wrapper.SendMessage ForegroundWnd, WM_COMMAND ,cmdToSend, NULL
		end if
	end if

End Function 'ModulComparatorSendCommand() 



Код
Выбрать все
Sub ModulComparatorNextDiff()
	ModulComparatorSendCommand("cmdNextDiff")
End Sub

Sub ModulComparatorPrevDiff()
	ModulComparatorSendCommand("cmdPrevDiff")
End Sub

Sub ModulComparatorSetFocusToNextPrevTextField()
	ModulComparatorSendCommand("cmdSetFocusToNextPrevTextField")
End Sub

Sub ModulComparatorMaximizeWindow()
	ModulComparatorSendCommand("cmdMaximizeWindow")
End Sub
 



теперь можно назначить горячие клавиши и нет дурацкой задержки, все летает. я назначил F7 - предыдущее, F8 - следующее, типа как стрелки вправо/влево

хотел сделать поиск окна через анализ класса, но к сожалению, почему-то класс этого окна как-то странно считывается - пустым, но длина похоже правильная возвращается, хотя для остальных окон с классом в таком же формате "Afx:000000:0:0:0:000000" результат нормальный...
« Последняя редакция: 06. Февраля 2014 :: 05:47 - rt001 »  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Следующее/предыдущее различие в "сравнивалке" модулей (HotKey)
Ответ #1 - 20. Июня 2013 :: 05:09
Печать  
прикольно
  
Наверх
 
IP записан
 
rt001
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 82
Зарегистрирован: 31. Января 2013
Re: Следующее/предыдущее различие в "сравнивалке" модулей (HotKey)
Ответ #2 - 20. Июня 2013 :: 06:19
Печать  
благодарю вас, сэр Улыбка
  
Наверх
 
IP записан
 
rt001
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 82
Зарегистрирован: 31. Января 2013
Re: Следующее/предыдущее различие в "сравнивалке" модулей (HotKey)
Ответ #3 - 20. Июня 2013 :: 14:31
Печать  
добавил переход между полями по горячей клавише, по Ф6, в моем случае
теперь выделение не слетает при переходе из одного поля в другое аааахаха Очень довольный

вот думаю еще прикрутить масштабирование окна на весь экран, что скажете, м?  Улыбка
когда в 2х конфигураторах окна одинакового размера, то оч удобно по Alt+Tab между ними переключаться сравнивая различия...
а так приходится мышкой как попало менять размер или стрелками двигать влево/вправо Злой, а результат все равно один - окно максимального размера
  
Наверх
 
IP записан
 
rt001
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 82
Зарегистрирован: 31. Января 2013
Re: Следующее/предыдущее различие в "сравнивалке" модулей (HotKey)
Ответ #4 - 06. Сентября 2013 :: 10:01
Печать  
исправил недочет, из-за которого некорректно выполнялось копирование текста в буфер обмена с помощью клавиатуры
воспроизводится так:
нужно перевести фокус из половины окна в другую, с помощью горячей клавишей, выделить любой участок текста с помощью клавиатуры (без использования мыши!) и нажать ctrl+c или ctrl+insert - кто чем пользуется, далее проверить что скопировалось в буфер, вставив этот текст куда угодно и заметить, что выделенный текст не скопировался Улыбка
  
Наверх
 
IP записан
 
rt001
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 82
Зарегистрирован: 31. Января 2013
Re: Следующее/предыдущее различие в "сравнивалке" модулей (HotKey)
Ответ #5 - 14. Января 2014 :: 15:05
Печать  
добавлена команда maximize
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать