[VB] Sendkeys

Pagina: 1
Acties:
  • 119 views sinds 30-01-2008
  • Reageer

  • KnEuTeR
  • Registratie: Mei 2000
  • Laatst online: 24-02-2024

KnEuTeR

iedereen heeft een handelsmerk

Topicstarter
ik heb een Programma

nu wil ik met Sendkeys toetsen naar form1 sturen (om een bepaalde tijd, maar dat staat in een timer)

maar dit moet dus ook gebeuren als het programma NIET op de voorgrond draait...

Form1.Sendkeys "blabla"

werkt iig niet, hoe moet ik het dan doen?

Computers ain't that smart, Whatever man built could be taken apart


  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 17:11

johnwoo

3S-GTE

MSDN zegt:
Sends one or more keystrokes to the active window as if typed at the keyboard.
De tekst gaat dus altijd naar het actieve venster.
Maar als je de window handle (hWnd) van de form hebt (en die heb je als je al weet dat het Form1 is, dan is dat namelijk Form1.hWnd :) ), dan kun je zelf de keyboard messages naar de window sturen met PostMessage.

Aangezien het blijkbaar een form is binnen je eigen applicatie, kan je die form natuurlijk ook gewoon een method geven die je aanroept en de benodigde acties uitvoert.

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


Verwijderd

of het programma eerst naar de voorgrond halen (AppActivate)

[EDIT]
btw; wat wil je maken? Een of andere tekst die langzaam ingetypt wordt?

  • KnEuTeR
  • Registratie: Mei 2000
  • Laatst online: 24-02-2024

KnEuTeR

iedereen heeft een handelsmerk

Topicstarter
nee, er moeten gewoon keys naar een bepaalde applicatie hemzelf gestuurd worden

maar hoe dat met Form1.hWnd moet snap ik dan nog steeds niet?!

Form1.hWnd.Sendkeys werkt ook niet hoor?!

Computers ain't that smart, Whatever man built could be taken apart


  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 17:11

johnwoo

3S-GTE

KnEuTeR schreef op 30 oktober 2002 @ 21:24:
nee, er moeten gewoon keys naar een bepaalde applicatie hemzelf gestuurd worden

maar hoe dat met Form1.hWnd moet snap ik dan nog steeds niet?!

Form1.hWnd.Sendkeys werkt ook niet hoor?!
Nee, zo moet het ook niet :)
Ik zal een voorbeeldje geven. Als je een toets indrukt en weer loslaat worden er window messages naar de betreffende window gestuurd: WM_KEYDOWN als je de toets indrukt, en WM_KEYUP als je hem weer loslaat. VB verbergt deze message afhandeling voor je door de messages zelf te verwerken, en op de gepaste momenten de Form_KeyDown, Form_KeyUp en Form_KeyPress methoden aan te roepen.
De oplossing die ik voorstel, is om deze messages zelf in de queue van dat venster te zetten. Voor de form is het dan alsof er echt een toets in wordt gedrukt en losgelaten. Voor iedere toetsaanslag moet je dus 2 messages sturen: een WM_KEYDOWN en een WM_KEYUP.
Stel je wilt de letter A versturen. Dat kan je doen met de volgende code:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
' Dit in je Declarations:
Const WM_KEYDOWN As Long = &H0100
Const WM_KEYUP As Long = &H0101
Declare Function PostMessage Lib "user32" Alias "PostMessageA" _
   (ByVal hwnd As Long, _
   ByVal wMsg As Long, _
   ByVal wParam As Long, _
   ByVal lParam As Long) As Long

' Ergens in je code zet je dit om de letter A naar Form1 te sturen.
PostMessage Form1.hWnd, WM_KEYDOWN, vbKeyA, 0
PostMessage Form1.hWnd, WM_KEYUP, vbKeyA, 0
Het kan zijn dat de laatste parameter van PostMessage nonzero moet zijn, maar waarschijnlijk werkt het zo ook wel

