Laden...

Tastendruck versenden

Erstellt von R3dNeXX vor 14 Jahren Letzter Beitrag vor 14 Jahren 3.027 Views
R3dNeXX Themenstarter:in
44 Beiträge seit 2008
vor 14 Jahren
Tastendruck versenden

Hi,

also bevor ich hier wieder ewig probiere:
Ich will aus ner zweiten modalen Form ein Tastendruck an meine Mainform bzw. an das Browser-Control darauf versenden.

Wie mache ich das ?

Habe es schon probiert mit:

  • SendKeys, da wird aber nix gesendet, auch mit Activate() der Mainform
  • Send- bzw. Postmessage mit WM_KEYDOWN, geht aber auch nicht, es kommt auch nix an

Ne Möglichkeit wäre noch Sendinput bzw. keyb_event.
Würde aber erstmal wissen, wieso das nicht mit SendKeys geht !!??

3.430 Beiträge seit 2007
vor 14 Jahren

Hallo R3dNeXX,

es sieht fast so aus als wolltest du einen unkonventionellen Weg für die Kommunikation von zwei Forms verwenden.
Guck dir mal das hier an: [FAQ] Kommunikation von 2 Forms
Vielleich erübrigt sich dann dieses Problem

Gruss
Michael

R3dNeXX Themenstarter:in
44 Beiträge seit 2008
vor 14 Jahren

Nein passt schon so.

Hab vergessen es zu erwähnen: auf der 2. modalen Form ist ein Bitmap. Diese Form stellt mein Touchscreen-Keyboard dar.

Ich will (logischerweise) bei Klick auf das Bitmap (die Tastatur) die jeweilige Taste an mein Browser-Control senden, um halt dem User zu gestatten, auf manchen Seiten etwas einzugeben.

B
13 Beiträge seit 2009
vor 14 Jahren

Hallo R3dNeXX,

bist du auch sicher, dass das Browser-Control den Fokus besitzt?
Zu SendMessage/Input kann ich dir nichts sagen, da noch nie benutzt - solltest du aber keyb_event() noch testen wollen, kannst du mal folgendes versuchen:


[DllImport("user32.dll")]
private static extern void keybd_event(byte key, byte bScan, int dwFlags, UIntPtr dwExtraInfo);

public void sendKey(byte key)
{
    keybd_event(key, 0, 0, UIntPtr.Zero); // runter
    keybd_event(key, 0, 2, UIntPtr.Zero); // und hoch
}

R3dNeXX Themenstarter:in
44 Beiträge seit 2008
vor 14 Jahren

Hi,

ok werde mir die Geschichte mit keyb_event mal genauer anschauen.

Zum Thema Fokus: habe auch schon in die Richtung gedacht.

Habe zum Probieren mal in der Mainform ne static-Methode erstellt, in der zuerst über Browser.Focus() der Fokus auf das Control gesetzt wird und danach über SendKeys die Taste gesendet.
Die Methode rufe ich dann per BeginInvoke aus der anderen Form auf.

Klingt für mich zwar logisch, funktioniert aber trotzdem nicht. X(

Ok, werde mich mal an keyb_event setzen.
Bin für weitere Vorschläge weiterhin offen. 😁

R3dNeXX Themenstarter:in
44 Beiträge seit 2008
vor 14 Jahren

Also ich hab es mal so probiert und es funzt trotzdem nicht:

[DllImport("user32.dll")]
private static extern void keybd_event(byte key, byte bScan, int dwFlags, UIntPtr dwExtraInfo);

public static void Send()
{
    main.Browser.Focus();
    keybd_event((byte)0x41, 0, 0, UIntPtr.Zero);
    keybd_event((byte)0x41, 0, 2, UIntPtr.Zero);
}

Ich würde tatsächlich darauf tippen, dass das irgendwas mit dem Focus zu tun hat.

Nur wie löse ich sowas ?
Meine 2. Form (Keyboard) muss ja logischerweise modal sein, irgendwie muss ja was eingegeben werden.

Hab echt kein Plan ! X(

4.942 Beiträge seit 2008
vor 14 Jahren

Warum muß deine 2. Form modal sein?

Durch einen modalen Dialog blockst du doch die Nachrichtenschleife des MainForms, d.h. dort kann nichts ankommen.

R3dNeXX Themenstarter:in
44 Beiträge seit 2008
vor 14 Jahren

Hm ich meinte auch eher topmost, das modal war Quatsch.

Und dadurch kommt doch die Message in der Queue meiner Mainform an !

R3dNeXX Themenstarter:in
44 Beiträge seit 2008
vor 14 Jahren

Hat keiner ne Idee an was es liegt ?

Ich muss doch irgendwie meinem Browser-Control aus meiner 2. Form Tastatureingaben schicken können !

T
111 Beiträge seit 2005
vor 14 Jahren

Hallo

meiner Meinung nach solltest Du das Konzept von MichlG aufnehmen. 2. Formular generiert einen Event bei dem die Taste mitgegeben wird. Das vom 1.Formular registriert dieses und sendet den empfangenen Wert an das Browser-Control

lG
Thomas

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo R3dNeXX,

über Suchbegriffe wie virtual keyboard o.ä. solltest du Threads, wie man dein Problem löst, finden.

herbivore

R3dNeXX Themenstarter:in
44 Beiträge seit 2008
vor 14 Jahren

Also das mit dem Event war eine gute Idee, ich hätte auch mal eher darauf reagieren können !
Also ich registriere das Event in der Mainform und setze dort dann den Focus auf den Browser und sende per keyb_event die entsprechende Taste.

Nur funktioniert bsi jetzt z.B. nur Backspace. Die anderen Tasten werden gesendet, aber nicht ausgegeben.
Ich schätze, dass das irgendwas mit dem Hexwert zu tun, den ich sende, obwohl er stimmt:


private void SendKey(object sender, KeyEventArgs e)
{
    try
    {
        byte code = Convert.ToByte(e.KeyValue.ToString("X"), 16);

        if (!Browser.Focus())
            ...

        keybd_event(code, 0, 0, UIntPtr.Zero);
        keybd_event(code, 0, 2, UIntPtr.Zero);
    }
    catch (Exception Ex)
    {
        ...
    }
}

Mal ein Versuch, das Hin und Her mit der byte-Variable ist eig. nur zum Test, weil ich sehen wollte, ob der Wert stimmt, den ich schicke.

Habt ihr da noch Ideen zum Problem ??
(Ja ich weiß, ich nerve, will aber das Problem komplett beseitigen !)

R3dNeXX Themenstarter:in
44 Beiträge seit 2008
vor 14 Jahren

Ok alles ist gut.

Es fehlte dann doch noch ein Browser.Document.Focus() !!
Darauf muss man erstmal kommen.

Jetzt funktionierts mit keyb_event, SendKeys.Send ... .

Vielen vielen Dank für eure Hilfe !
Noch nen schönen Tag. 👍