@SteveMylo, if you see yourself using the same code all over again, it is usually a good idea to put it in a function:
Code: Select all
x::
if !(dvEl := GetDavinciElement())
return
MediaPool := dvEl.FindFirstBy("AutomationId=UiMainWindow.bigBossWidget.widgetStack_Panel.WStackPage_Conform.m_pConformPanel.frameEditPageWidgetsContainer.frameEditPageMediaPool.frameMultipleBinGridLayoutContainer.frameMultipleBinLayoutTopLeft.frameTopLeftContent.mediaPoolWidget.frameContainer.frameMediaPoolViews.mediaPoolViewSplitter.frameMediaPoolClipViewContainer") ; Media Pool
Media2 := dvEl.FindFirstBy("AutomationId=UiMainWindow.bigBossWidget.widgetStack_Panel.WStackPage_Conform.m_pConformPanel.frameEditPageWidgetsContainer.frameEditTimelinesHolder.frameConformTimelines.frameEditTimelineAndAudioView.frameEditTimelinesContainer.splitterEditTimelinesContainer.frameTimelineContainer.frameTimelineViewContainer.timelineViewsSplitter") ; timeline
if IsMouseInElement(MediaPool, Media2)
{
soundbeep, 900, 20
return
}
return
;\\\\\\\\\\\\\\\\\\\\\\\ FUNCTION \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
GetDavinciElement() {
static davinciId, davinciElement
if (!(dvId := WinExist("ahk_exe Resolve.exe")))
return
if ((davinciId == dvId) && davinciElement)
return davinciElement
else {
davinciElement := "", davinciId := dvId
while (!davinciElement && WinExist("ahk_exe Resolve.exe")) {
try davinciElement := UIA_Interface().ElementFromHandle(dvId)
}
return davinciElement
}
}
IsMouseInElement(els*) { ; Returns 1 in the mouse is inside any of the provided UIA elements
for _, el in els {
Coords := el.CurrentBoundingRectangle
if IsMouseInRect(Coords.l, Coords.t, Coords.r, coords.b)
return 1
}
return 0
}
IsMouseInRect(X1, Y1, X2, Y2, relative:="screen") {
savedCoordMode := A_CoordModeMouse
CoordMode, Mouse, %relative%
MouseGetPos, mouseX, mouseY
CoordMode, Mouse, %savedCoordMode%
return (mouseX > X1 && mouseX < X2) && (mouseY > Y1 && mouseY < Y2)
}
It would probably be best though to first check which panel is active (Media, Cut, Edit etc), and then only check the corresponding elements. Otherwise you will be doing a lot of wasted FindFirst-st.
Also, in your hotkey, if you don't care whether the mouse is in Media Pool or Timeline, then you could just do one FindFirstBy (which will be faster):
ElOfInterest := dvEl.FindFirstBy("AutomationId=UiMainWindow.bigBossWidget.widgetStack_Panel.WStackPage_Conform.m_pConformPanel.frameEditPageWidgetsContainer.frameEditPageMediaPool.frameMultipleBinGridLayoutContainer.frameMultipleBinLayoutTopLeft.frameTopLeftContent.mediaPoolWidget.frameContainer.frameMediaPoolViews.mediaPoolViewSplitter.frameMediaPoolClipViewContainer OR AutomationId=UiMainWindow.bigBossWidget.widgetStack_Panel.WStackPage_Conform.m_pConformPanel.frameEditPageWidgetsContainer.frameEditTimelinesHolder.frameConformTimelines.frameEditTimelineAndAudioView.frameEditTimelinesContainer.splitterEditTimelinesContainer.frameTimelineContainer.frameTimelineViewContainer.timelineViewsSplitter")
I'm gonna keep you offer in mind for now since I don't use DaVinci that regularly, but thanks