Form1 ontvangt nu de letter A en zal die verwerken alsof het via het toetsenbord werd ingetypt. Voor andere letters kun je de andere VB keycode constanten gebruiken, maar het is ook mogelijk om de keycode te berekenen aan de hand van de ASCII waarden van de letters. Het is dus mogelijk om een eigen SendKeys implementatie te maken die naar ieder willekeurig venster kan sturen.

[edit]
Naast WM_KEYDOWN en WM_KEYUP is er ook nog WM_CHAR. Wellicht kan het ipv de twee WM_KEY* messages ook met een enkele WM_CHAR. Dat zou je even moeten onderzoeken :)
Het zou zelfs kunnen dat het per se met een WM_CHAR moet, dat ligt aan de message afhandeling door VB (waarvan ik niet precies in mn hoofd heb zitten hoe die gedaan wordt - of VB zelf character input genereert aan de hand van de KEYDOWN en KEYUP, of dat ie CHAR messages direct omzet in character input)...

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


  • KnEuTeR
  • Registratie: Mei 2000
  • Laatst online: 24-02-2024

KnEuTeR

iedereen heeft een handelsmerk

Topicstarter
ja maar da's dan een bestwel grote omweg als het met ApplicationObject.Sendkeys OOK kan, maar hoe krijg je het zover dat ApplicationObject JOUW programma is?!

Computers ain't that smart, Whatever man built could be taken apart


  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 17:11

johnwoo

3S-GTE

KnEuTeR schreef op 30 oktober 2002 @ 21:43:
ja maar da's dan een bestwel grote omweg als het met ApplicationObject.Sendkeys OOK kan, maar hoe krijg je het zover dat ApplicationObject JOUW programma is?!
Het is idd een omweg, maar ook de enige (juiste) manier als je die Form1 niet naar voren wilt halen zodat het met SendKeys kan...
Eigenlijk wordt je door VB gewoon verwend met SendKeys; VC++ programmeurs moeten ook gewoon zelf deze messages sturen om hetzelfde effect te verkrijgen :) Nu je tegen deze beperking van SendKeys aanloopt (werkt alleen met het venster op de voorgrond) zul je het alsnog zelf moeten bouwen :)

[edit]
Ik heb er nu geen tijd voor, maar als ik er morgen aan denk zal ik eens een SendKeys implementatie bouwen die een textstring naar ieder willekeurig window kan sturen...

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


  • KnEuTeR
  • Registratie: Mei 2000
  • Laatst online: 24-02-2024

KnEuTeR

iedereen heeft een handelsmerk

Topicstarter
ah, ik heb het nu zo geprobeert:
(met andere toetsen dus)
maar dan gebeurt er helemaal niks :s

PostMessage Form1.hwnd, WM_KEYDOWN, vbKeyTab, 0
PostMessage Form1.hwnd, WM_KEYUP, vbKeyTab, 0

PostMessage Form1.hwnd, WM_KEYDOWN, vbKeyReturn, 0
PostMessage Form1.hwnd, WM_KEYUP, vbKeyReturn, 0

Computers ain't that smart, Whatever man built could be taken apart


Verwijderd

keylogger? heh heh

  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 17:11

johnwoo

3S-GTE

Okee, ik heb even wat in elkaar gedraaid: klik.
Ik hoop dat je er wat aan hebt :)

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


  • KnEuTeR
  • Registratie: Mei 2000
  • Laatst online: 24-02-2024

KnEuTeR

iedereen heeft een handelsmerk

Topicstarter
niks geen keylogger?! ik log geen keys ik geneer ze?!
johnwoo schreef op 31 oktober 2002 @ 09:45:
Okee, ik heb even wat in elkaar gedraaid: klik.
Ik hoop dat je er wat aan hebt :)
hej, bedankt, werkt op zich wel, maar toch nog niet helemaal goed genoeg

ik maak gebruik van een Microsoft Internet Tools component (zo'n browsertje)

als ik een paar keer TAB verstuur beweegt hij wel over het scherm heen, en ook in het browser venstertje, naar link 1, maar als hij eenmaal daarin is, hoeveel tabs ik daarna ook verstuur, hij blijft HANGEN, gaat niet naar de volgende link :{ (terwijl als ik dan handmatig op tab druk dan verspringt ie wel)

Me.hWnd werkte niet goed, dus ik dacht ik probeer WebBrowser1.hWnd, die bestaat wel maar toch krijg ik een error:

Run-time error '-2147467259 (80004005)'
Method HWND of 'IWebBrowser2' failed

ik word echt helemaaal gek, stom programma werkt nog steeeds niet?!

Computers ain't that smart, Whatever man built could be taken apart


  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 17:11

johnwoo

3S-GTE

KnEuTeR schreef op 31 oktober 2002 @ 13:02:
[...]


niks geen keylogger?! ik log geen keys ik geneer ze?!


[...]


hej, bedankt, werkt op zich wel, maar toch nog niet helemaal goed genoeg

ik maak gebruik van een Microsoft Internet Tools component (zo'n browsertje)

als ik een paar keer TAB verstuur beweegt hij wel over het scherm heen, en ook in het browser venstertje, naar link 1, maar als hij eenmaal daarin is, hoeveel tabs ik daarna ook verstuur, hij blijft HANGEN, gaat niet naar de volgende link :{ (terwijl als ik dan handmatig op tab druk dan verspringt ie wel)

Me.hWnd werkte niet goed, dus ik dacht ik probeer WebBrowser1.hWnd, die bestaat wel maar toch krijg ik een error:

Run-time error '-2147467259 (80004005)'
Method HWND of 'IWebBrowser2' failed

ik word echt helemaaal gek, stom programma werkt nog steeeds niet?!
Ooh, het gaat om zo'n WebBrowser componentje? Die heeft toch gewoon een method Navigate (of Navigate2, zou ook wel kunnen)? Kun je daarmee niet gewoon naar een andere URL gaan, in plaats van te tabben naar de juiste link en dan een Enter te geven :)

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 22:50

Klippy

Still Game

Heb ongeveer hetzelfde probleem, wel in C++, maar is dezelfde functie.
[rml][ C++] SendInput naar ander window[/rml]

Eigenlijk ook nog niet echt een oplossing op...

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


  • KnEuTeR
  • Registratie: Mei 2000
  • Laatst online: 24-02-2024

KnEuTeR

iedereen heeft een handelsmerk

Topicstarter
johnwoo schreef op 31 oktober 2002 @ 15:33:
[...]

Ooh, het gaat om zo'n WebBrowser componentje? Die heeft toch gewoon een method Navigate (of Navigate2, zou ook wel kunnen)? Kun je daarmee niet gewoon naar een andere URL gaan, in plaats van te tabben naar de juiste link en dan een Enter te geven :)
nee, zo kan het niet, niet wat ik wil

hoe kan ik de tabs naar dat window sturen?!

Computers ain't that smart, Whatever man built could be taken apart


  • KnEuTeR
  • Registratie: Mei 2000
  • Laatst online: 24-02-2024

KnEuTeR

iedereen heeft een handelsmerk

Topicstarter
de error: Method HWND of 'IWebBrowser2' failed

daarbij vond ik deze oplossing:

http://www.vbcodemagician.dk/tips/internet_browserhwnd.htm

maar die werkt nog steeds niet :'(

Computers ain't that smart, Whatever man built could be taken apart


  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 17:11

johnwoo

3S-GTE

Hmm, ik zie nu in een project van me dat ik toch niet 0 opgeef als laatste parameter van PostMessage. Probeer deze constanten eens:

PostMessage hWnd, WM_KEYDOWN, vbKeyTab, &H1
PostMessage hWnd, WM_KEYUP, vbKeyTab, &H80000001

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1

Pagina: 1