Notice: This forum has been recovered from an old backup, so some content, links, and dates may be outdated. The forum is currently read-only while we restore sign-in and registration functionality. Details

If you find this forum valuable and would like to help keep it online, donations to help cover hosting and domain costs are greatly appreciated, but never expected. You can support the forum through Buy Me a Coffee or Ko-fi. Thank you for helping preserve the EventGhost community.

Focus auf Eingabekomponente setzen?

Allgemeines zum Thema EventGhost
Post Reply
Bartman
Plugin Developer
Posts: 881
Joined: Sun Feb 12, 2006 9:03 am

Focus auf Eingabekomponente setzen?

Post by Bartman »

Kann man eigentlich auch den Focus auf eine Eingabekomponente eines Programms setzen, so dass man direkt tippen k├Ânnte?
Eigentlich sind das doch auch blos Fenster...
User avatar
Bitmonster
Site Admin
Posts: 2239
Joined: Mon Feb 06, 2006 10:28 pm

Post by Bitmonster »

Hast du mal win32gui.SetFocus versucht?
Bartman
Plugin Developer
Posts: 881
Joined: Sun Feb 12, 2006 9:03 am

Post by Bartman »

versucht hatte ich noch gar nichts.
das setFocus klappt aber auch nicht.
Allerdings ist mir auch grade aufgefallen, dass ich gar kein Event habe, um das auszul├Âsen.
Ich wollte bei foobar in der Album Liste den Focus gleich auf die Textbox setzen zum suchen. Ich k├Ânnte schw├Âren, dass es da fr├╝her mal ein Task.Activated.foobar2000 oder Task.Created.foobar2000 gegeben hat. Scheine ich mich aber wohl geirrt zu haben.
Nach welchem Schema erzeugen denn auch einzelene neue Fenster einer ereits laufenden ein Task.* Event?
User avatar
Bitmonster
Site Admin
Posts: 2239
Joined: Mon Feb 06, 2006 10:28 pm

Post by Bitmonster »

Wenn das letzte aktivierte Fenster schon von Foobar war, dann kommt kein weiterer Task.Activated.foobar2000.

Das hatte ich extra unterdr├╝ckt, weil sonst oft Massen von Events kommen.
User avatar
Bitmonster
Site Admin
Posts: 2239
Joined: Mon Feb 06, 2006 10:28 pm

Post by Bitmonster »

F├╝r win32gui.SetFocus muss man auch den "AttachThreadInput-Trick" anwenden. Ein Beispiel einer Funktion die sowas verwendet ist BringHwndToFront in eg/WinAPI/Utils.py
Bartman
Plugin Developer
Posts: 881
Joined: Sun Feb 12, 2006 9:03 am

Post by Bartman »

Bitmonster wrote:Wenn das letzte aktivierte Fenster schon von Foobar war, dann kommt kein weiterer Task.Activated.foobar2000.

Das hatte ich extra unterdr├╝ckt, weil sonst oft Massen von Events kommen.
Dann hatte ich mich doch nicht getäuscht. Ohne brauche ich das aber auch nicht wirklich weiter probieren.

FUnktioniert aber trotzdem nicht.

Code: Select all

import win32gui
import win32api
import ctypes
import win32ui

for hwnd in eg.lastFoundWindows:
    # Check to see if we are the foreground thread
    win = win32ui.CreateWindowFromHandle(hwnd)
    try:
        h = win32gui.GetForegroundWindow()
        foregroundThreadID, processID = win32api.GetWindowThreadProcessId(h)
    except:
        foregroundThreadID = None
    ourThreadID = win32api.GetCurrentThreadId()

    # If not, attach our thread's 'input' to the foreground thread's
    if foregroundThreadID != ourThreadID:
        ctypes.windll.user32.AttachThreadInput(foregroundThreadID, ourThreadID, True)
    win.SetFocus()
    
    # Force our window to redraw
    win.InvalidateRect()
    if foregroundThreadID != ourThreadID:
        ctypes.windll.user32.AttachThreadInput(foregroundThreadID, ourThreadID, False)
    print "focus"
User avatar
Bitmonster
Site Admin
Posts: 2239
Joined: Mon Feb 06, 2006 10:28 pm

Post by Bitmonster »

Man muss es auch richtig machen:

Code: Select all

import win32gui
import win32api
import ctypes
import win32process


h = win32gui.GetForegroundWindow()
foregroundThreadID, processID = win32process.GetWindowThreadProcessId(h)
ourThreadID = win32api.GetCurrentThreadId()


if foregroundThreadID != ourThreadID:
    ctypes.windll.user32.AttachThreadInput(foregroundThreadID, ourThreadID, True)
win32gui.SetFocus(eg.lastFoundWindows[0])
if foregroundThreadID != ourThreadID:
    ctypes.windll.user32.AttachThreadInput(foregroundThreadID, ourThreadID, False)
Vorher muss ein BringToFront stehen.
Bartman
Plugin Developer
Posts: 881
Joined: Sun Feb 12, 2006 9:03 am

Post by Bartman »

ah, wenn man das richtige Paket nimmt und den Fehler nicht noch abfangen w├╝rde k├Ânnte es klappen ;)
Mir ist es sowieso ein Rätsel nach welchem Schema die ganzen API Calls auf die Pakete aufgeteilt sind. Und woher soll man eigentlich wissen, dass man da solche Spärenzchen mit AttachThreadInput machen muss. Die Doku ist auch nicht zu ausführlich bei sowas.
User avatar
Bitmonster
Site Admin
Posts: 2239
Joined: Mon Feb 06, 2006 10:28 pm

Post by Bitmonster »

Wenn es um solche Sachen geht, dann muss man sich auch immer die MSDN-Doku zu den Funktionen anschauen. Die ganzen win32* Module sind ja nur Portierungen auf Python-Datentypen. Tja, und wenn man bei MSDN nach SetFocus sucht, dann findet man auch den Trick mit AttachThreadInput :
MSDN SetFocus
Post Reply