2024-06-27, 11:17
  #1
Medlem
Jobbar med ett projekt i python där jag vill få ett macro att utföras framgångsrikt även när jag döljer ett fönster med
Kod:
win32gui.ShowWindow(hwnd, command), ex SW_HIDE
Makrot ska interagera/klicka på en knapp i detta dolda fönster.

Har förstått det som att fönstret ska gå att interagera med även om det är dolt, men kan ju självklart ha fel.

Är det möjligt att få detta att fungera på något sätt?

Så här de relevanta delarna av koden ut:


Gömma och visa fönstret
Kod:
def interact_with_window(self, hwnd, rel_x, rel_y):
    # Log original state for troubleshooting
    original_style = win32gui.GetWindowLong(hwnd, win32con.GWL_STYLE)
    self.log(f"Original style for window {hwnd}: {original_style}")

    try:
        # Bring the window to the foreground and make it visible
        win32gui.ShowWindow(hwnd, win32con.SW_SHOW)
        win32gui.SetForegroundWindow(hwnd)

        # Re-check window visibility
        window_placement = win32gui.GetWindowPlacement(hwnd)
        self.log(f"Window placement for {hwnd}: {window_placement}")

        if window_placement[1] == win32con.SW_MINIMIZE:
            self.log(f"Window {hwnd} is minimized, restoring window.")
            win32gui.ShowWindow(hwnd, win32con.SW_RESTORE)

        # Bring the window to the top of the z-order
        win32gui.BringWindowToTop(hwnd)
        win32gui.SetActiveWindow(hwnd)

        # Beräkna absoluta koordinater
        rect = win32gui.GetWindowRect(hwnd)
        x = rect[0] + rel_x
        y = rect[1] + rel_y

        # Log the calculated positions
        self.log(f"Calculated click position: ({x}, {y})")

        # Skicka musklick till fönstret
        lParam = win32api.MAKELONG(rel_x, rel_y)
        win32gui.PostMessage(hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, lParam)
        win32gui.PostMessage(hwnd, win32con.WM_LBUTTONUP, 0, lParam)

    finally:
        # Restore window state (if necessary)
        if (original_style & win32con.WS_VISIBLE) == 0:
            win32gui.ShowWindow(hwnd, win32con.SW_HIDE)
        # Restore original window style
        win32gui.SetWindowLong(hwnd, win32con.GWL_STYLE, original_style)


Hitta fönstret, även om det är dolt
Kod:
def find_window_advanced(self, title):
    def enum_windows_callback(hwnd, result):
        window_title = win32gui.GetWindowText(hwnd)
        window_class = win32gui.GetClassName(hwnd)
        if title.lower() in window_title.lower() or (window_class and "Save" in window_class):
            result.append(hwnd)
        return True

    result = []
    win32gui.EnumWindows(enum_windows_callback, result)

    if result:
        return result[0]
    else:
        # Om inget fönster hittades, vänta lite och försök igen
        time.sleep(2)
        win32gui.EnumWindows(enum_windows_callback, result)
        return result[0] if result else None
Citera
2024-06-27, 13:14
  #2
Medlem
a-mortals avatar
Citat:
Ursprungligen postat av ThePrivacyProject
Jobbar med ett projekt i python där jag vill få ett macro att utföras framgångsrikt även när jag döljer ett fönster med
Kod:
win32gui.ShowWindow(hwnd, command), ex SW_HIDE
Makrot ska interagera/klicka på en knapp i detta dolda fönster.

Har förstått det som att fönstret ska gå att interagera med även om det är dolt, men kan ju självklart ha fel.

Är det möjligt att få detta att fungera på något sätt?
Det finns flera sätt, men det beror lite på vad för typ av program det är du ska klicka i.
Allmänt så kan man använda ett program interface, t.ex. i excell så kan man anropa kommandon via VBS, det går även att anropa windows att växla fönster och maximera har jag för mig. Är det ett program med VBA support eller java så kan man nog lägga till en komponent.

Eventuellt går det att flytta fönstret också. Du får kolla win32gui dokumentationen och se vad du hittar. Annars får du ladda en dll fil som har någon bra funktion. Eventuellt kan du anropa något kommando med os.popen2, os.system eller os.spawnle, det är vad jag skulle gjort i första hand. I första hand vill man ju få det att fungera.
Citera
2024-07-06, 09:17
  #3
Moderator
Protons avatar
Systemutveckling --> Python
/Moderator
Citera
2024-07-12, 01:34
  #4
Medlem
Jag vet inte vad du vill åstadkomma med ditt projekt. Vad är det för mening med att klicka på en dold knapp?

Nåja, du har ju i stora hela svaret i din kod du har i TS. Dock ser den rejält AI-animerad ut.

Vi befinner oss i Python, så länge som fönstret är en del av programmet så finns det alltid ett objekt av fönstret och en hanterare, om du nu inte har förstört objekten när du minimerade.

Jag kan inget om Wingui då jag inte rör Windows, men även Wingui bör fungera som alla andra fönsterhanterare i Python.



Kod:
for hwnd in find_window_advanced(self, title):

# Beräkna absoluta koordinater
        rect = win32gui.GetWindowRect(hwnd)
        x = rect[0] + rel_x
        y = rect[1] + rel_y

        # Log the calculated positions
        self.log(f"Calculated click position: ({x}, {y})")

        # Skicka musklick till fönstret
        lParam = win32api.MAKELONG(rel_x, rel_y)
        win32gui.PostMessage(hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, lParam)
        win32gui.PostMessage(hwnd, win32con.WM_LBUTTONUP, 0, lParam)

Så klart. Om din _metod_ find_window_advanced(self, title) fungerar som den ska kommer den att hämta fönstret via Wingui32s hanterare. Jag drog bara objektet ur listan <<result>> och sedan körde jag instruktionerna för hur muspekaren skall till knappen.

Fönstret behöver finnas som objekt i programmet, men du behöver inte visa fönstret.



(sedan saknas det kod! Din TS är inte helt komplett! En funktion kan inte ta sig själv som parameter och en metod fungerar inte utan sin klasskompis!)
__________________
Senast redigerad av Methos 2024-07-12 kl. 01:38.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in