Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Windows On Screen Keyboard fernsteuern.
Kalleberlin
myCSharp.de - Member



Dabei seit:
Beiträge: 165

Themenstarter:

Windows On Screen Keyboard fernsteuern.

beantworten | zitieren | melden

Hallo Ihr,

ich hab mal wieder ein Problem wo ich nicht weiterkomme.

Ist es möglich, tasten zum OSK zu senden?

Ich habe schon SendInput(),SendMessage() und keybd_event versucht, scheint aber nicht zu funktionieren. Bei allen anderen (Windows) Anwendungen klappt es.

Sinn und zweck? Nun, ich habe wiederum eine andere Anwendung an die ich Tasten senden will, diese jedoch z.B. SendInput blockt. Mit der Windows OSK klappt es jedoch. Deshalb möchte ich den umweg über OSK gehen, um meiner anderen Anwendung doch noch Tasten senden zu können


Hoffe Ihr könnt mir helfen,

Gruß Kalleberlin
If u want to finish first, u have to finish first.
private Nachricht | Beiträge des Benutzers
Simon Heinzmann
myCSharp.de - Member

Avatar #avatar-2571.jpg


Dabei seit:
Beiträge: 43
Herkunft: Bayern

beantworten | zitieren | melden

Hi,
schon sendKeys probiert, wird hier -> Link wird hier am Beispiel einer Bildschirmtastatur verwendet und funktioniert bei mir tadellos.
Gruss
private Nachricht | Beiträge des Benutzers
Zebes
myCSharp.de - Member



Dabei seit:
Beiträge: 457
Herkunft: NRW

beantworten | zitieren | melden

soweit ich weis geht send keys unter vista nicht bei eingeschalteter benutzerkontensteuerung.

mfg
Zebes
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 2.915
Herkunft: Deutschland

beantworten | zitieren | melden

Was ist mit einem BM_CLICK auf das entsprechende Control, kann ja mit Spy++ ermittelt werden. Das Handle auf das Fenster kannst Du Dir ja holen.

Die Fenster der Controls heissen wie die Tasten selber. z.B. "F1", "F2" usw.

Damit sollte es problemlos möglich sein.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dr4g0n76 am .
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
Kalleberlin
myCSharp.de - Member



Dabei seit:
Beiträge: 165

Themenstarter:

beantworten | zitieren | melden

Hallo und Danke erstmal für die Antworten .

@dr4g0n76

Ich hab deine rat befolgt, und versuche es gerade mit SendMessage und "WM_CLick".

Nur weiss ich noch nicht genau wie die SendMessage schicken soll, hier mal meine nicht funktioniernde Lösung:


//OSK == handle der Bildschirmtastatur
IntPtr _letterA = FindWindowEx(osk,IntPtr.Zero,"N59", "A");
//Ich denke mal das 1ste IntPtr.Zero ist falsch, was muss ich da genau mitschicken?
SendMessage(_letterA, WM_CLICK, IntPtr.Zero, IntPtr.Zero);

Danke und Gruß
Kalleberlin

//Edit:

Also ich hab jetzt nochmal was im Internet gefunden, da macht das einer so:


