Laden...

[erledigt] SendKeys wandelt ^ in & um

Erstellt von Jack_AI vor 16 Jahren Letzter Beitrag vor 16 Jahren 4.065 Views
J
Jack_AI Themenstarter:in
193 Beiträge seit 2007
vor 16 Jahren
[erledigt] SendKeys wandelt ^ in & um

Hallo.

Ich habe ein Problem mit dem Befehl SendKeys.SendWait. Wenn ich den Befehl SendKeys.SendWait("{^}"); ausführe, schreibt er kein Zirkumflex ^, sondern stattdessen ein Und-Zeichen &. Ich habe alle Sonderzeichen ausprobiert, die nach MSDN mit geschweiften Klammern angegeben werden sollen, aber nur das Zirkumflex wird vertauscht.

Ansonsten verwende ich zum Umwandeln diesen Code, aber auch wenn ich den Befehl direkt benutze wird es vertauscht:


      // bestimmte Zeichen müssen für SendWait in Format {x} gebracht werden
      char[] BoeseZeichen = new char[] { '^', '%', '~', '+', '(', ')', '{', '}', '[', ']' };

      string ZeichenToSend = String.Empty;
      
      for (int i = 0; i < Text.Length; i++)
      {
        ZeichenToSend = Text[i].ToString();

        foreach (char Zeichen in BoeseZeichen)
        {
          if (Text[i].Equals(Zeichen))
            ZeichenToSend = "{" + Text[i].ToString() + "}";
        }

        SendKeys.SendWait(ZeichenToSend); // alternativ: SendKeys.SendWait("{^}");
      }

Ist das Zirkumflex ein Spezialfall, oder bin ich nur wieder zu blöd? 😉

Grüße,
Jack

-
30 Beiträge seit 2007
vor 16 Jahren

ev. liegt es ja ander der Beta ?! 😉

Trivialität ist die Fatalität der Popularität ?!

363 Beiträge seit 2007
vor 16 Jahren

Hi,

ich weiß nicht ob es daran liegt, aber ein Fehler hat dein Code

        foreach (char Zeichen in BoeseZeichen)
        {
          if (Text[i].Equals(Zeichen))
            ZeichenToSend = "{" + Text[i].ToString() + "}";
        }

        SendKeys.SendWait(ZeichenToSend); // alternativ: SendKeys.SendWait("{^}");

Wenn mehrere böse Zeichen hintereinander stehen, werden die ersten ignoriert und nicht gesendet.
Das SendKeys muss auch in die innere Schleife.

Gruß Cookiie

"Hail to the King, Baby!"

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Cookiie,

Wenn mehrere böse Zeichen hintereinander stehen, werden die ersten ignoriert und nicht gesendet.

hm, kann ich nicht erkennen. Er behandelt doch jedes Zeichen einzeln. Und pro Zeichen im Text wird einmal SendKeys.SendWait aufgerufen.

herbivore

363 Beiträge seit 2007
vor 16 Jahren

Es wird doch erst die Schleife komplett durchgelaufen

foreach (char Zeichen in BoeseZeichen)
        {
          if (Text[i].Equals(Zeichen))
            ZeichenToSend = "{" + Text[i].ToString() + "}";
        }

und danach erst

SendKeys.SendWait(ZeichenToSend);

aufgerufen.
In ZeichenToSend steht also nur der letzte gefundene Wert drin.

Gruß Cookiie

"Hail to the King, Baby!"

0
767 Beiträge seit 2005
vor 16 Jahren

^ wird ja auch nicht angezeigt, wenn du es einmal an der tastatur eingibst. erst wenn du danach space drückst, kommt das ^. vielleicht musst du einfach zwei SendKeys absetzen (bzw einen mit space hinterher).

loop:
btst #6,$bfe001
bne.s loop
rts

J
Jack_AI Themenstarter:in
193 Beiträge seit 2007
vor 16 Jahren

Das Problem ist, dass wenn ich nur die Zeile SendKeys.SendWait("{^}"); eingebe, ein Und-Zeichen dabei rauskommt. Ich habe auch probiert, das Zirkumflex als ASCII-Nummer ( char(94).ToString() ) anzugeben. Er macht trotzdem ein Und-Zeichen daraus.

Original von 0815Coder
^ wird ja auch nicht angezeigt, wenn du es einmal an der tastatur eingibst. erst wenn du danach space drückst, kommt das ^. vielleicht musst du einfach zwei SendKeys absetzen (bzw einen mit space hinterher).

Daran habe ich auch schon gedacht und es so ausprobiert. Das Ergebnis: Er wandelt das Zirkumflex in ein Und-Zeichen um und setzt dahinter ein Leerzeichen. Nicht unbedingt befriedigend...

Jack

Nachtrag:
Vielleicht kann hier ein Freiwilliger das Problem mit VS 2005 testen. Einfach einen Button erstellen und dann für das button.Click-Event:


