@@ -59,7 +59,10 @@ class DialogResolverOptions:
5959 "Autodesk" , "Revit" , "Load" , "Security" , "Warning" , "Add-in" , "Addin" ,
6060 ])
6161 preferred_button_keywords : list [str ] = field (default_factory = lambda : [
62- "Always Load" , "Load" , "OK" , "Yes" , "Accept" , "Continue" , "Close" ,
62+ "Always Load" , "Load Once" , "Load" , "OK" , "Yes" , "Accept" , "Continue" , "Close" ,
63+ ])
64+ blocked_button_keywords : list [str ] = field (default_factory = lambda : [
65+ "Do Not Load" , "Cancel" , "No" ,
6366 ])
6467
6568
@@ -106,17 +109,25 @@ def _is_whitelisted(self, title: str) -> bool:
106109 return any (kw .lower () in lower for kw in self ._opts .dialog_title_keywords )
107110
108111 def _find_button (self , parent : int ) -> int | None :
109- result : list [int ] = []
112+ result : list [tuple [ int , int ] ] = []
110113
111114 @_EnumWindowsProc
112115 def _cb (child : int , _ : int ) -> bool :
113- if _is_preferred_button (child , self ._opts .preferred_button_keywords ):
114- result .append (child )
115- return False
116+ score = _get_button_score (
117+ child ,
118+ self ._opts .preferred_button_keywords ,
119+ self ._opts .blocked_button_keywords ,
120+ )
121+ if score is not None :
122+ result .append ((score , child ))
116123 return True
117124
118125 _user32 .EnumChildWindows (parent , _cb , 0 )
119- return result [0 ] if result else None
126+ if not result :
127+ return None
128+
129+ result .sort (key = lambda item : item [0 ])
130+ return result [0 ][1 ]
120131
121132 def _enum_dialog_windows (self ) -> list [int ]:
122133 windows : list [int ] = []
@@ -131,14 +142,30 @@ def _cb(hwnd: int, _: int) -> bool:
131142 return windows
132143
133144
134- def _is_preferred_button (hwnd : int , keywords : list [str ]) -> bool :
145+ def _get_button_score (hwnd : int , keywords : list [str ], blocked_keywords : list [ str ] ) -> int | None :
135146 if _get_class_name (hwnd ).lower () != _BUTTON_CLASS :
136- return False
147+ return None
148+
137149 text = _get_window_text (hwnd )
138150 if not text :
139- return False
151+ return None
152+
140153 text_lower = text .lower ()
141- return any (kw .lower () in text_lower for kw in keywords )
154+
155+ if any (kw .lower () in text_lower for kw in blocked_keywords ):
156+ return None
157+
158+ for index , keyword in enumerate (keywords ):
159+ keyword_lower = keyword .lower ()
160+ if text_lower == keyword_lower :
161+ return index
162+
163+ for index , keyword in enumerate (keywords ):
164+ keyword_lower = keyword .lower ()
165+ if keyword_lower in text_lower :
166+ return index + len (keywords )
167+
168+ return None
142169
143170
144171def _is_target_dialog (hwnd : int , target_pid : int ) -> bool :
0 commit comments