Avatar billede hugobart Nybegynder
30. marts 2001 - 23:00 Der er 26 kommentarer og
1 løsning

Hvordan udføres et tastetryk virtuelt?

Jeg har et lille program hvor man kan sende et virtuelt tastetryk til et program som man vælger ud fra en liste. (Det smarte ved programmet er at det sender tastetrykket til programmer selvom de er minimeret, og det er det jeg skal bruge.)
Programmet er imellemtiden uden source så jeg kan ikke se hvordan det fungerer. Men jeg kunne godt tænke mig at lave et lignende program og...
Er der nogen som kan hjælpe med noget API opkald eller lignende til se sende tastetryk/hotkeys til minimerede programmer?

Lars Lyning
Avatar billede tdaugaard Nybegynder
30. marts 2001 - 23:02 #1
SendKeys \"taster\"

f.eks.

SendKeys \"T\"

så skal du med et par API\'s gøre vinduet du vil sende til aktivt.
Avatar billede hugobart Nybegynder
30. marts 2001 - 23:18 #2
Jeg er ikke helt med hvad du mener...
(Mit program skal kunne sende taste input til et minimeret vindue uden at bringe det frem) Skal jeg ikke sende noget infomation til vinduets hwnd eller hdc ?
Avatar billede tdaugaard Nybegynder
30. marts 2001 - 23:21 #3
hWnd jo, men det skal du finde vha. et par API kald (FindWindow() og noget a\'la SetActiveWindow() .. er ikke helt sikker på den sidste ..).
Avatar billede tdaugaard Nybegynder
30. marts 2001 - 23:26 #4
Koden er _IKKE_ testet!

---
Declare Function FindWindow Lib \"user32\" Alias \"FindWindowA\" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Declare Function SetActiveWindow Lib \"user32.dll\" (ByVal hwnd As Long) As Long

Private Sub Command1_Click()
  lngHWnd = FindWindow(\"Programmets Klasse. f.eks. \'iexplore\', eller vbNullString\", \"Titlen på programmet, eller vbNullString\")
  lngRetval = SetActiveWindow(lngHWnd)

  SendKeys \"T\"
End Sub
Avatar billede hugobart Nybegynder
30. marts 2001 - 23:41 #5
Så vidt jeg kan forstå så er SetActiveWindow en kommando som bringer vinduet frem i forgrunden altså giver det fokus. Og det er jo det det helst ikke skal da det gerne skulle forblive minimeret.
Avatar billede tdaugaard Nybegynder
30. marts 2001 - 23:45 #6
Nopes .. nemlig ikke ..

det er SetWindowForeground() der gør det, SetActiveWindow() gør kun vinduet aktivt, men det fjerner så fokus fra det aktive program... men det er den eneste måde jeg ved at man kan gøre det på.
Avatar billede hugobart Nybegynder
30. marts 2001 - 23:53 #7
Jeg kan godt nok ikke få din stump af kode til at fungere den sender godt nok T til en textbox hvis jeg markerer den
Avatar billede tdaugaard Nybegynder
30. marts 2001 - 23:55 #8
Det er jo ikke nok at du aktivere vinduet .. hvis du skal have en kontrol aktiveret skal du bruge {tab} til at flytte makøren med .. og hvis det er til et program du selv har lavet skal du nok gøre det i Private Sub Form_Activate()
Avatar billede hugobart Nybegynder
31. marts 2001 - 01:40 #9
kan det ikke lade sig gøre med:
Public Declare Function SendMessage Lib \"user32\" Alias \"SendMessageA\" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
og...
Public Const WM_KEYDOWN = &H100
?
Avatar billede tdaugaard Nybegynder
31. marts 2001 - 04:30 #10
Nopes ..

Jow da .. men SendMessage() kan vist ikke sende normale bogstaver/tal kan den ?
Avatar billede nolle_k Nybegynder
31. marts 2001 - 08:08 #11
Hvis du kender Task ID for programmet kan det lade sig gøre på følgende måde!!



AppActivate TaskID \'Activate Prog
SendKeys \"{F5}\", True  \' Send keystrokes to prog

Avatar billede tdaugaard Nybegynder
31. marts 2001 - 08:35 #12
Process ID går det nok under ... men det skal du også finde vha. et API..
Avatar billede hugobart Nybegynder
31. marts 2001 - 11:27 #13
Problemet med appactivate er bare at den giver programmet \"fokus\" (i status baren) det skulle gerne være sådan at hvis jeg satte en timer til at udføre forskellige tastetryk til programmet så skulle jeg kunne bruge computeren imens.
Avatar billede tdaugaard Nybegynder
31. marts 2001 - 11:30 #14
hugobart:> hvad er det for et program du vil sende taster til ? det kan være det hjælper lidt ved at vide hvad det er for et .. (evt. hvis vi så kan finde et Class ID ..)
Avatar billede hugobart Nybegynder
31. marts 2001 - 11:46 #15
ultima online
Avatar billede tdaugaard Nybegynder
31. marts 2001 - 11:47 #16
Nå .. øv ..det kendte jeg sku\'t (hvad bruges det til?)
Avatar billede hugobart Nybegynder
31. marts 2001 - 11:49 #17
Kan man ikke sende keystrokes til programmets hukommelse eller lign. (gennem win32 API)?
Avatar billede hugobart Nybegynder
31. marts 2001 - 11:50 #18
Det er simpelt hen bare et online spil :)
Avatar billede tdaugaard Nybegynder
31. marts 2001 - 11:51 #19
ahh .. oki :-)