Thread.Sleep(3000); // 3 Sekunden warten
SendKeys.SendWait("{^}");

Nach dem Klick auf den Button innerhalb von 3 Sekunden auf eine beliebige Textbox klicken (Texteditor z.B.) und dann schauen, welches Zeichen dabei rauskommt. Nur als kleine Idee.

363 Beiträge seit 2007
vor 16 Jahren

Habs mal mit vs2003 getestet, gleiches Problem, statt ^ kommt & raus.
Egal ob mit send oder sendwait, hab sogar ne tastenfolge genommen und durch backspace das überflüssige gelöscht.
Also für mich ist nicht nachvollziehbar, wieso der Fehler auftritt.

Cookiie

"Hail to the King, Baby!"

S
8.746 Beiträge seit 2005
vor 16 Jahren

Ich denke

  1. das ist ein Bug (Aufstrich hat die gleiche "verzögernde" Wirkung, funzt aber), vermutlich wird der Bug nur in Kombination mit nicht-englischem Tastatur-Layout auftreten
  2. es gibt offenbar etliche Probleme mit der Funktion

Das hört sich ganz schlecht an:

Caution

If your application is intended for international use with a variety of keyboards, the use of Send could yield unpredictable results and should be avoided.

Und wie erreicht man eigentlich die Zahlen auf dem Numpad? Gar nicht....

J
Jack_AI Themenstarter:in
193 Beiträge seit 2007
vor 16 Jahren

Mh. Na gut. Danke fürs Testen. Dann muss ich / man eben auf die dll-Funktion zugreifen.

Danke,
Jack

S
8.746 Beiträge seit 2005
vor 16 Jahren

Kannst du nicht einfach mit dem Windows-Botschaften arbeiten?

Wenn ich das richtig verstehe, willst du doch nur ein Zeichen, z.B. in eine Textbox einfügen.

Dazu reicht es oft, wenn du mittels SendMessage() eine WM_CHAR-Botschaft sendest.

Problem: Wie auch bei .NET hat ein Control verschiedene Möglichkeiten auf Eingaben zu reagieren. WM_CHAR ist aber vermutlich trotzdem ausreichend.

U.U. musst eben noch WM_KEYUP und WM_KEYDOWN bemühen. Das wäre auch der Fall, wenn es dir um die Taste in der deutschen Tastatur geht, auf der das Zeichen zu finden ist.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Cookiie,

Es wird doch erst die Schleife komplett durchgelaufen ... und danach erst SendKeys aufgerufen.

natürlich wird die innere Schleife für alle bösen Zeichen durchlaufen, bevor SendKey aufgerufen wird, weil ja das aktuelle Zeichen der äußeren Schleife ja auch gegen jedes böse Zeichen getestet werden muss, um zu wissen, ob das aktuelle Zeichen geqouted werden muss. Das if in der Schleife ist max. einmal erfolgreich. Im Prinzip könnte hinter dem Quoten auch noch ein break ausgeführt werden.

Schau die die Konstruktion nochmal genau an, dann wirst du sehen, dass sie korrekt ist.

herbivore

J
Jack_AI Themenstarter:in
193 Beiträge seit 2007
vor 16 Jahren

Ich versuche es jetzt mit keybd_event() im Zusammenspiel mit der Keys-Enumeration.

SendMessage() verlangt für mich, als fortgeschrittenen Anfänger, ziemlich merkwürdige Parameter, bzw. weiß ich nicht, wie man diese Parameter richtig marshallt. Also lieber keybd_event().

Meine Lösung wäre nur das Zirkumflex durch keybd_event() zu ersetzen und für alle anderen Zeichen SendKeys zu verwenden. Für alle, die es interessiert: Das Zirkumflex ist oem5.

Jack

PS: Ich habe gerade entdeckt, dass es das Problem schon früher einmal gab.

363 Beiträge seit 2007
vor 16 Jahren

Original von herbivore
Hallo Cookiie,

Es wird doch erst die Schleife komplett durchgelaufen ... und danach erst SendKeys aufgerufen.
natürlich wird die innere Schleife für alle bösen Zeichen durchlaufen, bevor SendKey aufgerufen wird, weil ja das aktuelle Zeichen der äußeren Schleife ja auch gegen jedes böse Zeichen getestet werden muss, um zu wissen, ob das aktuelle Zeichen geqouted werden muss. Das if in der Schleife ist max. einmal erfolgreich. Im Prinzip könnte hinter dem Quoten auch noch ein break ausgeführt werden.

Schau die die Konstruktion nochmal genau an, dann wirst du sehen, dass sie korrekt ist.

herbivore

Asche auf mein Haupt, es wird ja nur mit einem Char aus dem ursprünglichen Text verglichen. Das kann logischerweise nur einmal treffen, weiß auch nicht warum ich das übersehen hab.

Gruß Cookiie

"Hail to the King, Baby!"