Beiträge von BugFix

    Ist es nicht einfacher, wenn du die Feststellung, wie "(" beim Anwender erstellt wird von diesem abfragst und in der INI speicherst (auch für verschiedene Layouts, die der User evtl. nutzt).

    Dann prüfst du auf genau diese gespeicherte Keysequenz.


    Die Abfrage an den Anwender könntets du so gestalten:


    Nur ein kleiner Schnipsel.


    Wenn ich die Mausposition benötige, brauche ich die häufig nicht in der Standardausgabe (absolute Screenkoordinaten), sondern z.B. relativ zum aktiven Fenster. Also schalte ich erst per Opt den Modus um und nach Positionsermittlung dann wieder zurück. Da die Skriptzeilen ja immer dieselben sind, bietet es sich an, dafür eine Funktion zu verwenden. Zusätzlich wandele ich die Koordinaten in eine POINT Struktur. Diese oder ein Pointer darauf wird in vielen anderen Funktionen benötigt. Wenn man die Struktur nicht braucht, macht es auch keinen Unterschied ob man $MPos[0] oder $MPos.X verwendet (Wobei die Struktur den Vorteil der besseren Lesbarkeit hat).


    Dazu läuft aber ständig dieser Browser im Vordergrund; das hätte ich gern unterbunden.

    Ich weiß nicht, ob man den negativen Desktopbereich capturen kann (also Browser aus dem sichtbaren Bereich verschoben). Falls ja, wäre das eine Lösung.

    Ansonsten - hast du evtl. einen alten Monitor, den du zusätzlich anschliessen kannst? - Browser darauf verschieben und er stört nicht mehr. Da könntest du sogar einen alten Monitor mit defekter Darstellung nehmen, es wird ja das Signal, das zum Monitor geht abgegriffen unabhängig von dem, was er anzeigt.

    und brauche davon einen Screenshot.


    da es stört, wenn sich der Browser regelmäßig auf dem Desktop breit macht.

    Wie kann ich die Seite automatisiert mit einem Kommadozeilenprogramm oder AutoIt in png oder jpg wandeln?

    Widerspricht das nicht der ersten Anforderung: Screenshot?

    Ein Screenshot ist ein Abbild des Desktops. Also muss die Seite dazu auch auf dem Desktop sichtbar sein.


    Oder willst du ein Image einer Webseite erstellen OHNE diese im Browser zu laden? - Auf die Idee bin ich bisher nicht gekommen und bezweifle auch die Umsetzbarkeit. Denn die Webseite liegt als html vor, evtl./wahrscheinlich noch mit eingebetteten Javascripts. Das musst du in einem Browser laden um es zu visualisieren.



    EDIT:

    Aber verschiebe doch einfach den Browser aus dem sichtbaren Bereich des Desktops. Du kannst dann trotzdem darauf zugreifen und es gibt genug Browser-PlugIns zum Umwandeln von Webseiten in Images (auch mit Darstellung des gesamten Inhalts trotz Scrollens). Such dir solch ein Tool und automatisiere es, sofern das überhaupt erforderlich ist. Da musst du das Rad nicht neu erfinden.

    Ich habe mal versucht, die Nachricht abzugreifen, bevor die Msg-Queue Verarbeitung beginnt.

    M. M. n. ist das vom Code her korrekt, jedoch erhalte ich ausschliesslich die Messages: WM_TIMER und WM_HOTKEY (beim Beenden) . Das lässt mich etwas ratlos zurück.

    Aber vielleicht hilft es dir als Ansatz.


    Das Problem liegt im vkCode. Dieser enthält nunmal keine layoutspezifischen Werte, sondern ist für jedes Layout identisch.


    Man muss sich den "Werdegang" eines Zeichens vom Drücken der Taste bis zum Erscheinen im Edit etc. mal genauer ansehen:

    - Tastendruck - Auslösen eines Hardware-Interupts, Scancode (Tastenposition) wird gelesen. Der Scancode gibt nur die Position der gedrückten Taste für eine Standardtastatur an, unabhängig von der Anordnung, der Sprache des BS oder der Tastenbeschriftung.

    - Der Scancode wird vom System in den vkCode übersetzt, dem die ASCII-Zeichen zugrunde liegen

    Bis hier ist das LowLevel - was wir z.B. mit _IsPressed() abfragen. -- Also sind wir da eigentlich falsch, denn das sagt uns noch nichts über das tatsächlich im Editor ankommende Zeichen, nur über die gedrückte Taste.

    - Weiter gehts mit der System-Message WM_CHAR. Hier wird aus vkCode und Layout das letztlich gewünschte Zeichen an die Anwendung gesendet. Somit sollte der Ansatz sein, diese Message auszuwerten.


    Da wir dann aber nicht mehr LowLevel sind, hat das auch ein paar zu beachtende Punkte:

    Wir können nicht einfach auf WM_CHAR warten, sondern müssen mit GetMessage() vom Message-Queue abfragen.

    Die Nachricht ist an ein Fenster gebunden, dessen Handle ich angeben muss. Alle evtl. zu berücksichtigenden Fenster müssen zu einem Prozess gehören.

    Somit ist eine systemweite Abfrage eines Zeichens wohl nicht realisierbar.


    P.S.

    Ist mir gerade noch eingefallen: Bei der Abfrage eines mit Shift generierten Zeichens muss der Vollständigkeit halber immer auch Capslock abgefragt werden.

    Manchmal möchte ich abhängig vom Gui-Ctrl in einer Funktion unterschiedlich reagieren (z.B. bei registriertem $WM_COMMAND auf $EN_CHANGE). Da z.B. Edit und Input beide der Klasse "Edit" angehören, kann ich Aktionen, die gleichermaßen auf alle Input aber nicht auf Edit angewendet werden sollen nur durch Speichern der zugelassenen Ctrl-ID in einem Array realisieren, welches ich dann durchlaufe und auf Übereinstimmung mit der gerade aktiven ID prüfe. Es würde mir besser gefallen, wenn ich allgemein auf den Control-Typ (z.B. Edit oder Input) prüfen könnte.

    Mit der GuiCtrlInfo.au3 stelle ich die Funktion _GuiCtrlGetInfo(ID) bereit, die anhand der übergebenen Ctrl-ID nicht nur die Klasse, sondern bei derselben Klasse für unterschiedliche AutoIt-Control auch deren AutoIt-Namen ermittelt. Davon betroffen sind folgende Ctrl:

    Code
    GUICtrlCreateButton() Button
    GUICtrlCreateCheckbox() Button
    GUICtrlCreateGroup() Button
    GUICtrlCreateRadio() Button
    GUICtrlCreateEdit() Edit
    GUICtrlCreateInput() Edit
    GUICtrlCreateGraphic() Static
    GUICtrlCreateIcon() Static
    GUICtrlCreateLabel() Static
    GUICtrlCreatePic() Static

    Die Funktion gibt eine Struktur zurück mit folgendem Inhalt:

    Code
    .ID GuiControl-ID
    .hWnd GuiControl-Handle
    .Class Classname
    .Au3Name AutoIt-Name (der Teil nach GuiCtrlCreate..)
    .Au3Type Konstante für den AutoIt-Namen
    .Style GuiControl-Style
    .ExStyle GuiControl-ExStyle


    Das Unterscheiden der Control anhand der Styles sollte funktionieren. Bin mir aber noch nicht sicher, ob es auch bei den verschiedensten Style-Kombinationen klappt. Bin da für Rückmeldungen dankbar.


    Was mir aufgefallen ist:

    Ein GuiCtrlCreateLabel() ist von einem GuiCtrlCreateGraphic() anhand Klasse und Style nicht zu unterscheiden - sie sind identisch. Ist mir völlig unklar, wie das intern differenziert wird. Ich habe jetzt als Notlösung einfach mit Grafikfunktion einen Pixel im nicht sichtbaren Bereich des Controls gezeichnet. Ist die Funktion erfolgreich, ist es ein Graphic, wenn nicht - ein Label.


    Es werden ausschliesslich durch Native AutoIt Funktionen erstellte Ctrl-ID geprüft (GuiCtrlCreateObj ist somit nicht dabei).

    Eine Frage noch: Was ist "&&SQL1"? Eine View oder irgendeine Temp-Table?

    Das ist eine temporäre Tabelle. Ist ganz praktisch für Batchverarbeitung und man muss sich nicht so verbiegen um Ergebnisse aus mehreren Abfragen zusammenzuführen.


    Danke für deine Mühe.

    (Firebird SQL 1.5)


    Ziel ist eine Liste für den Servicemitarbeiter, mit allen relevanten Kundendaten zu den Geräten zu erhalten (es erfolgt noch eine Selektion bestimmter Geräte, das hat aber auf diese Abfrage keinen Einfluß).

    Ich frage in einem ersten Schritt die Geräte, die Kunden zugebucht sind ab. Dabei enthält jeder DS alle relevanten Kundendaten (KD-Nr,Name,Anschrift,Tel,Handy) und die Hersteller-SerNr. des Gerätes.

    Das funktioniert, wie gewünscht.

    Fiktives Ergebnis (von einem Kunden):

    100251,Max Meier,12345 Musterdorf,03123-304050,0170-11223344,G1234QH789

    100251,Max Meier,12345 Musterdorf,03123-304050,0170-11223344,G1234QM137


    Jetzt möchte ich zu den vorhandenen Daten noch die Rufnummer eines Ansprechpartners einfügen (sofern vorhanden, aus extra Tabelle).

    gewünscht:

    100251,Max Meier,12345 Musterdorf,03123-304050,0170-11223344,G1234QH789,03123-304055

    100251,Max Meier,12345 Musterdorf,03123-304050,0170-11223344,G1234QM137,03123-304055


    tatsächlich:

    100251,Max Meier,12345 Musterdorf,03123-304050,0170-11223344,G1234QH789

    100251,Max Meier,12345 Musterdorf,03123-304050,0170-11223344,G1234QH789,03123-304055

    100251,Max Meier,12345 Musterdorf,03123-304050,0170-11223344,G1234QM137

    100251,Max Meier,12345 Musterdorf,03123-304050,0170-11223344,G1234QM137,03123-304055



    Hier die Abfragen: SQL_Ansprech.pdf


    Wie muss ich das korrekt einbinden?

    So scheint mir z.B. die Windows-API-Funktion "VkKeyScanExA()" genau das leisten zu können, was ich suche: Man gibt das gesuchte Zeichen "(" ein und erhält einen virtuellen Key-Code und den Shift-Status, passend zum jeweiligen Tastaturlayout.


    Das hört sich zumindest sinnvoll an.

    Mein Test erbrachte aber entweder total blödsinnige Ergebnisse oder keine (vkCode: 255).


    Kannst ja selbst damit probieren:


    Wobei das Problem evtl. beim Datentyp HKL des Keyboardlayouts liegt. Aufgrund der Beschreibung habe ich das als DWORD (LO word & HI word) interpretiert.

    Ehrlich water, ich weiß jetzt nicht, was du von mir willst. =O Ich habe doch alles gemacht, was du schreibst. Was fehlt denn noch? :/


    Nun, vermutlich ist es etwas verwirrend, dass du zum Einen schreibst:

    "CallTip" war nur zur Erklärung, wofür die Lösung benutzt werden kann,

    (Betonung auf kann)


    andererseits sagst du, dass dies genau der gewünschte Einsatzzweck ist.

    Das soll erweitert werden, sodass ein CallTip auch automatisch angezeigt wird, wenn in PSPad ein "(" eingegeben wird. Da PSPad jedoch genau 0 Events zur Verfügung stellt, bleibt nur die Möglichkeit, in meinem CallTipViewer-Script eine systemweite Erkennung zu implementieren.



    Insofern ist es wirklich besser aus dem gezielten Problem keine allgemeine Problematik ableiten zu wollen. Sonst ist man ruck-zuck beim XY-Problem.

    Dein Ansatz ist: Key

    Vielleicht ist der günstigere Weg tatsächlich: Char

    Es fehlt momentan nur noch das Wie.


    Deshalb würde ich mal die Fragestellung weiter fassen und dennoch spezifizieren:

    'Wie kann ich ein Ereignis auslösen, wenn das OS nach Auswertung einer Tastatureingabe das Zeichen "(" im Puffer hat?'


    Findet man den Einstiegspunkt um Char abzufragen, ist es völlig egal was im Vorfeld geschieht.

    Es gibt von Haus aus keine Möglichkeit dafür.

    Du musst also zusammentragen, wie das gewünschte Zeichen in jedem existierenden KB-Layout dieser Welt gebildet wird. Dafür erstellst du ein Mapping.

    - Dein Programm liest beim Start das verwendete Layout aus.

    - Nun weißt Du durch Abgleichen mit deiner Map, welcher Code/Codesequenz in diesem Layout genutzt wird.

    - Im Hintergrund deines Skriptes muss ein Keyboard-Hook laufen. Dort wird dann entsprechend des Codes reagiert.


    Nicht umsonst liegen die Hotkeys in internationaler Software im Normalfall ausschließlich auf Tasten, die in allen Layouts gleich belegt sind. (a bis z, 0 bis 9, Strg, Umsch, Alt, AltGr, Win).

    Wer z. B. den Editor Sublime Text kennt, hat das Problem schon erlebt (Dort wurde das Thema nicht sauber angegangen). Dort wurden standardmäßig Hotkeys für die Mac-Tastatur verwendet. Man musste also erst mal einiges ummappen.

    Ich weiß immer noch nicht, was du nun willst.

    Im von mir gezeigten Bsp. ist das Layout egal. Wobei ich vermutet hatte, dass du eine Eingabe in ein Textfeld erwartest.

    Dein letzter Post legt nun nahe, dass du einen Hotkey auswerten willst. Falls ja:

    Ein Hotkey verwertet immer den Virtual Key Code - und dieser ist abhängig vom Layout. Um das "universal" zu gestalten muss eine Art Übersetzungstabelle bereitgestellt werden, die das ausgelesene Layout den gewünschten Codes zuordnet.

    aber es geht um eine reine AutoIt Lösung. Ein Script soll unabhängig vom Tastaturlayout ermitteln, ob ein "(" per Tastatur eingegeben wurde.

    Nur zur Klarheit: Die Eingabe erfolgt also in einem Input/Editfeld deines Skriptes und das möchtest du auswerten?


    Dann geht das so:

    je nachdem würde ich mir ein Raspberry Pi zulegen/bestellen.

    Du solltest vielleicht andersrum anfangen.

    • Was will ich machen?

    • Welche Hardware ist dafür geeignet? (neben RasPi vermutlich auch Arduino)

    • Welche Sprache benötige ich zur Programmierung?


    Damit fällt AutoIt schonmal raus (Gründe wie im vorigen Post benannt).

    Den RasPi kannst du mit einer Vielzahl von Sprachen programmieren: Von der visuellen Programmierung speziell für Anfänger (Scratch) bis zur CPU-nahen Programmierung mit Assembler.