всегда бесило отсутствие горячих клавиш для переходов между различиями, при сравнивании модулей, а еще долбаная задержка между переходами, т.е. следующий переход произойдет только если ткнуть на кнопку через полсекунды, т.о. быстро долистать до 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" результат нормальный...