ScreenUpdating während Ausführung eines Skripts unterbinden

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Johnny R
Posts: 348
Joined: 03 Oct 2013, 02:07

ScreenUpdating während Ausführung eines Skripts unterbinden

24 Nov 2017, 14:49

Gibt es einen Weg, das ScreenUpdating (d. h. die Bildschirmaktualisierung) während der Ausführung eines Skripts zu unterbinden? Ich benutze z. B. ein Skript, das eine Menge im Menü eines Programms herumwerkelt um eine bestimmte Aktion auszulösen:

Code: Select all

Send, {ALTDOWN}a{ALTUP}{DOWN 2}{ENTER 2}
Während das Skript läuft, kann/muss man alle diese Menüaktionen beobachten, was nicht jedermanns Sache ist und ggf. auch unprofessionell wirkt. Es wäre schön, wenn man das während der Ausführung des Skripts abschalten könnte. Bei MS Office heißt die entsprechende Eigenschaft bei der VBA-Makroprogrammierung z. B.

Code: Select all

Application.ScreenUpdating
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: ScreenUpdating während Ausführung eines Skripts unterbinden

25 Nov 2017, 02:18

Es gibt in AHK einige befehlssätze, welche ohne visuellen event agieren. SendMessage/PostMessage/OnMessage/Control...
Johnny R
Posts: 348
Joined: 03 Oct 2013, 02:07

Re: ScreenUpdating während Ausführung eines Skripts unterbinden

25 Nov 2017, 03:05

Danke, Bobo, aber ich fürchte, das hilft mir nicht weiter. Bei der beschriebenen Befehlsfolge im Menü geht es um den Befehl "Ansicht->Baumelemente sortieren...->Aufsteigend nach Titel" im Programm MemoMaster.
Image
Last edited by Johnny R on 25 Nov 2017, 11:57, edited 1 time in total.
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: ScreenUpdating während Ausführung eines Skripts unterbinden

25 Nov 2017, 03:52

Moin,

wenn Du Glück hast: WinMenuSelectItem.
Ansonsten bliebe noch: LockWindowUpdate(). Ich habe das noch nicht probiert.
Johnny R
Posts: 348
Joined: 03 Oct 2013, 02:07

Re: ScreenUpdating während Ausführung eines Skripts unterbinden

25 Nov 2017, 06:35

Danke, Just me, aber

Code: Select all

WinMenuSelectItem, A,, Ansicht, Baumelemente sortieren...,Aufsteigend nach Titel
funktioniert hier leider weder ganz, noch teilweise und auch nicht in allen möglichen in der Hilfe angegebenen Schreibweisen. Warum das bei mir nicht geht, ist mir unklar. Außerdem habe ich den Verdacht, dass auch dieser Befehl das Aufpoppen des Menüs nicht unterbunden hätte, sondern ggf. vielleicht sogar gerade bezweckt.

LockWindowUpdate() habe ich nicht ausprobiert, weil dieser Befehl nach der Beschreibung etwas ganz anderes tut ("LockWindowUpdate is not intended for generalpurpose suppression of window redraw"). Allerdings scheint es einige ggf. einschlägig Messages (z. B. WM_SETREDRAW) zu geben, mit denen ich allerdings - unbedarft, wie ich bin - ganz sicher nicht klarkommen werde... :cry:
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: ScreenUpdating während Ausführung eines Skripts unterbinden

25 Nov 2017, 07:02

Es muss auch nicht funktionieren, wenn das Fenster kein Standardmenü verwendet. Wenn es aber funktioniert, wird das Menü dabei nicht angezeigt.

Zum Thema LockWindowUpdate():
Das MSDN enthält in vielen Funktionsbeschreibungen ähnliche Anmerkungen, die der Abschreckung dienen sollen. In den allermeisten Fällen haben die Programmierer das aber einfach ignoriert. Deshalb funktionieren noch die meisten der als "deprecated" bezeichneten Funktionen "aus der Kaiserzeit". Weil sie genutzt wurden und werden, hat sich Microsoft nicht getraut, sie tatsächlich zu entfernen. Du solltest das einfach mal probieren.
Johnny R
Posts: 348
Joined: 03 Oct 2013, 02:07

Re: ScreenUpdating während Ausführung eines Skripts unterbinden

25 Nov 2017, 11:37

Hallo, Just me! Hier heißt es, LockWindowUpdate() werde nicht empfohlen. Empfohlen werde hingegen

Code: Select all

SendMessage(Handle, wm_SetRedraw, 0, 0)
...
SendMessage(Handle, wm_SetRedraw, 1, 0)
RedrawWindow(Handle, nil, 0, RDW_INVALIDATE or RDW_ALLCHILDREN or RDW_UPDATENOW)
Wie müßte das unter AHK aussehen? Hast Du einen Plan?
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: ScreenUpdating während Ausführung eines Skripts unterbinden

26 Nov 2017, 04:00

Hallo, Johnny R,

ich glaube, die hier enthaltenen Verweise auf Raymond Chans "The Old New Thing" beschreiben die möglichen Nachteile von LockWindowUpdate() etwas präziser. Das Meiste hängt davon ab, was andere Anwendungen gleichzeitig zu tun versuchen. Hier werden aber auch die Probleme der Nachricht WM_SETREDRAW beschrieben. Das Fenster wird in einen Zustand "pseudo-unsichtbar" versetzt, was u.a. dazu führt, dass Mausklicks einfach "hindurchgehen". Man sollte das deshalb eventuell mit BlockInput kombinieren.

Ich habe schon länger eine SetRedraw() Funktion. Die erwartet als ersten Parameter die ID (HWND) des Fensters bzw. Controls und als zweiten True/1 (aktivieren) bzw. False/0 deaktivieren erwartet. Du kannst das ja mal probieren:

Code: Select all

#NoEnv
Menu, SubMenu, Add, Item1, MenuHandler
Menu, SubMenu, Add, Item2, MenuHandler
Menu, SubMenu, Add, Item3, MenuHandler
Menu, SubMenu, Add, Item4, MenuHandler
Menu, GuiMenu, Add, Menu 1, :SubMenu
Gui,+HwndHGUI +AlwaysOnTop
Gui, Menu, GuiMenu
Gui, Margin, 100, 100
Gui, Add, Button, w100, Test Button
Gui, Show, , Redraw Test
Return
GuiClose:
ExitApp
MenuHandler:
Return
; --------------------------------------------------------------------------------------------------------------------------------
^+t:: ; redraw aktivieren
SetRedraw(HGUI, 1)
Return
; --------------------------------------------------------------------------------------------------------------------------------
^+f:: ; redraw deaktivieren
SetRedraw(HGUI, 0)
; --------------------------------------------------------------------------------------------------------------------------------
SetRedraw(HWND, RedrawState) {
   ; -> msdn.microsoft.com/en-us/library/dd145219(v=vs.85).aspx
   ; WM_SETREDRAW = 0x000B, 0x485 : RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN
   RedrawState := !!RedrawState
   DllCall("SendMessage", "Ptr", HWND, "UInt", 0x0B, "Ptr", RedrawState, "Ptr", 0)
   If (RedrawState)
      DllCall("RedrawWindow", "Ptr", HWND, "Ptr", 0, "Ptr", 0, "UInt", 0x485)
}

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: Meister Lampe and 26 guests