Men jeg tror ikke der er andre muligheder end dem vi har her.
Avatar billede hugobart Nybegynder
31. marts 2001 - 11:54 #20
Men jeg har jo allerede et program som kan klare det og det benytter ingen dll\'er eller noget så jeg tror det kan lade sig gøre med win32 API\'en. Hvad gør openProcess ?
Avatar billede hugobart Nybegynder
31. marts 2001 - 11:56 #21
Hvis man kunne overføre en send input til programmets processid
Avatar billede hugobart Nybegynder
31. marts 2001 - 11:56 #22
Declare Function SendInput Lib \"user32.dll\" (ByVal nInputs As Long, pInputs As INPUT_TYPE, ByVal cbSize As Long) As Long
Avatar billede tdaugaard Nybegynder
31. marts 2001 - 11:59 #23
OpenProcess() åbner nok en process i Windows .. men hvordan og hvorledes må du ikke spørge mig om.

Prøv at kigge på www.vbapi.com under Reference.

- jeg går i seng nu ... såe jeg kommer ikke på før i aften ..
Avatar billede hugobart Nybegynder
31. marts 2001 - 12:02 #24
iseng: Det gjorde vi andre for snart 12 timer siden :-p
Avatar billede tdaugaard Nybegynder
31. marts 2001 - 19:16 #25
hæ hæ .. tjae .. jeg har nogle MEGET skæve dagrytmer (hvis det da kan kaldes en rytme *G*)
Avatar billede hugobart Nybegynder
01. april 2001 - 11:18 #26
tdaugaard: Hvorfor ville det hjælpe at finde programmets class ?
Avatar billede krismort Nybegynder
07. april 2001 - 11:42 #27

Sådan her kan det gøres uden at man skal aktivere noget som helst:

---------------

Declare Function SendMessageByNum& Lib \"user32\" Alias \"SendMessageA\" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long)

Declare Function findwindow Lib \"user32\" Alias \"FindWindowA\" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Public Const WM_CHAR = &H102

sub sendH ()
xHwnd = FindWindow(vbNullString, \"vinduets titel\")
retval = SendMessageByNum(xHwnd, WM_CHAR, Asc(\"H\"), 0)
end sub

(Retval bliver først retuneret efter at funktionen er blevet gennemført.)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester