Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Tasten zyklisch drücken lassen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
General



Anmeldungsdatum: 26.11.2006
Beiträge: 149

BeitragVerfasst am: 03.03.2007, 20:16    Titel: Tasten zyklisch drücken lassen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 03.03.2007, 20:55    Titel: Antworten mit Zitat

Also:
Dafür gibs die API-Funktion SendKey().
Hierzu benötigst du Handle des Empfängers und den Keycode der Taste.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
General



Anmeldungsdatum: 26.11.2006
Beiträge: 149

BeitragVerfasst am: 03.03.2007, 20:57    Titel: Antworten mit Zitat

wäre es dir möglich da ma ein beispiel zu schreiben da ich api und sendkey() noch nicht kennne ??
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 03.03.2007, 21:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 03.03.2007, 21:03    Titel: Antworten mit Zitat

SendKey IST ein API-Befehl!
Ich such grad...
//edit
Hm. na gut, etwas anders heißt er happy

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
Benutzer-Profile anzeigen Private Nachricht senden
General



Anmeldungsdatum: 26.11.2006
Beiträge: 149

BeitragVerfasst am: 04.03.2007, 00:14    Titel: Antworten mit Zitat

alles klar also bei mir kommt da ein fehler
"illegal specefication at parameter 2: Pressdown"
und was is denn Boolean?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 04.03.2007, 00:25    Titel: Antworten mit Zitat

Das is kein FB-Code happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
General



Anmeldungsdatum: 26.11.2006
Beiträge: 149

BeitragVerfasst am: 04.03.2007, 00:36    Titel: Antworten mit Zitat

ohh hab mich shcon gewundert? und wie kann man das in FB realisieren oder wäre es mit zu viel aufwand verbunden ??
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 04.03.2007, 05:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Eastler_dart



Anmeldungsdatum: 25.09.2005
Beiträge: 177
Wohnort: Baden-Würtemberg + Sachsen

BeitragVerfasst am: 05.03.2007, 00:00    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen Yahoo Messenger
General



Anmeldungsdatum: 26.11.2006
Beiträge: 149

BeitragVerfasst am: 05.03.2007, 15:59    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4698
Wohnort: ~/

BeitragVerfasst am: 05.03.2007, 16:07    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
General



Anmeldungsdatum: 26.11.2006
Beiträge: 149

BeitragVerfasst am: 05.03.2007, 16:10    Titel: Antworten mit 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 ??
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 05.03.2007, 16:14    Titel: Antworten mit Zitat

(ich will ja niemanden abschrecken, aber:) das ist (fast) unmöglich. (und (ich will auch niemanden beleidigen) vll. zu kompliziert).
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
General



Anmeldungsdatum: 26.11.2006
Beiträge: 149

BeitragVerfasst am: 05.03.2007, 16:17    Titel: Antworten mit Zitat

ok, war schon mal ne aussagekräftige antwort, aber wie müsste man es denn überhaupt angehen??
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 05.03.2007, 16:41    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 05.03.2007, 16:43    Titel: Antworten mit Zitat

@csderats:
Es ist möglich. zwinkern
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. zwinkern
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
General



Anmeldungsdatum: 26.11.2006
Beiträge: 149

BeitragVerfasst am: 05.03.2007, 16:53    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 05.03.2007, 16:53    Titel: Antworten mit Zitat

ja gut, okay (bloß kein streit lachen Zunge rausstrecken ) mit den Augen rollen mit den Augen rollen
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 05.03.2007, 16:59    Titel: Antworten mit Zitat

Ich wollt das nur nicht so im Raum stehen lassen. zwinkern
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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz