Simuler taste tryk

Tags:    delphi

Hvordan simulerer man et tastetryk? Så man kan skrive i et felt eller lignende uden for formen.
Mvh.
Rune Jensen
---------------------------------------------------------------------------
##The one who laugh last is the one who think slowest!##
---------------------------------------------------------------------------



10 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 2 karma
Sorter efter stemmer Sorter efter dato
Hvordan simulerer man et tastetryk? Så man kan skrive i et felt eller lignende uden for formen.
Mvh.
Rune Jensen
---------------------------------------------------------------------------
##The one who laugh last is the one who think slowest!##
---------------------------------------------------------------------------


Det mest sikre er at bringe vinduet du vil skrive til op som det "foreste" program, og dernæst bruge Keydb_event funktionen.

MH.

The-Freak

Livet er for kort til at kede sig.



Hvis du vil simulere tastetryk til et felt i en anden app. skal du først have en handle til feltet. Den kan du finde ved at bruge API-funktionen FindWindowEx.
Problemet er dog man skal anvende Class-names og at de dels er ukendte samt at man i første omgang kun finder top-level vinduer. Det felt (edit-kontrol) man vil skrive til ligger dybere i den pågældende app.'s vindueshieraki. For at finde disse kan du anvende WinSight som følger med Delphi.
Her kan man for Internet Explorer se at Class Name for hovedvinduet er "IEFrame". Adresse-editkontrollen er begravet i flg. vinduer (class names): "IEFrame + WorkerW + ReBarWindow32 + ComboBoxEx32 + ComboBox + Edit".
Når du har handlen kan du sende "taste-tryk" til denne via API-funktionen SendMessage med brug af WM_KEYDOWN, WM_CHAR og WM_KEYUP. Til disse messages anvendes Virtual-Key Codes som findes i Win 32 SDK Reference. Det er dog meget nemmere blot at sende hele teksten, såfremt det er en Edit-kontrol og så kun simulere en <return>.
Flg. kode sender et link til Internet Explorer (hvis den er åben) og siden skulle gerne skifte til den angivne adresse (testet med IE 6.0):
Fold kodeboks ind/udKode 


Er dit problem, at du "kun" ønsker at sende links til IE ville det være meget nemmere at gøre som følger:

Fold kodeboks ind/udKode 


Denne kode kan for i øvrigt anvendes til meget andet idet
f.eks
ShellExecute(0, 'Open', PChar(ExtractFileDir(ParamStr(0))), nil, nil, sw_Show);
vil åbne Stifinder i det dir hvor den kaldende exe ligger.
Herudover kan man kalde (=åbne) andre exe-filer eller åbne filer med registrerede extensions (.txt, *.hlp o.s.v.)
eks.: ShellExecute(0, 'Open', 'C:\\blabla.txt', nil, nil, sw_Show);
vil åbne blabla.txt i Notepad.

mvh
hsv



[Redigeret d. 16/11-04 11:03:27 af HSV]

[Redigeret d. 16/11-04 11:04:16 af HSV]



Hvordan gør jeg det? Får programmet til at køre forrest og så stadig kunne få programmet itl at trykke på nogen taster automatisk..
Mvh.
Rune Jensen
---------------------------------------------------------------------------
##The one who laugh last is the one who think slowest!##
---------------------------------------------------------------------------



Ville det ikke være lettere at bruge en timer til at skrive til et text felt hvis det skulle være automatisk er det vel ikke nødvendigt at simulere et taste tryk?
-----------------------------------------------------------------------------

Min side ->www.the-hive.dk/~donp/



HVordan skal jeg skrive til et text felt med en timer? Husk det er jo et felt uden for formen.. for eksempel internet adressebaren
Mvh.
Rune Jensen
---------------------------------------------------------------------------
##The one who laugh last is the one who think slowest!##
---------------------------------------------------------------------------



Det er da en god måde :D Og koden virker og det hele.
Men jeg tænkte på en ting.. Er det ikk muligt at få (i en Ontimer) først musen til at klikke et sted (ved jeg godt hvordan jeg gør) og så bare få delphi til at "trykke" på de taster man vil have?
Mvh.
Rune Jensen
---------------------------------------------------------------------------
##The one who laugh last is the one who think slowest!##
---------------------------------------------------------------------------



Jo. Hvis du vil indsætte tastetryk (el. mouseevents) i Windows mouse og kbd stream kan dette gøre v.hj.a. API-funktionen SendInput. I min D6 er den ikke rigtig dokumenteret, selv om den er defineret i source\\rtl\\win\\windows.pas.

Du kan evt. finde inf. under flg. link

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputfunctions/sendinput.asp

her er der også inf. omkring parametre. NB! SendInput sender de genererede tastetryk til den tråd/proces, som har focus.

SendInput kan du så kalde i din OnTimer.

Dette er mig bekendt den eneste mulighed, der findes for at genere tastetryk uden brug af en Handle.

mvh
hsv


[Redigeret d. 17/11-04 08:58:15 af HSV]



Jo. Hvis du vil indsætte tastetryk (el. mouseevents) i Windows mouse og kbd stream kan dette gøre v.hj.a. API-funktionen SendInput. I min D6 er den ikke rigtig dokumenteret, selv om den er defineret i source\\rtl\\win\\windows.pas.

Du kan evt. finde inf. under flg. link

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputfunctions/sendinput.asp

her er der også inf. omkring parametre. NB! SendInput sender de genererede tastetryk til den tråd/proces, som har focus.

SendInput kan du så kalde i din OnTimer.

Dette er mig bekendt den eneste mulighed, der findes for at genere tastetryk uden brug af en Handle.

mvh
hsv


[Redigeret d. 17/11-04 08:58:15 af HSV]



Jeg fikd et til at virke med denne kode som jeg fandt der hvor du henviste mig til.

Fold kodeboks ind/udKode 


Men hvordan laver jeg for eksempel et R? På siden står der at man skal skrive (52) isedet for VK_NUMLOCK men den trykker ikke R når man skriver det.
Mvh.
Rune Jensen
---------------------------------------------------------------------------
##The one who laugh last is the one who think slowest!##
---------------------------------------------------------------------------



Ok. Du kan godt bruge keybd_event i st. f. SendInput. SendInput er ment som erstatning for keybd_event samt mouse_event, men disse virker ok.

Se (som jeg skrev tidl. ) under MS SDK Help Files (installeret med delphi) og åbn Win 32 SDK Reference. Søg efter "Virtual-Key Codes" Her står de alle (næsten) opført.

M.h.t til "R" så er 52 en Hex-værdi (=82). Værdien skal indsættes som 1. parameter. 2. parameter (scan code) er ligegyldig og sættes til 0.

Et "R" dannes således:
Fold kodeboks ind/udKode 


Som du ser skal man trykke SHIFT for at få store bogstaver
æ,ø,å samt mange tegn (; : . o.s.v.) findes under de intervaller som er benævnt "OEM specific".

mvh
hsv






Yes virker fint :D Tak for hjælpen..
Mvh.
Rune Jensen
---------------------------------------------------------------------------
##The one who laugh last is the one who think slowest!##
---------------------------------------------------------------------------



t