|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
General
Anmeldungsdatum: 26.11.2006 Beiträge: 149
|
Verfasst am: 03.03.2007, 20:16 Titel: Tasten zyklisch drücken lassen |
|
|
ja die frage ist wie in meiner überschrift, ist es irgendwie möglich, das man simulieren lässt das bestimmt tasten auf dem PC gedrückt wurden, also zum beispiel das das Programm simuliert, das die Taste A alle 2 sec gedrückt wird.??? |
|
Nach oben |
|
|
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 03.03.2007, 20:55 Titel: |
|
|
Also:
Dafür gibs die API-Funktion SendKey().
Hierzu benötigst du Handle des Empfängers und den Keycode der Taste. |
|
Nach oben |
|
|
General
Anmeldungsdatum: 26.11.2006 Beiträge: 149
|
Verfasst am: 03.03.2007, 20:57 Titel: |
|
|
wäre es dir möglich da ma ein beispiel zu schreiben da ich api und sendkey() noch nicht kennne ?? |
|
Nach oben |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 03.03.2007, 21:01 Titel: |
|
|
PMedia war mal wieder schneller mit'n Schreiben als mit'n Denken ???
SendKey ist VisualBASIC in der bisherigen Version von FreeBasic hab ich noch kein SendKey, wenn es dazu eine API gibt kann ich die leider nirgendwo finden, wenn Du schon Postest, dann doch bitte etwas Hilfreicher !! _________________
|
|
Nach oben |
|
|
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 03.03.2007, 21:03 Titel: |
|
|
SendKey IST ein API-Befehl!
Ich such grad...
//edit
Hm. na gut, etwas anders heißt er
User32.dll:: keybd_event
Für C-Sharp'ler;
Code: | // Deklaration der API:
[DllImport("user32.dll", CharSet = CharSet.Ansi )]
public extern static void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
// In einer Methode...
keybd_event(VK_SPACE, 0, 0, 0);
keybd_event(VK_SPACE, 0, KEYEVENTF_KEYUP, 0); |
RealBasic:
Code: | Sub SendKey(VKey As Integer, PressDown As Boolean)
Dim ret As Integer
Declare Function keybd_event Lib "user32.dll" Alias "keybd_event"(bVk
As Integer, bScan As Integer, dwFlags As Integer, dwExtraInfo As
Integer) As Integer
If PressDown Then
ret = keybd_event(VKey, 0,0,0) ''Press Button Down
Else
ret = keybd_event(VKey,0,KEYEVENTF_KEYUP ,0) ''Release Button
End If
End Sub
Um z.B. CTRL+SHIF+i zu senden macht man folgendes:
SendKey VK_CONTROL,True 'CTRL druecken
SendKey VK_LSHIFT,True 'Links Shift Druecken
SendKey VK_I,True ' i druecken
SendKey VK_I,False ' i loslassen
SendKey VK_LSHIFT,False ' Links Shift loslassen
SendKey VK_CONTROL,False ' CTRL loslassen |
|
|
Nach oben |
|
|
General
Anmeldungsdatum: 26.11.2006 Beiträge: 149
|
Verfasst am: 04.03.2007, 00:14 Titel: |
|
|
alles klar also bei mir kommt da ein fehler
"illegal specefication at parameter 2: Pressdown"
und was is denn Boolean? |
|
Nach oben |
|
|
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 04.03.2007, 00:25 Titel: |
|
|
Das is kein FB-Code |
|
Nach oben |
|
|
General
Anmeldungsdatum: 26.11.2006 Beiträge: 149
|
Verfasst am: 04.03.2007, 00:36 Titel: |
|
|
ohh hab mich shcon gewundert? und wie kann man das in FB realisieren oder wäre es mit zu viel aufwand verbunden ?? |
|
Nach oben |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 04.03.2007, 05:04 Titel: |
|
|
Auf die möglichkeit bin ich auch schon gestossen aber leider funktioniert es bei mir auch nicht richtig, irgendwas ist mit der user32.dll declaration schief gegangen, denn er gibt mir immer die Fehlermeldung einer ungültigen referenz zurück
Code: |
Const KEYEVENTF_KEYUP = &H2
' benötigte API-Deklarationen
Declare Sub keybd_event Lib "user32.dll" alias "KEYBD_EVENT" (ByVal bVk As Byte, ByVal bScan As Byte,_
ByVal dwFlags As integer, ByVal dwExtraInfo As integer)
'declare sub keybd_event (byval as BYTE, byval as BYTE, byval as DWORD, byval as DWORD)
#define TRUE -1
#DEFINE FALSE not TRUE
' Virtual KeyCodes
Enum eVirtualKeyCode
VK_BAK = &H8
VK_TAB = &H9
VK_CLEAR = &HC
VK_RETURN = &HD
VK_SHIFT = &H10
VK_CONTROL = &H11
VK_MENU = &H12
VK_PAUSE = &H13
VK_CAPITAL = &H14
VK_ESCAPE = &H1B
VK_PRIOR = &H21
VK_NEXT = &H22
VK_END = &H23
VK_HOME = &H24
VK_LEFT = &H25
VK_UP = &H26
VK_RIGHT = &H27
VK_DOWN = &H28
VK_SELECT = &H29
VK_SNAPSHOT = &H2C ' NEU! Windows-Taste
VK_INSERT = &H2D
VK_DELETE = &H2E
VK_HELP = &H2F
VK_F1 = &H70
VK_F2 = &H71
VK_F3 = &H72
VK_F4 = &H73
VK_F5 = &H74
VK_F6 = &H75
VK_F7 = &H76
VK_F8 = &H77
VK_F9 = &H78
VK_F10 = &H79
VK_F11 = &H7A
VK_F12 = &H7B
VK_F13 = &H7C
VK_F14 = &H7D
VK_F15 = &H7E
VK_F16 = &H7F
VK_NUMLOCK = &H90
VK_SCROLL = &H91
VK_WIN = &H5B ' NEU! Windows-Taste
VK_APPS = &H5D ' NEU! Taste für Kontextmenü
End Enum
' Text durch Simulieren von Tastenanschlägen
' an das aktive Control senden
public Sub SendKeysEx(ByVal sText As String)
Dim VK As eVirtualKeyCode
Dim sChar As String
Dim i As Integer
Dim bShift As Byte
' Jedes Zeichen einzeln senden
For i = 1 To Len(sText)
' aktuelles Zeichen extrahieren
sChar = Mid$(sText, i, 1)
' Sonderzeichen?
bShift = False
If sChar = "{" Then
If UCase$(Mid$(sText, i + 1, 9)) = "BACKSPACE" Then
VK = VK_BAK
i = i + 9
ElseIf UCase$(Mid$(sText, i + 1, 2)) = "BS" Then
VK = VK_BAK
i = i + 3
ElseIf UCase$(Mid$(sText, i + 1, 4)) = "BKSP" Then
VK = VK_BAK
i = i + 5
ElseIf UCase$(Mid$(sText, i + 1, 5)) = "BREAK" Then
VK = VK_PAUSE
i = i + 6
ElseIf UCase$(Mid$(sText, i + 1, 8)) = "CAPSLOCK" Then
VK = VK_CAPITAL
i = i + 9
ElseIf UCase$(Mid$(sText, i + 1, 6)) = "DELETE" Then
VK = VK_DELETE
i = i + 7
ElseIf UCase$(Mid$(sText, i + 1, 3)) = "DEL" Then
VK = VK_DELETE
i = i + 4
ElseIf UCase$(Mid$(sText, i + 1, 4)) = "DOWN" Then
VK = VK_DOWN
i = i + 5
ElseIf UCase$(Mid$(sText, i + 1, 2)) = "UP" Then
VK = VK_UP
i = i + 3
ElseIf UCase$(Mid$(sText, i + 1, 4)) = "LEFT" Then
VK = VK_LEFT
i = i + 5
ElseIf UCase$(Mid$(sText, i + 1, 5)) = "RIGHT" Then
VK = VK_RIGHT
i = i + 6
ElseIf UCase$(Mid$(sText, i + 1, 3)) = "END" Then
VK = VK_END
i = i + 4
ElseIf UCase$(Mid$(sText, i + 1, 5)) = "ENTER" Then
VK = VK_RETURN
i = i + 6
ElseIf UCase$(Mid$(sText, i + 1, 4)) = "HOME" Then
VK = VK_HOME
i = i + 5
ElseIf UCase$(Mid$(sText, i + 1, 3)) = "ESC" Then
VK = VK_ESCAPE
i = i + 4
ElseIf UCase$(Mid$(sText, i + 1, 4)) = "HELP" Then
VK = VK_HELP
i = i + 5
ElseIf UCase$(Mid$(sText, i + 1, 6)) = "INSERT" Then
VK = VK_INSERT
i = i + 7
ElseIf UCase$(Mid$(sText, i + 1, 3)) = "INS" Then
VK = VK_INSERT
i = i + 4
ElseIf UCase$(Mid$(sText, i + 1, 7)) = "NUMLOCK" Then
VK = VK_NUMLOCK
i = i + 8
ElseIf UCase$(Mid$(sText, i + 1, 4)) = "PGUP" Then
VK = VK_PRIOR
i = i + 5
ElseIf UCase$(Mid$(sText, i + 1, 4)) = "PGDN" Then
VK = VK_NEXT
i = i + 5
ElseIf UCase$(Mid$(sText, i + 1, 10)) = "SCROLLLOCK" Then
VK = VK_SCROLL
i = i + 11
ElseIf UCase$(Mid$(sText, i + 1, 3)) = "TAB" Then
VK = VK_TAB
i = i + 4
ElseIf UCase$(Mid$(sText, i + 1, 2)) = "F1" Then
VK = VK_F1
i = i + 3
ElseIf UCase$(Mid$(sText, i + 1, 2)) = "F2" Then
VK = VK_F2
i = i + 3
ElseIf UCase$(Mid$(sText, i + 1, 2)) = "F3" Then
VK = VK_F3
i = i + 3
ElseIf UCase$(Mid$(sText, i + 1, 2)) = "F4" Then
VK = VK_F4
i = i + 3
ElseIf UCase$(Mid$(sText, i + 1, 2)) = "F5" Then
VK = VK_F5
i = i + 3
ElseIf UCase$(Mid$(sText, i + 1, 2)) = "F6" Then
VK = VK_F6
i = i + 3
ElseIf UCase$(Mid$(sText, i + 1, 2)) = "F7" Then
VK = VK_F7
i = i + 3
ElseIf UCase$(Mid$(sText, i + 1, 2)) = "F8" Then
VK = VK_F8
i = i + 3
ElseIf UCase$(Mid$(sText, i + 1, 2)) = "F9" Then
VK = VK_F9
i = i + 3
ElseIf UCase$(Mid$(sText, i + 1, 3)) = "F10" Then
VK = VK_F10
i = i + 4
ElseIf UCase$(Mid$(sText, i + 1, 3)) = "F11" Then
VK = VK_F11
i = i + 4
ElseIf UCase$(Mid$(sText, i + 1, 3)) = "F12" Then
VK = VK_F12
i = i + 4
ElseIf UCase$(Mid$(sText, i + 1, 3)) = "F13" Then
VK = VK_F13
i = i + 4
ElseIf UCase$(Mid$(sText, i + 1, 3)) = "F14" Then
VK = VK_F14
i = i + 4
ElseIf UCase$(Mid$(sText, i + 1, 3)) = "F15" Then
VK = VK_F15
i = i + 4
ElseIf UCase$(Mid$(sText, i + 1, 3)) = "F16" Then
VK = VK_F16
i = i + 4
' NEU! Windows-Taste
ElseIf UCase$(Mid$(sText, i + 1, 3)) = "WIN" Then
VK = VK_WIN
i = i + 4
' NEU! Kontextmenü
ElseIf UCase$(Mid$(sText, i + 1, 4)) = "APPS" Then
VK = VK_APPS
i = i + 5
' NEU! PrintScreen-Taste (DRUCK)
ElseIf UCase$(Mid$(sText, i + 1, 5)) = "PRINT" Then
VK = VK_SNAPSHOT
i = i + 6
End If
ElseIf sChar = "+" Then
' Umschalttaste
VK = VK_SHIFT
ElseIf sChar = "%" Then
' ALT
VK = VK_MENU
ElseIf sChar = "^" Then
' STRG
VK = VK_CONTROL
Else
' Großbuchstabe...?
bShift = (UCase$(sChar) = sChar And Not asc(sChar))
If bShift Then
' ... dann zusätzlich Shift (Umsch)-Taste "drücken"
keybd_event VK_SHIFT, 1, 0, 0
End If
' Virtual KeyCode ermitteln...
VK = Asc(UCase$(sChar))
End If
' niederdrücken und wieder loslassen
keybd_event VK, 1, 0, 0
keybd_event VK, 1, KEYEVENTF_KEYUP, 0
' Shift (Umsch)-Taste wieder loslassen
If bShift Then
keybd_event VK_SHIFT, 1, KEYEVENTF_KEYUP, 0
End If
Next i
End Sub
|
vielleicht findet ja jemand den Fehler.... _________________
|
|
Nach oben |
|
|
Eastler_dart
Anmeldungsdatum: 25.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
|
Verfasst am: 05.03.2007, 00:00 Titel: |
|
|
Hm - grübel
bei meiner Programmiertechnik sieht das nicht so umfangreich aus, da ich mit Inkey$ arbeite, ungefähr so:
Code: |
REM stark vereinfachtes Beispiel meiner Art, die Tastatur abzufragen
DO
in$ = Inkey$
LOOP WHILE in$=""
REM hier gehts erst weiter, wenn eine Taste gedrückt wurde
SELECT CASE in$
Case chr$(13)
PRINT "Return wurde gedrückt"
CASE chr$(27)
PRINT "Escape wurde gedrückt"
CASE "a"
PRINT "ein kleines A wurde gedrückt
END SELECT
|
Hier würde ich für eure Problemlösung in die Do-Loop-Schleife per Timer in einer Variablen hochzählen und fals dieser Wert dann (IF THEN) 2 Sekunden erreicht, einfach ein "A" in in$ reinhauen
Code: |
REM nur andeutungsweise, wie alle 2 Sekunden ein "A" als Eingabe
REM simuliert werden könnte.
REM Der Umgang mit "Timer" geht etwas anders, hier nur
REM beispielhaft leicht verständlich erklärt
OldTimer=0
DO
in$ = Inkey$
IF TIMER >= OldTimer+2 THEN
in$="A"
OldTimer=Timer
END IF
LOOP WHILE in$=""
REM hier gehts erst weiter, wenn eine Taste gedrückt wurde
SELECT CASE in$
Case chr$(13)
PRINT "Return wurde gedrückt"
CASE chr$(27)
PRINT "Escape wurde gedrückt"
CASE "A"
PRINT "ein grosses A wurde gedrückt
END SELECT
|
Hoffe, daß euch diese Gedanken weiter helfen
Eastler
Hoffe, _________________ Kaum macht mans richtig, schon geht's |
|
Nach oben |
|
|
General
Anmeldungsdatum: 26.11.2006 Beiträge: 149
|
Verfasst am: 05.03.2007, 15:59 Titel: |
|
|
hey super genau das ist das was ich brauchte, auch sehr einfach gehalten, und wie kann ich es jetzt so realisieren das die Tasten solange in einem bestimmten rhythmus gedrückt werden, bis ich stoppen möchte?? |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 05.03.2007, 16:07 Titel: |
|
|
Das sollte in der DO-Schleife mit EXIT möglich sein:
Code: | IF [abbruchbedingung] THEN EXIT DO |
*noch mal nachdenk*
Ist glaube ich nicht das, was du brauchst. Setze doch eine Variable (tastendruck=1), wenn du den Tastendruck haben willst, und tastendruck=0, wenn du keinen Tastendruck haben willst. In deine TIMER-Schleife kommt dann noch eine zusätzliche Abfrage hinein: Wenn tastendruck=1 dann setze in$ auf "A".
Zuletzt bearbeitet von nemored am 05.03.2007, 16:12, insgesamt 2-mal bearbeitet |
|
Nach oben |
|
|
General
Anmeldungsdatum: 26.11.2006 Beiträge: 149
|
Verfasst am: 05.03.2007, 16:10 Titel: |
|
|
ok alles klar, dann habe ich ma noch ne andere fragen, wie kann man jetzt zum beispiel ein selbst geschriebenes Programm an einen Windowsprozess ranhängen. Oder ein anders Beispiel, ich will einen Ordner öffnen und dieser Ordner wird von einem selbstprogrammierten Programm mit einem Pwassowrt geschützt, ist sowas möglich ?? |
|
Nach oben |
|
|
csde_rats
Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
|
General
Anmeldungsdatum: 26.11.2006 Beiträge: 149
|
Verfasst am: 05.03.2007, 16:17 Titel: |
|
|
ok, war schon mal ne aussagekräftige antwort, aber wie müsste man es denn überhaupt angehen?? |
|
Nach oben |
|
|
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 05.03.2007, 16:41 Titel: |
|
|
Zitat: | ok alles klar, dann habe ich ma noch ne andere fragen, wie kann man jetzt zum beispiel ein selbst geschriebenes Programm an einen Windowsprozess ranhängen. Oder ein anders Beispiel, ich will einen Ordner öffnen und dieser Ordner wird von einem selbstprogrammierten Programm mit einem Pwassowrt geschützt, ist sowas möglich ?? |
Es ist möglich, ich habe es bereits gemacht, aber in Profan.
Beides sollte per Pipes und Messages gehen. SendMessageEx hieß die API glaub ich dafür... |
|
Nach oben |
|
|
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 05.03.2007, 16:43 Titel: |
|
|
@csderats:
Es ist möglich.
Schau dir mal die WinAPI-Funktion keybd_event (oder so ähnlich, hab lange nicht mehr mit gearbeitet) an. Sowas bekommste mit ein paar Zeilen hin. _________________ Eine handvoll Glück reicht nie für zwei.
--
|
|
Nach oben |
|
|
General
Anmeldungsdatum: 26.11.2006 Beiträge: 149
|
Verfasst am: 05.03.2007, 16:53 Titel: |
|
|
hmmm, habt ihr ma irgendwo ein tutorial zu den API denn ich habe noch nie damit gearbeitet, und ich will ja net das ihr das wieder amcht, muss ja och alleine gucken ?? |
|
Nach oben |
|
|
csde_rats
Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
|
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 05.03.2007, 16:59 Titel: |
|
|
Ich wollt das nur nicht so im Raum stehen lassen.
Code: |
keybd_event(lScanCode, 0, 0, 0);
keybd_event(lScanCode, 0, KEYEVENTF_KEYUP, 0);
|
Wäre entsprechender Delphi-Code, bzw. die WinAPI-Aufrufe. Allerdings weiß ich jetzt nicht, ob die Konstante KEYEVENTF_KEYUP über die Unit "ShellApi" von Delphi geregelt wird oder über Windows. lScanCode muss natürlich mit dem Scancode der Taste ausgetauscht werden. _________________ Eine handvoll Glück reicht nie für zwei.
--
|
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|