VBScript - Ereignis mitbekommen per Schleife?

  • Zwischenstand

    Eine Schleife funktioniert leider nicht, der Editor friert dadurch ein, oder lässt sich nicht beenden, oder es hat sonstige ungewollte Auswirkungen. Auf jeden Fall ist ein Monitoring im Hintergrund so nicht möglich, und auch kein normales arbeiten im Editor. Dabei ist es egal wie ich die Schleife gestalte, ob mit Sleep, Wait, Timeout, Delay (DOS-Ping), und was es sonst noch so gibt. Auch habe ich Delay-Funktionen in einen anderen Thread ausgelagert, aber in VBScript gibt es kein "DoEvents". Somit hat auch das nichts bewirkt.

    Ich habe mit dem PSPad-Entwickler gesprochen (Forum). Leider unterstützt PSPad keine Events in den Scripts.

    Die einzige, realistische Möglichkeit die ich sehe ist ein echter Timer, der NICHT die Ausführung unterbricht, sondern in Zeitintervallen ein Event feuert. Wenn er das z. B. alle 200 ms macht, ist damit ein durchaus praktikables Monitoring möglich.

    Problem: An dem Timer-Code bin ich seit Tagen dran und habe keine Möglichkeit für VBScript gefunden. Es liegen mir Timer in VB, Delphi, und anderen Sprachen vor, sogar in VBA! Aber keiner lässt sich in VBScript übertragen.

    Ich werde dran bleiben und weiter suchen. Vielleicht hat ja jemand eine Idee oder Tipps und möchte sie teilen? :)

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Auch habe ich Delay-Funktionen in einen anderen Thread ausgelagert, aber in VBScript gibt es kein "DoEvents". Somit hat auch das nichts bewirkt.

    Das mit den Threads kann nicht richtig sein, wenn der Thread unabhängig läuft, sollte da nichts einfrieren.

    Es ist blöd, dass es kein DoEvents gibt, aber das muss dementsprechend bedeuten, dass deine Skripte bei bestimmten Aktionen oder alle x Sekunden ausgeführt werden.

    Alle Erweiterungen die ich bisher gesehen hab konnte man nur über einen Menupunkt aufrufen, aber es kann ja nicht unmöglich sein parallel was laufen zu haben.

    Für Notepad++ kann man problemlos Threads laufen haben, man muss nur aufpassen, dass man die Funktionen richtig invoked.

    Wenn VBScript sowas nicht anbietet musst du mal schauen ob du dein Plugin vielleicht nicht anders angebunden bekommst. Statt die Funktionalität über einen Menupunkt hinzuzufügen, vielleicht als Hintergrundtask.

    Ich weiß nicht wie viel Spielraum man da in PSPad hat, da kennt sich der Entwickler bestimmt am besten aus. Aber es sollte möglich sein, ein Skript im Hintergrund laufen zu haben, oder beim wechseln der Cursorposition ein Plugin auszuführen.

    Im Endeffekt ist der Menupunkt ja auch ein Event, was den Callback (deine Pluginfunktion) feuert, wenn draufgeklickt wird.

    Ich sehe aber in der Dokumentation, dass Beispiele von vbScript, Javascript UND Python gegeben sind. Kannst du nicht dein Plugin in Javascript oder Python schreiben? Die sollten doch bestimmt Threads unterstützten?

    Sollte auch das nicht funktionieren, kannst du einen MacGyver-Workaround basteln indem du aus deinem vbScript einfach eine selbstgeschriebes AutoIt-Skript ausführst, welches alle x Millisekunden den Hotkey zum Ausführen deines Plugins tätigt.

    So erreicht man sein Ziel zwar auch, aber absolut nicht empfehlenswert.

  • Das mit den Threads kann nicht richtig sein, wenn der Thread unabhängig läuft, sollte da nichts einfrieren.

    Leider doch. Ich erkläre mir das so, dass auch eine ausgelagerte Delay-Funktion im Grunde die Ausführung des Scripts pausiert. Das pausierte Script lässt dann halt das Programm (PSPad) einfrieren usw.

    Alle Erweiterungen die ich bisher gesehen hab konnte man nur über einen Menupunkt aufrufen, aber es kann ja nicht unmöglich sein parallel was laufen zu haben.

    Die Menüpunkte nutzen leider nichts, es geht hier ja um eine Monitoring-Möglichkeit. Das Script soll laufen, sobald PSPad gestartet wird und dann im Hintergrund prüfen, ob dies oder das im Editor passiert. Also z. B. alle 200 ms prüfen, ob der User etwas im Editor markiert hat und dementsprechend eine Aktion ausführen.

    ... MacGyver-Workaround basteln indem du aus deinem vbScript einfach eine selbstgeschriebes AutoIt-Skript ausführst, welches alle x Millisekunden den Hotkey zum Ausführen deines Plugins tätigt.

    Interessante Idee! Nicht dass ich nicht selbst schon daran gedacht hätte, :D aber da gibt es mindestens 2 Argumente, die dagegen sprechen. Erstens gibt es keine vernünftige Schnittstelle, um einen PSPad-Hotkey von außerhalb auszulösen (es müsste ein "größerer Hack" her, z. B. per SendMessage). Ansich würde ich das gerne ausprobieren, aber das zweite Argument wird das wohl obsolet machen: Wenn alle 200 ms ein Hotkey ausgelöst wird, zieht das dem User "die Maus unter der Hand weg". Ich denke, das würde die Benutzbarkeit genauso beeinträchtigen, wie die o.g. Sleep-Funktionen.

    Ich sehe aber in der Dokumentation, dass Beispiele von vbScript, Javascript UND Python gegeben sind. Kannst du nicht dein Plugin in Javascript oder Python schreiben?

    Python ist nur im Zusammenhang mit "Regular Expression HOWTO (For Python)" genannt. Keine Schnittstelle. ;(

    JScript hatte ich schon ins Auge gefasst, aber bisher eher verworfen. JScript hat eine Art Verwandschaft zu JavaScript und alles was mit Java zu tun hat, hat bei mir den Beigeschmack, dass es nicht läuft, wenn "dies" fehlt und "das" nicht installiert ist, ect. ... - Auf gut Deutsch, ich hatte bisher Bedenken, da Arbeit rein zu stecken, wenns dann vielleicht nachher gar nicht läuft. VBScript läuft (bei mir) auf Win 10 auf Anhieb, ohne dass ich was machen muss, bei JScript bin ich mir nicht sicher. ==> Infos willkommen! :)

    Wenn JScript eine Option wäre, hätte es den Vorteil, dass ich da schon Timer-Funktionen gesehen habe. Auch das habe ich jedoch verworfen, da auf vielen MS-Websites ein Hinweisbanner erscheint, in dem vom Support-Ende die Rede ist. Auch Wikipedia schreibt, dass JScript vergangen ist, während VBScript noch supported wird (Zukünftige Nutzung von VBScript).

    Bis hierhin ein dickes Danke für die Ideen und Anregungen! Ich tauche jetzt mal wieder in Recherchen ein und suche weiter. Ich habe derzeit HTA im Blick ... mal sehen. ;)

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Leider doch. Ich erkläre mir das so, dass auch eine ausgelagerte Delay-Funktion im Grunde die Ausführung des Scripts pausiert. Das pausierte Script lässt dann halt das Programm (PSPad) einfrieren usw.

    Kannst du mal den Code dazu posten? Threads sollten völlig unabhängig voneinander laufen. Es sei denn du wartest im Hauptskript auf die Beendigung des Threads, dann ist das Verhalten verständlich.

    Vielleicht hast du ja nur einen kleinen Knicks drinne.

    Die Menüpunkte nutzen leider nichts, es geht hier ja um eine Monitoring-Möglichkeit. Das Script soll laufen, sobald PSPad gestartet wird und dann im Hintergrund prüfen, ob dies oder das im Editor passiert. Also z. B. alle 200 ms prüfen, ob der User etwas im Editor markiert hat und dementsprechend eine Aktion ausführen.

    Darauf wollte ich ja hinaus. Notepad++ Addons erlauben beispielsweise Aufruf von Funktionen über Menupunkte, aber lassen den Code parallel laufen, so ist es egal ob Threads gespawnt werden, der Editor friert nur ein wenn auf dem Editorthread pausiert wird.

    Interessante Idee! Nicht dass ich nicht selbst schon daran gedacht hätte, :D aber da gibt es mindestens 2 Argumente, die dagegen sprechen. Erstens gibt es keine vernünftige Schnittstelle, um einen PSPad-Hotkey von außerhalb auszulösen (es müsste ein "größerer Hack" her, z. B. per SendMessage). Ansich würde ich das gerne ausprobieren, aber das zweite Argument wird das wohl obsolet machen: Wenn alle 200 ms ein Hotkey ausgelöst wird, zieht das dem User "die Maus unter der Hand weg". Ich denke, das würde die Benutzbarkeit genauso beeinträchtigen, wie die o.g. Sleep-Funktionen.

    Es gänge auch ein bisschen schmutziger, aber sauberer in anderer Hinsicht. Du könntest Code-Injecten und deine Funktion einfach alle x Sekunden aufrufen, das würde aber voraussetzen, dass du die Speicheradressen von PSPad anwählen kannst und das bezweifle ich extrem stark.

    Sowas wäre nur über Drittskript möglich, und würde dazu führen, dass man wenn man den Editor gestartet hat, erst die Timerfunktionalität injecten müsste. Aber lassen wir das mal sein, hat viele andere Nachteile.

    Python ist nur im Zusammenhang mit "Regular Expression HOWTO (For Python)" genannt. Keine Schnittstelle. ;(

    Sicher? In der Dokumentation sind doch Beispiele mit Python gegeben? Siehe pspadVersion. vbScript, Javascript und Python.

    Es sind sogar Funktionen als Beispiel genannt wo die Init Funktion in Python gegeben ist wie z.B. bei addMenuItem.

  • Du hast Recht, es werden Beispiele mit Python genannt. Das scheinen jedoch nur Überbleibsel aus früheren Versionen zu sein (ich glaube, PSPad wurde ab Version 5.0 komplett neu geschrieben, wg. Unicode usw.). Hier ein Screenshot (Win-Explorer) vom Script-Ordner und den Möglichkeiten für Scripts. Kein Python.

    Kannst du mal den Code dazu posten?

    Hier ein Screenshot.

    Threads sollten völlig unabhängig voneinander laufen. Es sei denn du wartest im Hauptskript auf die Beendigung des Threads, dann ist das Verhalten verständlich.

    So ist es. Mein (Haupt-)Script ruft die externe Funktion genau aus dem Grund auf, um sich selbst zu pausieren. - Wenn mans so ausspricht, ist's schon eine blöde Idee. 8o Ob das Script nun mithilfe einer internen oder einer externen Funktion pausiert, Einfrieren ist einfrieren.

    Du hast mich motiviert, mehr über VBScript und HTA zu recherchieren. Da waren vielversprechende Sachen dabei. Ich denke nach wie vor es kann nur über einen Timer funktionieren, der alle 200 ms ein Event feuert.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • So ist es. Mein (Haupt-)Script ruft die externe Funktion genau aus dem Grund auf, um sich selbst zu pausieren.

    Nimm lieber das Standard Sleep / Delay von vbScript oder wenigstens timeout 5 (5 = Sekunden) als Shellbefehl. Einen externen Aufruf brauchst du nicht, aber ich glaub das war ja sowieso nur zum testen.

    (Du kannst damit ja auch externe Sachen parallel laufen lassen wenn du aus dem True ein False machst, bringt dir aber nicht viel weil du auf den Editor keinen Zugriff hast).

    Callst du eigentlich deine TestRoutine grad mit einem Menupunkt? Oder wie rufst du die auf?

    Vielleicht findest du ja im JScript noch Timer, einfach fleißig suchen, irgendwas findest du schon. Und wenn nicht, dann bastelst du einfach einen Workaround bis etwas vernünftiges implementiert ist (über Code-Injection oder ähnlichem).

    Nebenbei bemerkt: Das setzen von wshShell brauchst du doch auch nicht, die Variable sollte doch nach der Funktion ungültig sein oder nicht?

  • Sleep und Co. habe ich abgehakt, weil nach meinem Ermessen ein Script eine Unterfunktion von PSPad darstellt, die das Programm stark beeinflusst. Ein Do-Loop wird somit entweder die CPU merklich auslasten, oder eben per Sleep und Co die Ausführung von PSPad behindern. Es muss ein Timer her. (Ich gucke mal, ob das in JScript nicht doch geht.)

    Das setzen von wshShell brauchst du doch auch nicht, die Variable sollte doch nach der Funktion ungültig sein oder nicht?

    Das wäre nicht tragisch, da die Funktion ja die ganze Zeit laufen soll. (Beim Starten von PSPad die Funktion starten, beim Beenden von PSPad die Funktion beenden.)

    Callst du eigentlich deine TestRoutine grad mit einem Menupunkt? Oder wie rufst du die auf?

    Das Script hat eine INIT-Routine, die beim Starten von PSPad aufgerufen wird = sehr praktisch! ;)

    Ich habe jetzt weitere Test mit HTA im VBScript gemacht, aber das gleiche Ergebnis: Der Code wird ausgeführt, erzeugt ein Fenster und blockiert PSPad in sofern, dass PSPad sich nicht schließen lässt, solange das Fenster existiert. - - - Das Fenster wiederum ist die notwendige Vorstufe, um einen Timer zu erzeugen. In HTA ist alles abhängig von einem Fenster. Normalerweise ist es für Browser gedacht. ... Ach, ist das alles kompliziert! :S Warum nicht einfach wie in AutoIt ein _WinAPI_SetTimer aufrufen und fertig.

    _WinAPI_SetTimer

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Vielleicht kriegst du den Entwickler ja dazu genötigt einen rudimentären Timer einzubauen, dann kannst du mit der Version in der Beta arbeiten und wenn er die Zeit hat und das fertig gebastelt hat pusht er das ganze als Release.

    Die letzte Version ist vom Februar 2019, also wird ja daran noch mehr oder weniger aktiv gearbeitet und so viel Arbeit sollte das ja auch nicht sein, einfach eine Option anbieten, alle x Sekunden eine Funktion zu callen.

    Wenns mit JScript klappt kannst du ja stattdessen damit weiterarbeiten, ich denke da nimmt sich nicht viel zwischen den Sprachen.

    Wärs Open-Source hättest du das selber machen können, aber so wie ich das sehe ist das nicht Open-Source.

    Andere Idee: Kannst du die Skriptinstanz/-umgebung an ein anderes Script weitergeben? Also ein vbScript extern ausführen aber noch auf die Editorfunktionen zugreifen?

  • Kein Erfolg mit JScript! Ich krieg nichts ins Laufen. Alles ist mit dem Browser verbunden, den es im Editor nicht gibt. Überall steht "window.setInterval(...)", aber ich weiß nicht, wo ich "window" herbekommen soll. Es ist echt der Hammer, wie bescheuert schwierig es ist, einen Timer in ein VB- oder JScript zu bekommen! Das muss doch möglich sein.

    Aber nicht mehr heut. Gute Nacht! :sleeping:

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    • Offizieller Beitrag

    Ich klinke mich mal kurz ein, da ich der Meinung bin, du verrennst dich.

    - Funktionen lassen sich in PSPad nur ausführen, wenn sie in einem Skript vorliegen und dieses eine INIT-Routine enthält (diese wird beim Start von PSPad gelesen)

    - Diese Funktionen müssen an einen Menüpunkt oder an einen Hotkey gekoppelt sein

    - PSPad stellt keine Events bereit auf die reagiert werden kann

    - Es gibt kein globales Startup-Skript, indem man zum Bsp. Callbackfunktionen registrieren könnte

    Fazit:

    Eine Individualisierung außerhalb von Menüpunkten und Hotkeys ist nicht vorgesehen und somit mit internen Mitteln des Editors nicht lösbar.

    Vielleicht lässt sich mit Message-Hooking, Injection, o.ä. Zugriff auf die erforderlichen Events erhalten. Bleibt zu prüfen, ob der Aufwand in irgendeinem sinnvollen Verhältnis zum Nutzen steht.

    Sehr gut individualisieren lassen sich (neben SciTE) z.B. die Editoren Visual Studio Code oder auch Sublime Text. Du musst entscheiden, ob dir Klicki-Bunti-Oberfläche wichtig ist, oder ein funktionaler, sehr gut erweiterbarer Editor.

  • Ich finde deine Einschätzung richtig. PSPad bietet zwar Schnittstellen zum Erstellen von User Extentions, aber die können nur per Shortcut genutzt werden. Das Message-Hooking behalte ich mal im Hinterkopf.

    Bleibt zu prüfen, ob der Aufwand in irgendeinem sinnvollen Verhältnis zum Nutzen steht.

    Da hast du grundsätzlich Recht. Ich sehe es aber auf 2 Ebenen: Die grundsätzliche, und die individuelle.

    Zur grundsätzlichen Ebene: Bei mir gibt es keinen Zeit- oder Erfolgsdruck, für mich ist das ein Hobby. Hobbys kosten. In diesem Fall Zeit und Aufwand, den ich gerne investiere und selbst wenns in die Hose geht, genieße ich dennoch die Zeit der Suche und Entwicklung. Das ist fast wie ein guter Krimi. ;) Der Aufwand lohn sich, solange es Spaß macht. Sollte ich Erfolg haben, teile ich das mit anderen, die dann auch was davon haben.

    Zur individuellen Ebene: Hingegen kann ein einzelner Punkt zu große Probleme machen, sodass dadurch die Frustration größer ist, als der Spaß an der Arbeit. In dem Fall schlafe ich eine Nacht darüber und kann dann sehr wohl zum Schluß kommen, diesen Punkt nicht weiterzuverfolgen.

    Visual Studio Code kenne ich, Sublime Text habe ich mir nun angesehen. Beide haben, sagen wir mal, viel Potential. Beide sind nicht mein "Geschmack".

    Bei PSPad war es von Anfang an "Liebe auf den ersten Blick". Ich habe das Programm installiert, cpp-, pas- und bat- Dateien geladen, und sofort waren Highlighter-Features zur Verfügung. Selbst damals als Programmier-Anfänger fand ich mich mit den Menüs auf Anhieb zurecht, und die Einstellungen waren in einem einzelnen, zentralen Einstellungsdialog zu erreichen. Dort konnte ich ohne Programmieraufwand, einfach mit der Maus die Einstellungen setzen, die mir gefiehlen.

    Mit mehr Erfahrung tauchte ich auch tiefer in die Einstellmöglichkeiten ein. So konnte ich (wie gesagt, damals Programmier-Anfänger) recht schnell aut-Dateien (aut = AutoIt2) im Highlighter einbinden, und später dann au3-Dateien. Bis heute konnte ich PSPad eine "AutoIt-Funktionalität" einhauchen, die geschätzt 60 % von SciTE abdeckt. Tendenz steigend.

    ...

    OK, es gibt gute Neuigkeiten. Im PSPad Forum gab es weitere positive Reaktionen. Jan Fiala, der Entwickler von PSPad hat angeboten, Features einzubauen, die wieder ein Stück weiter helfen. Im Moment bin ich ganz aufgeregt, und werde mich erstmal darum kümmern. :klatschen:

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Zur grundsätzlichen Ebene: Bei mir gibt es keinen Zeit- oder Erfolgsdruck, für mich ist das ein Hobby. Hobbys kosten. In diesem Fall Zeit und Aufwand, den ich gerne investiere und selbst wenns in die Hose geht, genieße ich dennoch die Zeit der Suche und Entwicklung. Das ist fast wie ein guter Krimi. ;) Der Aufwand lohn sich, solange es Spaß macht. Sollte ich Erfolg haben, teile ich das mit anderen, die dann auch was davon haben.

    Das sollte sich grundsätzlich jeder Programmierer mal zu Herzen nehmen. Ich weiß gar nicht wie viele Projekte ich gebastelt habe einfach um das mal gemacht zu haben obwohl es das gleiche in viel besser schon von anderen Entwicklern gibt.

    Realistisch betrachtet wird das PSPad Plugin kaum jemand nutzen, aber der Erfahrungsgewinn dadurch ist enorm groß, einfach weil man programmiert und in dem limitierten Bereich arbeiten muss.

    Da du sowieso keinen Zeit- und Erfolgsdruck hast kannst du einfach nach Lust und Laune dran arbeiten.

    Kein Erfolg mit JScript! Ich krieg nichts ins Laufen. Alles ist mit dem Browser verbunden, den es im Editor nicht gibt. Überall steht "window.setInterval(...)", aber ich weiß nicht, wo ich "window" herbekommen soll.

    Das ist das Browserfenster, du dürfest da auch Zugriff auf document haben und das sind Standardelemente in der Webprogrammierung.

    Wenn die Events eingebaut sind kannst du sicherlich richtig loslegen, die Sorgen, dass ein Skript den Editor zum hängen bringt ist meiner Meinung nach eher Quatsch.

    Denn auch ohne Events kann man den Editor einfach zum Hängen bringen. Wenn man in den Events die Codebereiche synchronisiert bzw. mit Semaphoren oder Mutex, dann wird da auch nichts doppelt ausgeführt oder könnte sich aufhängen.

  • Wenn die Events eingebaut sind kannst du sicherlich richtig loslegen, ...

    Ah, guter Hinweis. Denn dabei fällt mir ein, dass die Events nur dann nutzen, wenn sie eigenständig auslösen. Damit meine ich, dass User-Code ausgeführt wird, wenn das Event gefeuert wird. - Ist schwer auszudrücken - Ich versuchs mal in einfach: Der Extention-Schreiber soll seinen Code einfach in ein Event setzen können, ohne sich um ein Monitoring kümmern müssen.

    Die Gefahr sehe ich schon, dass durch falsch desingneten Code der Editor aufhängt wird. So haben meine derzeitigen Studien der VBScript Monitoring-Möglichkeiten gezeigt, dass jegliches Do-Loop mit Sleep das Hauptprogramm mehr oder weniger zum Erliegen bringt. Ein Versuch mit Sleep 10 brachte zwar eine brauchbare Handhabbarkeit, aber PSPad konnte nicht mehr beendet werden. :(

    Auch das Beispiel von Jan ist einleuchtend: Wenn der Extention-Schreiber z. B. den markierten Text auswertet und ändert, während der Editor-User selbst den markierten Text ändert, kann das in eine Endlos-Schleife laufen.

    Insgesamt verstehe ich die Einwände von Jan. Ein Extention-Schreiber müsste wirklich sehr vorsichtig programmieren, um keinen Schaden zu verursachen.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Auch das Beispiel von Jan ist einleuchtend: Wenn der Extention-Schreiber z. B. den markierten Text auswertet und ändert, während der Editor-User selbst den markierten Text ändert, kann das in eine Endlos-Schleife laufen.

    Das mag sich anfänglich übel anhören, ist es aber nicht. Je nachdem wie die Event-Callbacks registriert werden deregistrierst du ihn einfach.

    Viele WM-Funktionen werden so in AutoIt realisiert.

    Ein kleines Beispiel findest du z.B. bei meiner GUIScaling-UDF.

    Code
    Func _GUI_WM_DPICHANGED($hWnd, $iMsg, $wParam, $lParam)
        GUIRegisterMsg($WM_DPICHANGED, "")
    
        Local $tRect = DllStructCreate($tagRECT, $lParam)
        _GUI_Resize($hWnd, DllStructGetData($tRect, "Left"), DllStructGetData($tRect, "Top"), _WinAPI_HiWord($wParam))
    
        GUIRegisterMsg($WM_DPICHANGED, _GUI_WM_DPICHANGED)
    
        Return $GUI_RUNDEFMSG
    EndFunc

    Wenn das Fenster auf einen anderen Monitor mit unterschiedlicher DPI-gezogen wird, dann wird _GUI_WM_DPICHANGED ausgelöst.

    Innerhalb der Funktion werden die von Windows vorgeschlagenen neuen Koordinaten verwendet um das Fenster zuresizen und zu WinMoven (WinMove passiert in der _GUI_Resize).

    Würde man die WM_DPICHANGED nicht deregistrieren würde das Fenster auf dem neuen Monitor die falsche DPI haben, da das Fenster erst gemoved wird, das DPI-Event nochmal ausgelöst wird, es wird wieder gemoved, resized, und anschließend mit dem ursprünglichen Resizing resized.

    Das ist aber nicht Sinn der Sache, also deregsitrieren wir den Callback, behandeln die DPI-Changed Routine indem das Fenster verschoben und resized wird, so, dass es nicht mehr das DPI-Changed Event auslöst wenn die Nachricht wieder registriert wird, und zu guter letzt wird der Callback dazu wieder registriert.

    Im Kerne möchte ich darauf hinaus: Erlaubt es PSPad innerhalb von Skripten die Callbacks zu registrieren, dann ist der Pluginentwickler vollends selber schuld, denn so schwierig ist das nicht.

    Wird das Callback nur einmal registriert, bzw. über Plugineinstellungen, und man hat im Nachhinein keine Möglichkeit mehr das zu ändern, dann verwendet man einfach Sempaphoren / Mutex.

    Das kann dann in etwa so aussehen.

    So würde die zweite gefeuerte Eventfunktion den Code nicht auslösen, da der Trigger noch gesetzt ist.

    Darf das Plugin die Callbacks zu jeder Zeit selber setzen, und nicht nur im Init oder in den Plugineinstellungen ginge das ganze noch einfacher:

  • Wow, danke für die Info! Ich wollte sowieso schon nach CallBacks frage, die auch BugFix schon erwähnt hat, habe mich dann aber entschlossen, das hinten anzustellen. Ich bin im Moment wirklich begeistert über all die positiven Rückmeldungen, aber auch sehr belastet. Um mich nicht zu überlasten, muss ich Prioritäten setzten. Das funktioniert auch ganz gut. Auch wenn es langsam vorwärts geht, es geht! :thumbup:

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    • Offizieller Beitrag

    Ich hab dir mal ein Bsp. gemacht, wie du von ausserhalb selbst auf Tastaturevents in PSPad reagieren kannst:

  • Hallo BugFix,

    erstaunlicherweise habe ich gestern genau über das Thema nachgedacht und kann deinen Tip wirklich gut gebrauchen. Gleich mal ausprobieren.

    ... tick-tack ...

    Ausprobiert. Fazit: Wahnsinn! :thumbup:Dadurch eröffnen sich nicht nur eine Menge Möglichkeiten, sondern ich kann mich auch ein wichtiges Problem kümmern.

    Wenn man in SciTE ein AutoIt-Script auführt (F5) und das Script in einer Routine festhängt, kann man mit dem Hotkey "Ctrl+Break" die Ausführung abbrechen. Diese Funktionalität versuche ich in PSPad zu nachzubauen. Mithilfe deines Codes kann ich schonmal die Hotkeys auswerten. Fehlt nur noch eine Idee, wie ich die Ausführung des AutoIt-Scripts abbreche. :/

    Nachtrag: Gemeint ist: Welcher Anwendung / welchem Prozess genau soll eine "Schließen-Nachricht" gesendet weden?

    Ausschlaggebend ist dabei nicht PSPad, sondern AutoIt und der (SciTE-)AutoIt3Wrapper (PSPad ist solange unbedienbar). Meine biherige Erkenntnis ist recht mager: Während des Vorgangs werden im Win-Task-Manager 4 Dateien angezeigt, die alle den Namen "AutoIt v3 Script (32 Bit)" tragen.

    Mal sehen. Ich wollte es hier nur kurz erwähnen, und wenn ich nicht weiterkomme, gehts in einem eigenen Thread weiter. Bis hierhin komme ich mit deinem Code ein gutes Stück weiter. :)

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    2 Mal editiert, zuletzt von Professor Bernd (12. Oktober 2019 um 19:20)

  • Das Problem ist, die richtigen PIDs zu finden/wissen. Es soll ja nicht ein anderes AutoIt-Script abgeschossen werden, das ein User bei sich laufen hat. Dazu müsste ich halt erst wissen, "wem" ich die Schließen-Nachricht schicken soll. :/

    Nachtrag: Was bedeuted denn "Du spawnst doch die neuen Skripte"?

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.