SendMessage(_letterA, WM_CLICK, IntPtr.Zero, "");
Hab das auch so versucht, geht aber nicht :/. Er findet das handle vom Buchstaben, muckt auch sonst nicht rum, aber es passiert einfach nichts :(.

Irgendwie muss es ja gehen^^

//Edit2:

Also, Mittels WM_SETTEXT lässt sich sogar der Titel von diesem beschissene Buchstaben ändern. Nur wird der einfach nicht gedrückt. Versteh ich nich^^
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Kalleberlin am .
If u want to finish first, u have to finish first.
private Nachricht | Beiträge des Benutzers
Andreas.May
myCSharp.de - Member

Avatar #avatar-2474.gif


Dabei seit:
Beiträge: 915

beantworten | zitieren | melden

Hall Kalleberlin,

mit folgenden sollte es gehen:



        [return: MarshalAs(UnmanagedType.Bool)]
        [DllImport("user32.dll", SetLastError = true)]
        private static extern bool PostMessage(HandleRef hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

        private readonly uint WM_KEYDOWN = 0x100;
        private void button1_Click(object sender, EventArgs e)
        {
            PostMessage(new HandleRef(null, this.Handle), WM_KEYDOWN, new IntPtr((int) Keys.F1), IntPtr.Zero);   
        }

        protected override void OnKeyDown(KeyEventArgs e)
        {
            if (e.KeyData == Keys.F1)
            {
                MessageBox.Show(string.Format("Taste: {0} wurde erfolgreich gedrückt", ((Keys)e.KeyData).ToString()));
            }
            base.OnKeyDown(e);
        }

this.Handle war nur zum ausprobieren, das ist natürlich das Handle vom OSK, was auch immer OSK bedeutet ;-)
Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(
private Nachricht | Beiträge des Benutzers
Kalleberlin
myCSharp.de - Member



Dabei seit:
Beiträge: 165

Themenstarter:

beantworten | zitieren | melden

Hallo Andreas.May,

OSK == On Screen Keyboard, das von Windows .

Leider passiert auch deinem Vorschlag nichts :(.

Ich hab es mit dem Handle der "gesamten" Bildschirmtastatur versucht, sowie mit dem handle vom buchstaben "A".

//Edit:

Was mir auch noch gerade aufgefallen ist:

Wenn ich es per hand versuche, sprich OSK Fokus setzen, und "A" auf der echten Tastatur drücke, passiert auch nichts. Nur wenn ich mit der Maus über die gewünschte Taste fahre, dann klicke, passiert auch was.

Das muss man doch simulieren können^^
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Kalleberlin am .
If u want to finish first, u have to finish first.
private Nachricht | Beiträge des Benutzers
Andreas.May
myCSharp.de - Member

Avatar #avatar-2474.gif


Dabei seit:
Beiträge: 915

beantworten | zitieren | melden

Zitat von Kalleberlin
Hallo Andreas.May,

OSK == On Screen Keyboard, das von Windows .

Leider passiert auch deinem Vorschlag nichts :(.

Ich hab es mit dem Handle der "gesamten" Bildschirmtastatur versucht, sowie mit dem handle vom buchstaben "A".


Sorry , hab total gepennt .. ging ums Tasten "drücken" simulieren... war irgendwie bei Tastatureingaben... ;-)


        [return: MarshalAs(UnmanagedType.Bool)]
        [DllImport("user32.dll", SetLastError = true)]
        private static extern bool PostMessage(HandleRef hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

        private readonly uint WM_CLICK = 0x00F5;
        private void button1_Click(object sender, EventArgs e)
        {
            PostMessage(new HandleRef(null, <OSKHandle des entsprechenden Buttons>), WM_CLICK, IntPtr.Zero, IntPtr.Zero);
        }

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Andreas.May am .
Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(
private Nachricht | Beiträge des Benutzers
Kalleberlin
myCSharp.de - Member



Dabei seit:
Beiträge: 165

Themenstarter:

beantworten | zitieren | melden

Hallo Andreas.May,

dein letzter Vorschlag, ist ja vom Prinzip her das gleiche wie:

//OSK == handle der Bildschirmtastatur
IntPtr _letterA = FindWindowEx(osk,IntPtr.Zero,"N59", "A");
//Ich denke mal das 1ste IntPtr.Zero ist falsch, was muss ich da genau mitschicken?
SendMessage(_letterA, WM_CLICK, IntPtr.Zero, IntPtr.Zero);


Hab deins jetzt so :


PostMessage(new HandleRef(null, _letterA), WM_CLICK, IntPtr.Zero, IntPtr.Zero);

umgesetzt, es passiert leider nichts.

Handle wird 100% richtig gefunden. Versteh ich nicht.

Edit:
Wenn Du gerade zuhause bist, könntest du es ja mal selbst schnell versuchen:



        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
private const int WM_CLICK = 0x00F5;
void Klick()
{
 IntPtr osk = FindWindow(null, "Bildschirmtastatur");
  if(osk != IntPtr.Zero)
 {
  IntPtr _letterA = FindWindowEx(bt,IntPtr.Zero,"N59", "A");
  if(_letterA != IntPtr.Zero)
     PostMessage(new HandleRef(null, _letterA), WM_CLICK, IntPtr.Zero, IntPtr.Zero);
}
}

Das OSK einfach mit "-start - ausführen - osk" starten.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Kalleberlin am .
If u want to finish first, u have to finish first.
private Nachricht | Beiträge des Benutzers
Andreas.May
myCSharp.de - Member

Avatar #avatar-2474.gif


Dabei seit:
Beiträge: 915

beantworten | zitieren | melden

Hrm, PostMessage ist schon ein bissel was anderes als SendMessage :-)
Siehe dazu folgenden Artikel.

Trotzdem, sollte eigentlich gehen.. hast mit dem Spy ++ mal geschaut ob deine Nachricht reinkommt? Nachher reagiert das Ding nichtmal auf nen Klick (Keine Ahnung warum es nicht sollte).

Sollten folgende Nachrichten auftauchen und sonst nichts:
BM_CLICK

Wenn nichts auftaucht schauen wir weiter und wenn eine Auftaucht machst es ganz einfach. Lass wieder dne Spy ++ laufen logge wieder mit und rücke mal auf einen der Buchstaben und schau dir die Nachrichten an die Auffällig sind.
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Andreas.May am .
Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(
private Nachricht | Beiträge des Benutzers
Kalleberlin
myCSharp.de - Member



Dabei seit:
Beiträge: 165

Themenstarter:

beantworten | zitieren | melden

Hallo Andreas.May,

Ich habe WinId als "Sniffer", Spy++ scheint es 100 varianten zu geben. Welche wäre denn da die richtige?
Zitat
Hrm, PostMessage ist schon ein bissel was anderes als SendMessage :-)
Siehe dazu folgenden Artikel.

OK

Gruß Kalleberlin

//Edit also ich hab jetzt mal als Tool den "WinInspector" runtergeladen.

Wenn ich meine message zu der Tastatur sende, kommt "0x0000000F5" an, also unser WM_CLICK.

Bei den Messages, ist es echt schwer zu sagen welche da jetzt für den Click sein soll. Da rauschen so viele Messages durch, keine Ahung welche da die richtige sein soll.

Hast du vll eine Idee?

//Edit 2:

Ah ich hab jetzt das ganze gefilter bekommen.
Also:
Beim klick kommen:

WM_PARENTNOTIFY
WM_MOUSEACTIVATE
WM_SETCURSOR
WM_LBUTTONUP
WM_CAPTURECHANGED
WM_USER + 3 (0x00000403)

So in der reihenfolge.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Kalleberlin am .
If u want to finish first, u have to finish first.
private Nachricht | Beiträge des Benutzers
Andreas.May
myCSharp.de - Member

Avatar #avatar-2474.gif


Dabei seit:
Beiträge: 915

beantworten | zitieren | melden

Na ja, wenn das erste was du machst ist erstmal wie gesagt zu schauen ob deine PostMessage reinkommt und schließt damit aus das da der Fehler auftritt.

Einfach dein Programm starten dann das OSK , dannach satrtest den Spy++ oder halt das WinId (kenne das nicht). Dannach suchst du den Button auf den du den Klick simulierst und loggest die Nachrichten mit. Schau erstmal das die Log leer ist dannach drückst du auf deiner Anwendung den Knopf der das PostMessage auslöst. Hoffe hast zwei Monitore so kannst auf dne zweiten die lognachrichten laufen lassen ohne das versehentlich mit der Maus oder durchs switchen mit den Fenstern ne andere Nachricht auslöst. Es sollte wenn alles geklappt hat nun bei dem OSK für dne entsprechenden button nur die Nachricht WM_CLICK oder halt BM_CLICK erscheinen.

Wenn das geschieht weist du das die Nachricht ankam, aber nichts wurde verarbeitet. Das wäre schlecht ;-)

Wenn keine der beiden Nachrichten eingeht schau mal ob wirklich das Handle stimmt das du mit FindWindowEx bekommst nicht das auf dem Button irgend nen Label oder Image Control drauf ist an das du versehentlich die Nachricht sendest anstatt deines Buttons den nur dieses verarbeitet die Nachricht.

Wenn die Nachricht eingegangen sein sollte und diese nichts bewirkt ists doof. Den dann musst du die richtige Nachricht finden.

Dazu wieder das log anschmeißen, draufklicken und log beenden. Nachrichten wie PAINT NCPAINT GetText oder irgendwelche Erases kannst knicken, wichtig sind komische Nachrichten die z.B. nicht mit WM_ anfangen. Kann ja sein das auf nen validate reagiert wird oder irgend ne komische Focus Geschichte, da wirst dich durchwühlen müssen.
Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(
private Nachricht | Beiträge des Benutzers
Andreas.May
myCSharp.de - Member

Avatar #avatar-2474.gif


Dabei seit:
Beiträge: 915

beantworten | zitieren | melden

Hrm, hatte grade geschrieben bevor das Edit kam ;-)

Schicke mal die Nachricht WM_LBUTTONUP via PostMessage ab. Das wäre dieses hier:


[return: MarshalAs(UnmanagedType.Bool)]
        [DllImport("user32.dll", SetLastError = true)]
        private static extern bool PostMessage(HandleRef hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

        private readonly uint WM_LBUTTONUP = 0x202;
        private void button1_Click(object sender, EventArgs e)
        {
            PostMessage(new HandleRef(null, this.unhook.Handle), WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);
        }

Scheint halt so das die statt auf nen Klick eben auf Linke Maustaste loslassen reagieren (Left Mouse Up).
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Andreas.May am .
Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(
private Nachricht | Beiträge des Benutzers
Kalleberlin
myCSharp.de - Member



Dabei seit:
Beiträge: 165

Themenstarter:

beantworten | zitieren | melden

Hallo Andreas.May,

ich hab das eben nochmal getestet mit WM_LBUTTON, leider wieder nichts :(.

Ich hab das nochmal gecaptured und nen ein screen von gemacht. Seinbar kommt da dann doch ein "WM_LBUTTONDOWN". Aber sieh selbst Bild

PS: Danke für deine Mühen

//Edit:

Ich hab ja so eine kleine Vorahnung, das ich dem LBUTTONDOWN noch koordinaten mitschicken muss. Das wäre aber gar nicht gut, denn sobald das funktioniert, wollte ich das Fenster verstecken, keine Ahnung ob man dann mit GetWindowRect() noch vernünftige Koordinaten bekommt :(.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Kalleberlin am .
If u want to finish first, u have to finish first.
private Nachricht | Beiträge des Benutzers
Andreas.May
myCSharp.de - Member

Avatar #avatar-2474.gif


Dabei seit:
Beiträge: 915

beantworten | zitieren | melden

Hrm, WM_LBUTTONUP hat auch nichts gebracht?

Ansonsten macht mich das Parentnotify etwas nervös... evtl. wird die Nachricht im Parent also das Control auf dem sich der Button befindet ausgelöst erst verarbeitet.

Und das könnte so ablaufen Hwnd = Parent (das Parent Control von Button A) Msg = WM_LBUTTONUP und lParam halt = Handle von z.b Button A.

Hier hilft nur ausprobieren, wenn deine Nachrichten ankommen ists schonmal gut, dann gildet es nur herauszufinden wo die Nachrichten verarbeitet werden und wo sie schlusssendlich verarbeitet werden.
Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(
private Nachricht | Beiträge des Benutzers
Kalleberlin
myCSharp.de - Member



Dabei seit:
Beiträge: 165

Themenstarter:

beantworten | zitieren | melden

Puh, das hab ich jetzt leider nicht kapiert.

//Edit:

Ich hab dem WM_LBUTTONDOWN jetzt auch mal coordinaten übergeben. Nix :(. Das gibts doch nich^^
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Kalleberlin am .
If u want to finish first, u have to finish first.
private Nachricht | Beiträge des Benutzers
Andreas.May
myCSharp.de - Member

Avatar #avatar-2474.gif


Dabei seit:
Beiträge: 915

beantworten | zitieren | melden

Nen einfaches Beispiel:

Du hast ein Form auf das machst du ne TextBox, jetzt willst du die Nachrichten die in der TextBox eingegeben werden aber auf dem Form verarbeiten. Dazu <Form>KeyPreview = true. Stellen das heisst die Nachrichten von der Textbox erscheint nun in der Form in der Methode OnKeyDown. Angenommen du hättest statt einer Textbox viele hunderte. So erscheinen alle Nachrichten von Tastatureingaben in der OnKeyDown Methode des Form's.

Genauso kann man auch andere Nachrichten weiterleiten ;-)

Das Form ist das "Parent" der TextBox und die TextBox vom Form das Child. Die Begriffe werden egal ob C# oder C++ oder C immer verwendet. Und egal ob das Ding was du siehst ne TextBox oder ne Form ist unter Windows ist alles ein Window, das heisst eine Form ist in seinem Kern fast das selbe wie eine TextBox beides ist schlussendlich ein Control hat ein Handle einen Rahmen usw...

Was ich damit meine ist nur, das die Nachricht statt das sie auf dem Child also den Button verarbeitet wird, seine Nachricht an das Parent also das Control auf dem sich der Button befindet weiterleitet und dort in wirklichkeit die Nachricht dann schlussendlich verarbeitet wird.

Kleines Beispiel, ich möchte in Notepad Speichern, da habe ich nun viele Möglichkeiten. Ich kann an die Notepad Main Form (Control auf dem sich alles befinder) die Tastatureingabe "Str+S" senden. Ich kann aber auch das Menücontrol suchen mir das Handle dazu rausgreifen und die Nachricht BM_CLICK an das Menücontrol senden usw.

Daher, dein Problem ist erstmal herauszufinden, wo wird die Nachricht verarbeitet. Im normalfall Programmieren die meisten irhe Anwendungen wie folgt. Mein Button XY wird gedrückt, löse ein Event aus und verarbeite die Nachricht. Da hätte Dragons Ansatz schon gereicht und alles wäre gut.

Du wirst also mit dem Spy++ ode rhalt deinen Tool erstmal herausfinden müssen. Kommt die Nachricht WM_LBUTTONUP auf meinen Control "Button A" an. Darauf hast mir bisher keien Antwort gegeben ;-) Ergo, gehe ich davon aus hast es noch nicht versucht.

Wenn keine Nachricht ankommt läuft mit PostMessage schonmal was falsch und wir können uns mal ansehen ob wie oben mal geschrieben evtl. das falsche Handle einfach holst. was ganz schnell mal passieren kann. Oder die Nachricht kommt an und wird halt nicht verarbeitet evtl. ist WM_LBUTTONUP nichtmal die richtige. Vermute sogar das WM_LBUTTONDOWN eher stimmt. Wer nimmt schon ButtonUp als Event? Also wie du siehst, es gibt zu viele Variablen, da musst dich einfach knallhart durchwühlen.

Sprich, schau dir die Nachrichten an, versuch auf gut Glück mal WM_LBUTTONUP oder WM_LBUTTONDOWN an den Button zu senden. Wenn das nicht klappt sende einfach mal WM_LBUTTONUP oder WM_WM_LBUTTONDOWN oder WM_CLICK an das Parent Control von "Button A" und als lParam eben das Handle von "Button A" und schau was passiert. Einfach etwas rumprobieren :-)

Aber wie gesagt das erste was schaust, gibt dir PostMessage schonmal den boolischen Wert = true zurück :-)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Andreas.May am .
Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(
private Nachricht | Beiträge des Benutzers
Kalleberlin
myCSharp.de - Member



Dabei seit:
Beiträge: 165

Themenstarter:

beantworten | zitieren | melden

Hallo Andreas.May,

Also das WM_LBUTTON Down, kommt bei dem A Button an, aber das scheint falsch zu sein. Ich habe jetzt herrausgefunden, das wenn ich auf der Tastatur auf das A klicke, das LBUTTON auf dem parent, sprich der OSK ankommt (wenn ich die message aufklappe, sehe ich auf welche pixel koordinate da geklickt wurde).

So, Postmessage habe ich jetzt mal so abgeändert:


PostMessage(new HandleRef(null, osk), WM_LBUTTONDOWN, IntPtr.Zero, _letterA )
liefert mir auch true zurück.

Allerdings:

Sehe ich beim direkten klicken WM_LBUTTONDOWN nicht direkt, sondern, ein WM_PARENTNOTIFY, in welchem "untergeordnet" dann WM_LBUTTONDOWN steht. Das würde ich gern als nächsten versuchen, nur weiss ich nicht wie ich beides zusammen verpackt ans control schicken kann.

Ach und noch was. Ich habe meine handles mit den handles die das tool ausliest überprüft, sind indentisch.

Danke erstmal,

Kalleberlin

//Edit
Zitat
Daher, dein Problem ist erstmal herauszufinden, wo wird die Nachricht verarbeitet.

Ich bin mir ziemlich sicher das die nachrichten vom OSK direkt verarbeitet werden, nicht vom "buchstaben handle".

Ich bekomms einfach nicht hin :(
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Kalleberlin am .
If u want to finish first, u have to finish first.
private Nachricht | Beiträge des Benutzers
Kalleberlin
myCSharp.de - Member



Dabei seit:
Beiträge: 165

Themenstarter:

beantworten | zitieren | melden

Keiner weiter eine Idee?

Also, ich denke ich bin jetzt mit meinem Latein am ende. Ich hab es jetzt noch mal mit notepad versucht, dort ein befehl an ein child gesendet, hat sofort funktioniert.

Ich bekomm es einfach nicht hin das das OSK rafft, das ich grad auf eins von seinen child geklickt habe. Wenn ich per hand auf einen buchstaben klicke kommt die message "WM_PARENTNOTIFY" - WM_LBUTTONDOWN (x,y). Wenn ich jetzt per sendmessage auf den kopf drücke, passiert eben mal genau gar nichts. So langsam glaube ich, das das aus irgendwelchen gründen nicht geht. Ich habs nämlich auch schon mit den Passenden Mousecoordinaten versucht - auch wieder vergebens.

Das handle vom jeweiligen buchstaben hab ich 100 mal kontrolliert, das stimmt 100%. Vielleicht muss man ja dem OSK _vor_ dem klicken noch sagen, achtung ich drück jetzta auf nen knopf. ka.

Also, wenn ihr noch ne idee habt - immer her damit, aber ich weiss jetzt nich mehr weiter :(...

Gruß Kalleberlin
If u want to finish first, u have to finish first.
private Nachricht | Beiträge des Benutzers
Andreas.May
myCSharp.de - Member

Avatar #avatar-2474.gif


Dabei seit:
Beiträge: 915

beantworten | zitieren | melden

Soo wieder da ;-)

Versuchs mal so rum:


PostMessage(new HandleRef(null, osk), WM_LBUTTONDOWN, _letterA, IntPtr.Zero )
Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(
private Nachricht | Beiträge des Benutzers
Kalleberlin
myCSharp.de - Member



Dabei seit:
Beiträge: 165

Themenstarter:

beantworten | zitieren | melden

Hallo Andreas

funktioniert leider auch nicht. WM_LBUTTONDOWN kommt zwar an, interessiert ihn aber nicht. Wie gesagt, ich denke es liegt daran, das er nicht "merkt" das ich den Button drücken will. Es kommt kein parentnotifiy.

Vielleicht gibts ja irgendeine windows interne funktion die das fernsteuern verhindert?

Gruß Kalleberlin
If u want to finish first, u have to finish first.
private Nachricht | Beiträge des Benutzers
Andreas.May
myCSharp.de - Member

Avatar #avatar-2474.gif


Dabei seit:
Beiträge: 915

beantworten | zitieren | melden

Hrm, hatte gehofft das einfahc nur das OSK (Parent) mitbekommt das der Button A (Child) gedrückt wird.. schlussendlich passiert das ja auch. Also gilt es herauszufinden was genau passiert.

Also ne überlegung wäre noch mal das OSK (Parent) zu beobachten wenn Button A gedrückt wird. Du sagtest ja das WM_LBUTTONDOWN ins OSk (Parent) reingeht, also schau dir da mal lParam und wParam an. Mit den Windows Taschenrechenr auf Wissenschaftlich gestellt wandelst den int Wert von wParam und LParam mal in nen HexWert um und suchst dann diesen via Spy++ oder halt deinen Programm. Wenn der Button A = den Hexwert übereinstimmt so weist dass dass Handle davon mitgegeben wird. Wenn das nicht der Fall ist und das Handle nirgendwo auftaucht ist es evtl. der ASCII in Wert. Kann ja sein das die Typen die umschalttaste nicht beobachten wollten und bei gedrückter Umschalttaste die Buttons auf dem OSK statt kleingeschrieben also "a" plötzlich großgeschrieben werden also "A". Dann schicken die einfach den fertigen Buchstaben an das OSK das dann wiederum die Nachrichten an das entsprechende Control mit den Focus schickt.

Wenn das der Fall ist brauchst ja nur wieder WM_LBUTTONDOWN schicken und als lParam oder WParam je nachdem das handle von Button A oder / und nur den integer Wert des Buchstaben (also auf ASCII bezogen).

Sonst gehen mir langsam die Ideen aus :o)
Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(
private Nachricht | Beiträge des Benutzers
Kalleberlin
myCSharp.de - Member



Dabei seit:
Beiträge: 165

Themenstarter:

beantworten | zitieren | melden

Ich danke Dir ersteinmal.

Ich werde das heue abend mal versuchen. Mal schauen ob da noch was zu biegen is .
If u want to finish first, u have to finish first.
private Nachricht | Beiträge des Benutzers
Kalleberlin
myCSharp.de - Member



Dabei seit:
Beiträge: 165

Themenstarter:

beantworten | zitieren | melden

War zwar eine schwere geburt, aber besser als gar keine


            IntPtr lParam;
            IntPtr wParam;
            Point client = new Point(62, 69);
            lParam = new IntPtr((client.Y << 16) | client.X);
            wParam = new IntPtr(MK_LBUTTON);
            IntPtr osk = FindWindow("OSKMainClass", null);
            SendMessage(osk, WM_LBUTTONDOWN, wParam, lParam);
            SendMessage(osk, WM_LBUTTONUP, wParam, lParam);

Sollte selbsterklärend sein
If u want to finish first, u have to finish first.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.433

beantworten | zitieren | melden

Das OSK-Programm verwendet intern noch eine andere Nachricht, um ein Zeichen an das gerade aktive Fenster zu schicken: WM_USER+3.

Du könntest also versuchen, dieses direkt dem OSK zu senden, ohne daß du die Position der einzelnen Buttons wissen mußt.

In wParam steht der Tastencode (ich glaube als virtual key) und lParam scheint der selbe Wert wie bei einem KEYUP bzw. KEY_DOWN zu sein.
private Nachricht | Beiträge des Benutzers
Kalleberlin
myCSharp.de - Member



Dabei seit:
Beiträge: 165

Themenstarter:

beantworten | zitieren | melden

Hallo Th69,

das hatte ich schon versucht, aber vielleicht auch falsch? Das wäre natürlich eine elegantere Lösung. Naja, es läuft erstmal
If u want to finish first, u have to finish first.
private Nachricht | Beiträge des Benutzers