当用户输入某些内容时,我正在try 打开一个弹出窗口.
我在某处读到,Windows只允许您在从主窗口调用弹出窗口的情况下对其进行聚焦.
我在网上搜索了一下,发现这个"变通办法"并不是很有效,因为强制聚焦的方法不起作用:
def bring_window_to_foreground(self):
self.top_window.update_idletasks()
hwnd = win32gui.FindWindow(None, "Select Expansion")
shell = win32com.client.Dispatch("WScript.Shell")
shell.SendKeys("%")
time.sleep(0.1)
shell.SendKeys("%")
win32gui.SetForegroundWindow(hwnd)
# Send another Alt key to nullify the activation
self.top_window.focus_force()
但有时这不起作用,应用程序使用"ALT"键来显示菜单,如记事本,有时会出现问题.
有没有什么库或Windows API可以用来将我的tkinter窗口发送到前台,总是在顶部和焦点上,而不是从主窗口应用程序调用它,它将被最小化?
还有一个问题?如何在文本光标的同一位置或更靠近文本光标的位置显示此弹出窗口?我正在使用下面的代码,但不起作用:
def get_caret_position(self):
class GUITHREADINFO(ctypes.Structure):
_fields_ = [("cbSize", ctypes.c_ulong),
("flags", ctypes.c_ulong),
("hwndActive", ctypes.wintypes.HWND),
("hwndFocus", ctypes.wintypes.HWND),
("hwndCapture", ctypes.wintypes.HWND),
("hwndMenuOwner", ctypes.wintypes.HWND),
("hwndMoveSize", ctypes.wintypes.HWND),
("hwndCaret", ctypes.wintypes.HWND),
("rcCaret", ctypes.wintypes.RECT)]
guiThreadInfo = GUITHREADINFO(cbSize=ctypes.sizeof(GUITHREADINFO))
hwnd = win32gui.GetForegroundWindow()
processID = ctypes.c_ulong()
threadID = ctypes.windll.user32.GetWindowThreadProcessId(hwnd, ctypes.byref(processID)) # <-- Corrected line
if ctypes.windll.user32.GetGUIThreadInfo(threadID, ctypes.byref(guiThreadInfo)):
caret_x = guiThreadInfo.rcCaret.left
caret_y = guiThreadInfo.rcCaret.top
return caret_x, caret_y
else:
return None, None