ScreenUpdating während Ausführung eines Skripts unterbinden

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: ScreenUpdating während Ausführung eines Skripts unterbinden

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

Post by just me » 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)
}

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

Post by Johnny R » 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?

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

Post by just me » 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.

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

Post by Johnny R » 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:

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

Post by just me » 25 Nov 2017, 03:52

Moin,

wenn Du Glück hast: WinMenuSelectItem.
Ansonsten bliebe noch: LockWindowUpdate(). Ich habe das noch nicht probiert.

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

Post by Johnny R » 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

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

Post by BoBo » 25 Nov 2017, 02:18

Es gibt in AHK einige befehlssätze, welche ohne visuellen event agieren. SendMessage/PostMessage/OnMessage/Control...

ScreenUpdating während Ausführung eines Skripts unterbinden

Post by Johnny R » 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

Top