tastendruck an fremde Progs senden (NICHT FAQ)



  • Ich bin am verzweifeln!

    Ich will in mein Programm eine Bildschirmtastatur (ähnlich der in Windows) integrieren, da die Software hinterher in einem System laufen soll, in dem keine Tastatur zur Verfügung steht. Der Benutzer soll auch keine Eingriffsmöglichkeiten in Windows bekommen.

    Ich habe bis jetzt:
    - Taskleiste wird ausgeblendet
    - Programm läuft Fullscreen (überdeckt auch den Taskleistenbereich)
    - in dem Tastaturformular werden bei Programmstart dynamisch Grafiken eingebunden, ähnlich einer Tastatur angeordnet und mit den notwendigen Ereignisfunktionen "verbunden". (Tasten Shift, Space, Backspace, 0-9, a-z bzw. nach Shift-Klick A-Z)
    - "wichtige" Tasten gesperrt (ALT+TAB, ALT+F4, STRG+TAB, Windows-Taste, etc. - nur zur Vorsicht)
    - externe Programme, die der Benutzer verwenden darf werden auf meinem Prog gestartet.

    Mein Problem? Folgendes:
    Ich will ja, wie gesagt, mit meiner Bildschirmtastatur und einem Touchscreen-Monitor die anderen Anwendungen steuern.

    Ich hab alles versucht, was die FAQ, MSDN und die Antworten auf meine Postings hier hergegeben haben, aber ich schaff es beim besten Willen nicht, zu jedem Zeitpunkt in jedem beliebigen Programm die Buchstaben (oder löschen) an die Stelle zu schicken, wo der Cursor blinkt.
    - Notepad geht
    - bei "Datei->Speichern unter..." gehts nicht (nicht in Notepad und nicht in anderen Progs)
    - eigenes BCB-Prog geht
    - Word geht gar nicht
    - Navisoftware geht manchmal, meistens nur einmal direkt nach dem Start
    - Firefox geht überhaupt nicht, da verlier ich den HANDLE sofort, ist aber nicht so tragisch, ich komm auch ohne Browser aus.

    Ich brauch da dringend mal nen guten Tip und bin über Hilfe jeglicher Art dankbar!!! *verzweifel*



  • Wollt ihr nicht oder könnt ihr nicht? 😞
    Brauche wirklich dringend eure Hilfe!



  • Mit GetFocus bekommst du das Fensterhandle, das gerade den Foukus hat, an dieses müsstest du die Nachrichten schicken.
    Ausserdem musst du verhindern, dass dein Tastaturfenster bei einem Click den Fokus bekommt (WM_ACTIVATE, WM_KILLFOCUS, ... irgendso eine Nachricht musst du dazu verarbeiten).



  • D@niel $chumann schrieb:

    Mit GetFocus bekommst du das Fensterhandle, das gerade den Foukus hat, an dieses müsstest du die Nachrichten schicken.
    Ausserdem musst du verhindern, dass dein Tastaturfenster bei einem Click den Fokus bekommt (WM_ACTIVATE, WM_KILLFOCUS, ... irgendso eine Nachricht musst du dazu verarbeiten).

    Mit GetFocus hab ich versucht, auch vorher mit AttachThreadInput(). Ich versuch auch immer das Zielfenster vorher in der Vordergrund zu holen etc..
    Das klappt mal, und mal nicht.

    Wie meinste das mit WM_ACTIVATE bzw. WM_KILLFOCUS verarbeiten? Das würde sich ja schon erledigen, indem ich das Zielfenster in den Vordergrund bringe, oder versteh ich das jetzt falsch? *fragendguck*



  • Ich hab das so gemeint:

    case WM_MOUSEACTIVATE:
    		if(LOWORD(lParam)==HTCLIENT)return MA_NOACTIVATE;
    		break;
    

    Dann wird deine Anwendung nicht aktiviert (Blaue Titelleiste und Eingabefokus) und der Fokus bleibt dort, wo er ist, d.h mit GetFocus sollte der richtige Fokus zurückgeliefert werden (hast recht, man braucht AttachThreadInput()). Auf diese Weise musst du halt nicht bei jedem Buchstaben das Fenster in den Fordergrund setzten, weil es dort ja bleibt. Ausserdem sieht das finde ich besser aus.

    Anmerkung: Bei der GetFocus/SendMessage Lösung gefällt mir das AttachThreadInput nicht (Außderdem bin ich mir nicht sicher, ob das so immer funktioniert, wie du schon sagtest mit Word, IE (hat ja keine richtigen Controls) und so). Man könnte als Alternative SendInput nehmen, das einen Tastendruck "simuliert", dabei könnte es aber vlt zu Problemen kommen, wenn gar keine Tastatur angeschlossen ist, müsstest du mal probieren, wäre IMHO hier die beste Lösung.



  • D@niel $chumann schrieb:

    Ich hab das so gemeint:

    case WM_MOUSEACTIVATE:
    		if(LOWORD(lParam)==HTCLIENT)return MA_NOACTIVATE;
    		break;
    

    Dann wird deine Anwendung nicht aktiviert (Blaue Titelleiste und Eingabefokus) und der Fokus bleibt dort, wo er ist, d.h mit GetFocus sollte der richtige Fokus zurückgeliefert werden (hast recht, man braucht AttachThreadInput()). Auf diese Weise musst du halt nicht bei jedem Buchstaben das Fenster in den Fordergrund setzten, weil es dort ja bleibt. Ausserdem sieht das finde ich besser aus.

    Anmerkung: Bei der GetFocus/SendMessage Lösung gefällt mir das AttachThreadInput nicht (Außderdem bin ich mir nicht sicher, ob das so immer funktioniert, wie du schon sagtest mit Word, IE (hat ja keine richtigen Controls) und so). Man könnte als Alternative SendInput nehmen, das einen Tastendruck "simuliert", dabei könnte es aber vlt zu Problemen kommen, wenn gar keine Tastatur angeschlossen ist, müsstest du mal probieren, wäre IMHO hier die beste Lösung.

    Ui! Jetzt komm ich mir aber doof vor! An welche Stelle müsste ich denn das case... packen?

    Ja, die AttachThreadInput-Variante find ich auch nicht so toll, zu mal es eben wirklich nicht geht.
    In der FAQ des BCB-Boards (ich nutze auch den BCB6) ist noch eine Lösung, wo sozusagen global ein WM_KEYDOWN mit dem entsprechenden Tastencode ausgelöst wird.
    Das find ich zwar noch weniger schön, hätte es aber auch genommen, allerdings hab ich es nicht hingekriegt, dass man auch Löschen kann (VK_DEL oder so)! Das hat der immer als Leerzeichen angehängt...



  • In die WndProc, von deiner Bildschirmtastatur.


Anmelden zum Antworten