Wie der Titel schon sagt, schaffe ich es nicht, ein (Kontext)-Menü in der Metro-Oberfläche anzeigen zu lassen.
Mein Skript:
Spoiler anzeigen
#include <Constants.au3>
#include <GuiMenu.au3>
#include <Misc.au3>
#include <WinAPI.au3>
$hDLL = DllOpen("user32.dll")
[/autoit] [autoit][/autoit] [autoit]$hGui = GUICreate("Contextmenu", 100, 100, 100, 100)
$hMenu = GUICtrlCreateContextMenu()
$hEntry1 = GUICtrlCreateMenuItem("Entry 1", $hMenu)
GUICtrlCreateMenuItem("", $hMenu)
$hAbout = GUICtrlCreateMenuItem("Über Win8 Contextmenu", $hMenu)
$hExit = GUICtrlCreateMenuItem("Win8 Contextmenu beenden", $hMenu)
GUISetState(@SW_SHOW)
[/autoit] [autoit][/autoit] [autoit]WinSetOnTop($hGui, "", 1) ; Versuch, eigene GUI als Topmost zu markieren
[/autoit] [autoit][/autoit] [autoit]While 1
$msg = GUIGetMsg()
If $msg == $hEntry1 Then
MsgBox(0, "", "Entry 1")
ElseIf $msg == $hAbout Then
MsgBox(64, "Über Win8 Contextmenu", "Hier folgt der Text")
ElseIf $msg == $hExit Then
Exit
EndIf
If _IsPressed(02, $hDLL) Then
$activeWin = WinActive("") ; Handle des aktiven Fensters holen
ConsoleWrite("Active win handle: " & $activeWin & @CRLF)
$pos = MouseGetPos() ; Position für Kontextmenü herausfinden
$winTitle = WinGetTitle($activeWin) ; liefert "Startmenü", wenn das aktive Fenster Metro war
ConsoleWrite("Active win title: " & $winTitle & @CRLF)
$winSize = WinGetPos($activeWin) ; Aus Spaß mal die Größe des Fensters abfragen
ConsoleWrite("Active win geo: " & $winSize[0] & "," & $winSize[1] & "," & $winSize[2] & "," & $winSize[3] & @CRLF)
$winState = WinGetState($activeWin) ; Fenster-Status - liefert 15 (1 + 2 + 4 +
ConsoleWrite("Active win state: " & $winState & @CRLF)
;~ $ret = WinMove($activeWin, "", 100, 100, 200, 200) ; funktioniert auch
;~ ConsoleWrite("Returned value (move): " & $ret & @CRLF)
;~ $ret = WinSetOnTop($activeWin, "", 0) ; liefert 1 (hat also angeblich funktioniert), trotzdem ist von meinem Fenster bzw. dem Kontextmenü nichts zu sehen
;~ ConsoleWrite("Returned value (setontop = 0): " & $ret & @CRLF)
;~ WinSetTrans($activeWin, "", 50) ; danach sind mein Fenster und das Menü (wird 3 Zeilen später erzeugt) im HINTERGRUND eindeutig erkennbar
$ret = _WinAPI_SetWindowPos($activeWin, $HWND_BOTTOM, 0, 0, 1024, 768, $SWP_FRAMECHANGED) ; ändert weiterhin nichts an daran, dass mein Fenster im Hintergrund ist
ConsoleWrite("Returned value (setwinpos): " & $ret & @CRLF)
$ret = _GUICtrlMenu_TrackPopupMenu(GUICtrlGetHandle($hMenu), $hGui) ; hier wird das Kontextmenü erzeugt und ist nun auch im Hintergrund zu sehen
ConsoleWrite("Returned value (cm): " & $ret & @CRLF)
WinActivate($activeWin)
;~ $ret = WinMove($activeWin, "", 0, 0, 1024, 768) ; die WinMove-Spielerei rückgängig machen
Sleep(5000)
;~ WinSetTrans($activeWin, "", 255) ; Transparenz wieder rückgängig machen
EndIf
Sleep(10)
WEnd
Da das Kontextmenü dank Transparenz im Hintergrund zu sehen ist, liegt das Problem also darin, das Kontextmenü vor die Metro-Oberfläche zu bekommen!
Hat irgendjemand eine Idee?