Herzlichen Glückwunsch an SirChrizm!
Bald kommt der EM Kick-Tipp...
Herzlichen Glückwunsch an SirChrizm!
Bald kommt der EM Kick-Tipp...
Ich bekam aber nur einen grünen Strich hin.
Lass' mal den Code sehen, ob ich den Strich auch sehen kann.
Schnuffel danke für den Hinweis, aber in diesem Fall geht es um ein externes Fenster (CMD Box) und ich weiß nicht, ob ModernMenu auch für externe Fenster gültig ist. Mal sehen...
Btw, wenn ich das Default Icon vom Close / Schließen verwende, dann erscheint das Icon (X).
Hi BugFix
Unklar ist mir: WCHAR FaceName[LF_FACESIZE];
Dies ist ein Array mit dem Typ WCHAR.
Die Definition könnte so aussehen:
Global Const $tagCONSOLE_FONT_INFOEX = "ULONG cbSize; DWORD nFont; SHORT X; SHORT Y; UINT dwFontFamily; UINT FontWeight;wchar FaceName[32];"
CONSOLE_SCREEN_BUFFER_INFO:
Global Const $tagCONSOLE_SCREEN_BUFFER_INFO = "SHORT dwSizeX; SHORT dwSizeY; SHORT dwCursorPositionX;SHORT dwCursorPositionY;" &
"SHORT wAttributes; SHORT srWindowLeft; SHORT srWindowTop; SHORT srWindowRight; SHORT srWindowBottom;" & _
"SHORT dwMaximumWindowSizeX; SHORT dwMaximumWindowSizeY"
Ich wollte auch damit Anfangen eine Console UDF zu basteln, habe aber mich daran erinnert, dass Mat beriets eine fast vollständige Consolen UDF gebastelt hatte -> https://code.google.com/archive/p/consoleau3/downloads.
Wenn ich deinen Code ausführe passiert bei mir rein gar nichts.
- ich öffne eine Konsole
- dann starte ich dein Skript
- in der Konsole ist das Menü unverändert
Wenn du das Skript von Post#1 kompiliert und gestartet hast, dann sollte nur in die CMD Box "Test selected" erscheinen, wenn du den Menu Eintrag "Test" selektiert hast. In dem nächsten Problem geht das darum, dem Test Eintrag ein Icon zu verpassen.
Alternative:
Verwende doch eine eigene Konsole, die kannst du dann nach Lust und Laune gestalten und mit ihr interagieren.
Zu dem Thema Eigene Konsole hatten wir vor Jahren hier schon etwas gepostet (ProgAndy und ich). Leider wurden die Links bei der Forenaktualisierung nicht umgestellt und somit sind die Posts unauffindbar.
Primär geht es mir nicht um die Consolen Funtionalität, sondern um die Interaktion mit dem Menu. Eigentlich benötige ich diese Funktionalität eher für mein FB Programm "Radio Station", aber dies kann man vielleicht auch in Autoit gebrauchen, da im Prinzip die WinAPI angezapft wird und die Programmiersprache ist eher Nebensache.
In FB speichere ich die Menus, danach lösche ich die letzen 4 und am Ende stelle ich sie wieder her. Das funktioniert auch soweit, aber das Icon z.B. für "Close" / "Schließen" wird nicht gesetzt. Ferner würde ich auch gerne für meinen Eintrag ein Icon haben.
Alles anzeigenOk, mein Fehler. AutoIt ist bei mir in einem anderen Pfad installiert, da kann er die .gif natürlich nicht finden
. So sieht es jetzt aus :
(Edit) UEZ :
Ich weiß, Du hast die 'Merlin.gif' hier nur zu Demozwecken genommen. Wäre es im Rahmen der Tests aber nicht trotzdem sinnvoll, folgenden Parameter zu verwenden ?
Eigentlich wollte ich ein Base64 eingebettes Icon benutzen, aber im Prinzip ist das für diesen Test egal, wo die Quelle ist, sondern die Frage, wie bekomme ich das Icon dorthin.
Wir wechseln uns immer alle 2 Wochen mit meinem Kollegen ab, d.h. eine Personen ist dann immer im Büro.
Zurück zum Thema: warum kann ich kein Icon dem Menu Eintrag zuweisen?
#AutoIt3Wrapper_Change2CUI=y
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <GuiMenu.au3>
#include <WinAPIConstants.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>
Global $id_Test = 5201
Global $hConsole = DllCall("kernel32.dll", "hwnd", "GetConsoleWindow")[0]
HotKeySet("{ESC}", "_Exit")
Global $hSysmenu = _GUICtrlMenu_GetSystemMenu($hConsole)
Global $iCount = _GUICtrlMenu_GetItemCount ($hSysmenu)
_GUICtrlMenu_InsertMenuItem($hSysmenu, $iCount, "Test", $id_Test)
_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile("c:\Program Files (x86)\AutoIt3\Examples\GUI\Merlin.gif")
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hBitmap = ' & $hBitmap & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
_GUICtrlMenu_SetItemBmp($hSysmenu, $id_Test, $hBitmap, False)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()
Global $iMouseFunc
Global $hMouseHook
;~ Global $tParam = DllStructCreate("int")
;~ Global $iThread = DllCallbackRegister("_ThreadMouse", "none", "int")
;~ ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $iThread = ' & $iThread & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
;~ Global $hThread = DllCall("kernel32.dll", "hwnd", "CreateThread", "ptr", 0, "dword", 0, "ptr", DllCallbackGetPtr($iThread), "struct*", $tParam, "dword", 0, "dword*", 0)[6]
;~ ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hThread = ' & $hThread & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
Do
Sleep(1000)
Until False
Func _Exit()
ConsoleWrite("Exiting..." & @CRLF)
_GUICtrlMenu_DeleteMenu ($hSysmenu, $id_Test, False)
_WinAPI_DeleteObject($hBitmap)
;~ _WinAPI_UnhookWindowsHookEx($hMouseHook)
;~ DllCallbackFree($iMouseFunc)
;~ DllCallbackFree($iThread)
;~ DllCall("kernel32.dll", "none", "ExitThread", "dword", 1)
Exit
EndFunc
Func _MouseHook($iCode, $iwParam, $ilParam)
If $iCode >= 0 And $iwParam = $WM_LBUTTONDOWN Then
If $hSysmenu Then
If _GUICtrlMenu_GetItemHighlighted($hSysmenu, $id_Test, False) Then
ConsoleWrite("Test selected" & @CRLF)
EndIf
EndIf
EndIf
Return _WinAPI_CallNextHookEx($hMouseHook, $iCode, $iwParam, $ilParam)
EndFunc
Func _ThreadMouse($empty)
$iMouseFunc = DllCallbackRegister("_MouseHook", "int", "int;wparam;lparam")
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $iMouseFunc = ' & $iMouseFunc & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
$hMouseHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($iMouseFunc), _WinAPI_GetModuleHandle(0))
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hMouseHook = ' & $hMouseHook & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
EndFunc
Alles anzeigen
In FB habe ich einfach den Maus Hook als Thread laufen und die Maus macht seit dem keine Mucken mehr. In Autoit läuft das noch nicht mit dem Threading...
UEZ Kann leider nicht testen, bin bis Freitag auf Dienstreise.
Kein Problem. Dienstreise in der Pandemie Zeit...krass.
Musashi das ist kein reines Autoit Problem, sondern tritt auch mit FB auf. Vielleicht hast du es geahnt, dass ich dies für den Radio Station Player benötige, da es ein Consolen Proggy ist.
Ich habe den Hook bereits in FB implementiert und dort habe ich auch das Problem, wie bereits geschrieben. Komisch ist nur, dass der Hook nicht immer in FB greift. Das merke ich daran, dass die Maus wie gewohnt sich bewegen lässt. Wenn dies der Fall ist, dann funktioniert auch der Check, ob der Menu Eintrag selektiert wurde, nicht.
Ich werde es mal in der VM testen, ob dies vielleicht ein Win10 Ding ist.
Es könnte helfen, wenn du beim Eintritt in die Maus-Hook Funktion zuerst auf die Bedingungen prüfst, bei denen die Funktion nicht arbeiten soll und sie sofort wieder verlässt.
iCode < 0 Or wParam <> LDown
Hmm, leider immer noch gleich. Hast du nicht den Effekt?
Das Maus Hooking verursacht ein laggen der Mausbewegung. Habt ihr das auch? Falls ja, wie kann man das abstellen?
Ich suche nach einer Möglichkeit das Systemmenu eines Consolen Fensters (CMD Box) zu hooken, um ein Menu Eintrag, das ich angelegt habe, zu kontrollieren.
D.h., wenn ich z.B. ein Menü Eintrag "About" hinzufüge und dieser selektiert wird, soll dann ein Prozess starten.
Leider habe ich kein Weg gefunden, um diesen Event zu kontrollieren, wie er normalerweise über WM_NOTIFY möglich wäre.
Hat jemand eine Idee?
Edit: dies scheint zu funzen.
#AutoIt3Wrapper_Change2CUI=y
#include <GuiMenu.au3>
#include <WinAPIConstants.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>
Global $id_Test = 1000
Global $hConsole = DllCall("kernel32.dll", "hwnd", "GetConsoleWindow")[0]
HotKeySet("{ESC}", "_Exit")
Global $hSysmenu = _GUICtrlMenu_GetSystemMenu($hConsole)
Global $iCount = _GUICtrlMenu_GetItemCount ($hSysmenu)
_GUICtrlMenu_InsertMenuItem($hSysmenu, $iCount, "Test", $id_Test)
Global $hMouseFunc = DllCallbackRegister("_MouseHook", "int", "int;wparam;lparam")
Global $hMouseHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hMouseFunc), _WinAPI_GetModuleHandle(0))
Do
Sleep(50)
Until False
Func _Exit()
_WinAPI_UnhookWindowsHookEx($hMouseHook)
DllCallbackFree($hMouseFunc)
Exit
EndFunc
Func _MouseHook($iCode, $iwParam, $ilParam)
If $iCode >= 0 And $iwParam = $WM_LBUTTONDOWN Then
If $hSysmenu Then
If _GUICtrlMenu_GetItemHighlighted($hSysmenu, $id_Test, False) Then
ConsoleWrite("Test selected" & @CRLF)
EndIf
EndIf
Return 0
EndIf
Return _WinAPI_CallNextHookEx($hMouseHook, $iCode, $iwParam, $ilParam)
EndFunc
Alles anzeigen
Bitnugger vielen Dank! Funzt wie erwartet!
Jetzt muss ich sehen, ob man auch für das CMD Box Fenster dies anwenden kann.
Hat jemand eine Idee, wie ich ein Menu Item, welches ich mit _GUICtrlMenu_RemoveMenu() gelöscht habe, wieder zurückholen kann mit allen Untermenüs?
Beispiel: in Notepad wird der Menueintrag "Hilfe / Help" gelöscht.
#include <GuiMenu.au3>
Example()
Func Example()
Local $hWnd, $hMain
; Open Notepad
Run("notepad.exe")
WinWaitActive("[CLASS:Notepad]")
$hWnd = WinGetHandle("[CLASS:Notepad]")
$hMain = _GUICtrlMenu_GetMenu($hWnd)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hMain = ' & $hMain & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
$iD = _GUICtrlMenu_GetItemID ( $hMain, 4)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $iD = ' & $iD & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
$hMenu_save = _GUICtrlMenu_GetItemSubMenu($hMain, 4)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hMenu_save = ' & $hMenu_save & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
Sleep(1000)
; Remove Help menu
_GUICtrlMenu_RemoveMenu($hMain, 4)
Sleep(2000)
;~ ConsoleWrite(_GUICtrlMenu_SetMenu($hMain, $hMenu_save) & @CRLF)
;~ ConsoleWrite(_GUICtrlMenu_SetItemSubMenu ( $hMain, 4, $hMenu_save) & @CRLF)
;~ _GUICtrlMenu_InsertMenuItem ( $hMain, 4, "Help", $iD, $hMain)
_GUICtrlMenu_DrawMenuBar($hMain)
EndFunc ;==>Example
Alles anzeigen
Zitat
Deletes a menu item or detaches a submenu from the specified menu. If the menu item opens a drop-down menu or submenu, RemoveMenu does not destroy the menu or its handle, allowing the menu to be reused. Before this function is called, the GetSubMenu function should retrieve a handle to the drop-down menu or submenu.
Danke.
Heute habe ich dein Tool gestartet... und nach dem ~17 Song ist auf einmal nur noch Stille... kommt nichts mehr... aber (das Wichtigste) der Ball dreht sich noch.
Puuh, da bin ja beruhigt.
Für die zusätzlichen Buttonbar-Windows überwacht DisplayFusion die Position der Windows, die eine Titelbar haben. Ändert sich eine Position, wird das zugehörige Buttonbar-Windows entsprechend verschoben. Mehr passiert nicht mit den Windows. Falls gewünscht, kann man das Erzeugen eines zusätzlichen Buttonbar-Windows für bestimmte Fenster aber auch unterbinden... FireFox ist in der Liste schon vordefiniert.
Falls es dir nicht zu viel Umstände bereitet: könntest du das Tool mal abschalten und nochmals testen? Denn ich arbeite primär auch auf Win10 x64 und bei mir läuft alles wie geplant.
DisplayFusion... daran liegt es aber sicher nicht, denn da wird nur was ausgelöst, wenn ich einen der Buttons anklicke.
Fenster auf Titelleiste reduzieren, Fenster auf nächsten Monitor verschieben, Fenster immer im Vordergrund halten, Einstellungen (DisplayFusion) öffnen
Hmm, die Aussage ist aber gewagt. Irgendwie muss das Tool ja sich in die CMD Fenster einklinken und entsprechend reagieren. Ich möchte aber auch nicht behaupten, dass dies daran liegt, aber ausschließen möchte ich es auch nicht.
Radio Station amigaremix.com.exe
Nach dem 3. Song ist der Ball weg und ich sehe nur noch ein schwarzes Rechteck... nach dem 4. ist auch das weg... Win 10 X64.
Ist das immer nach dem 3. Song?
Ist wie beim Abspann von einem Film. In seltensten Fällen wird der Abspann angeschaut, es sei denn, man kann was sehen und/oder hören.
Die fliegenden Buchstaben eignen sich eher für kürzere Texte. Für längere Texte würde ich dann eher eine Laufschrift nehmen, wie beim Filmabspann.
Hier meine Version auch im diesem Forum.
Radio Station amigaremix.com.exe
Nach dem 3. Song ist der Ball weg und ich sehe nur noch ein schwarzes Rechteck... nach dem 4. ist auch das weg... Win 10 X64.
Erst einmal danke fürs Testen. Hmmm, das ist aber komisch, denn ich arbeite primär auch mit Win10 x64 und bei mir dreht sich der Ball durchgehend, zumal die GIF Animation alle 30 ms aktualisiert wird.
Bei dir muss wohl was anders sein. Ich sehe auf dem Screenshot, dass die CMD Titelleiste noch einige Icons hat, die kein Standard sind. Was ist das für ein Tool, dass sich in das CMD Fenster einklinkt?
Sodele, sollte nun eigentlich auch auf Win7 rund laufen.
Könntet ihr bitte nochmals testen? In meiner Win7 VM sah alles gut aus.
Danke.
Ein Problem habe ich noch, wenn bei einer Multi Monitor Umgebung mit verschiedenen DPI Einstellungen das Fenster zwischen den Monitoren hin und her bewegt wird, dann schrumpft das Fenster.
ConEmu - mein Favorit für die CMD.
Schaue ich mir an.
Das mit der rechten Maustaste ist ein Feature der Console, d.h. der Inhalt des Clipboards wird in die Console gesendet (Quick Edit Mode). Muss mal checken, wie ich dies abschalten kann.