
Gestern habe ich beim gelangweilten stöbern im QB64.org-Forum ein Projekt gefunden das (zumindest in der Anfangsphase, weiter habe ich nicht gelesen) wie der SpriteXtractor nur vorgegebene Maus- und Tastatureingaben abspult. Dazu verwendet es den Befehl _SCREENCLICK.
Ich wußte doch das so ein Befehl exisitert.
Mit _SCREENPRINT hätte ich in dem selben Wikieintrag auch die Tatstatureingabe entdeckt.
http://qb64.org/wiki/SCREENCLICK
http://qb64.org/wiki/SCREENPRINT
THEORETISCH müßte ich jetzt die von mir angewandte umständliche Version aus meinem Code gegen die neu gefundenen bereits in QB64 implementierten Versionen austauschen. So wegen potentiellen Geschwindigkeitsgewinn, Umständlichkeit und bla.
Da meine Probleme aber ganz wo anders liegen, lasse ich das aber jetzt so. Es funktioniert und ist in der verbleibenden Anwendung nicht komplizierter als die interne Version.
Der Eintrag zu _SCREENPRINT hat indes einen interessantes Beispiel:DEFLNG A-Z
SCREEN _NEWIMAGE(640, 480, 32)
PRINT "OPENing and MAXIMIZING Notepad in 5 seconds..."; : _DELAY 5
SHELL _DONTWAIT "START /MAX NotePad.exe" 'opens Notepad file "untitled.txt"
'detect notepad open and maximized 'condition: 80% or more of the screen is white
DO 'read the desktop screen image for maximized window
s = _SCREENIMAGE
_SOURCE s
z = 0
FOR y = 0 TO _HEIGHT(s) - 1 'scan for large white area
FOR x = 0 TO _WIDTH(s) - 1
c = POINT(x, y)
IF c = _RGB32(255, 255, 255) THEN z = z + 1
NEXT
NEXT
IF z / (_HEIGHT(s) * _WIDTH(s)) > 0.8 THEN EXIT DO 'when 80% of screen is white
_FREEIMAGE s 'free desktop image
_LIMIT 1 'scans 1 loop per second
PRINT ".";
LOOP
PRINT
PRINT "NOTEPAD detected as OPEN and MAXIMIZED"
_SCREENPRINT "HELLO WORLD"
SLEEP 2
_SCREENPRINT CHR$(8) + CHR$(8) + CHR$(8) + CHR$(8) + CHR$(8) 'backspace 5 characters
SLEEP 3
_SCREENPRINT "QB64!"
SLEEP 2
_SCREENPRINT CHR$(1) 'CTRL + A select all
SLEEP 2
_SCREENPRINT CHR$(3) 'CTRL + C copy to clipboard
SLEEP 2
PRINT _CLIPBOARD$
_CLIPBOARD$ = "QB64 ROCKS!"
SLEEP 2
_SCREENPRINT CHR$(22) 'CTRL + V paste from clipboard
END
Der Teil der mich so besonders anspricht ist der in dem kontrolliert wird ob 80% des Bildschirms weiß sind. In meinem SpriteXtractor prüfe ich ja nur einzelne Pixel, aber hier wird ein ganzer Bereich herangenommen.
Der Code geht Höhe x Breite alle Pixel ab und zählt alle deren _RGB32-Wert weiß ist zusammen. Dann wird diese Summe (z) durch die Gesamtanzahl der geprüften Pixel (=Höhe*Breite) dividiert und sollte das Ergebnis größer als 0.80 sein gilt dies als Indiz das Notepad geöffnet ist.
Klar ist das es nur funktioniert wenn der Textbereich von Notepad vom Start weg tatsächlich mehr als 80% des Bildschirmes einnimmt. Mehrere Monitore oder manuell skalierte Fenster killen diesen Ansatz schnell.
Da ich beim vSNES afaik alle Fensterpositionen & größen in der .ini definiert habe sollte aktuell für das „erkennen“ ausgeblendeter Buttons eigentlich die Abfrage einzelner Pixel genügen, allerdings habe ich beim testen auch „leere“ Layer entdeckt. Dafür könnte ich die diese Routine adaptieren.