Holen Sie sich das HMENU eines tk-Menüs unter WindowsPython

Python-Programme
Anonymous
 Holen Sie sich das HMENU eines tk-Menüs unter Windows

Post by Anonymous »

Ich möchte das HMENU eines tk-Menüs erhalten, um seine Hintergrundfarbe mithilfe der SetMenuInfo-Funktion von der Windows-API festzulegen (das Festlegen mit configure() wirkt sich nur auf den Hintergrund der Menüelemente aus, nicht jedoch auf den Hintergrund des Menüs selbst), aber ich kann keine Möglichkeit finden, das HMENU eines Menüs abzurufen, um diese Funktion aufrufen zu können, ohne zuerst das Menü anzuzeigen und dann sein HMENU abzurufen. Die Funktion wininfo_id() eines Menü-Widgets gibt nicht das HMENU des Menüs zurück, sondern das HWND eines unsichtbaren Fensters, das mit dem Menü erstellt wird. Ich habe auch versucht, im Internet und in der TK-Dokumentation nach etwas zu suchen, das mir helfen könnte, aber ich habe nichts gefunden. Die einzige Möglichkeit, die ich mir vorstellen kann, um das HMENU zu finden, besteht darin, das Fenster des Menüs mithilfe der Funktion FindWindowW zu finden und dann das zugehörige Menü abzurufen, indem MN_GETHMENU an das Fenster gesendet wird, wenn das Ereignis ausgelöst wird. Etwa so:

Code: Select all

MN_GETHMENU = 0x01E1

def set_menu_background_color(event):
hwnd = ctypes.windll.user32.FindWindowW("#32768", None)
hmenu = ctypes.windll.user32.SendMessageW(hwnd, MN_GETHMENU, 0, 0)

# Set the menu background color using SetMenuInfo()

menu.bind("", set_menu_background_color)
Aber dies führt zu einer kurzen Verzögerung beim Festlegen der Hintergrundfarbe und ich möchte nicht, dass das passiert.
Stellt tk tatsächlich das HMENU eines Menüs zur Verfügung? Wenn ja, wie kann ich es bekommen?
Bearbeiten: Ich weiß, dass Sie GetMenu verwenden können, aber das funktioniert nur, wenn das Menü als Menüleiste eines bestimmten Fensters festgelegt ist. Ich glaube nicht, dass ich diese Funktion verwenden kann, da laut der tk-Menüdokumentation ein Klon des Menüs erstellt wird, wenn ein Menü als Menüleiste für ein Fenster der obersten Ebene festgelegt wird. Wenn ich also vorübergehend das HMENU des Menüs, dessen HMENU ich erhalten möchte, als Menüleiste festlege, sein HMENU mit GetMenu erhalte und dann das Menü der ursprünglichen Menüleiste wiederherstelle/entferne, wird nur das HMENU für das geklonte Menü zurückgegeben.
Während GetMenu für das Menü der Menüleiste funktioniert, benötige ich eine Möglichkeit, irgendwie an das HMENU eines Menüs zu gelangen, das ich beispielsweise manuell posten oder für ein Menubutton-Widget verwenden werde, ohne es anzuzeigen Suchen Sie zuerst das Popup-Fenster und senden Sie ihm dann eine Nachricht, um das HMENU des zugehörigen Menüs abzurufen.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post