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:

Inkey / GETKEY - Eingabe auswerten und ändern?

 
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
creepi



Anmeldungsdatum: 13.06.2010
Beiträge: 59

BeitragVerfasst am: 12.06.2011, 14:24    Titel: Inkey / GETKEY - Eingabe auswerten und ändern? Antworten mit Zitat

Hi,
es gibt doch programme bei denen man tasten festlegen kann.
So ist eine liste der tasten vorhanden man kann eine andere eintragen und druch drüken einer folgt was ganz anderes...
Beispiel ich würde linke maus taste drücken, das prog verarbeitet den wert und gibt den tastendruck enter an system zurück so das dieser denkt ah, enter wurde gedrückt.
Oder ich drücke die mittlere maustaste und das system soll denken es wäre die rechte maustaste gewesen...

Hatte in ein beitrag was von gelesen das man systemübergreifend dann WinAPI nutzen müsste??

Schön wäre zb ein beispiel code worauf ich aufbauen könnte... : )
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 12.06.2011, 14:47    Titel: Antworten mit Zitat

Per WinAPI lassen sich schon Tasten simulieren, ein Beispiel wie das genutzt werden kann findest du hier. Allerdings landet dieser virtuelle Tastendruck wieder bei deinem eigenen Programm, was die ganze Sache etwas sinnlos macht. Wenn du ein FreeBASIC-Programm schreibst und der User bei Tastendruck von 'A' ein 'B' angezeigt bekommen soll, dann musst du das doch nur so programmieren (Pseudocode):
Code:
If Inkey() = "A" Then Print "B"


Das gleiche gilt für Mauseingaben. Wenn dein Programm beim drücken der rechten Maustaste 'ENTER' verstehen soll, dann fragst du mit GetMouse die rechte Maustaste ab und wenn sie gedrückt wird, rufst du die Prozedur auf, die du sonst aufrufen würdest, wenn 'ENTER' gedrückt würde (Pseudocode):
Code:
If GetMouse() = rechteMausTasteGedrückt Then enterPressed()
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 12.06.2011, 14:49    Titel: Antworten mit Zitat

GetAsyncKeyState()
SendInput()
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
creepi



Anmeldungsdatum: 13.06.2010
Beiträge: 59

BeitragVerfasst am: 12.06.2011, 15:13    Titel: Antworten mit Zitat

@ MOD, mit den beispiel würde ich ja innerhalb des programmes nur die sache angeben / ändern. Aber das prog soll ja im hintergrund laufen während ein anderes gestartet ist...

@ 28398, zu GetAsyncKeyState() hab ein schönes beispiel hier auf der seite gefunden
( http://www.freebasic-portal.de/code-beispiele/maus-tastatur/tastatur-systemweit-abfragen-23.html )


aber was tun um den computer zu sagen das eine taste gedrückt wurde, die gar nicht gedrückt wurde?
SendInput glaube ich isses jedenfalls nicht?

Also mit GetAsyncKeyState() wird überwacht, beispiel benutzer drückt A.
Das Program wertet A aus und wandelt es um in B.
Der geänderte befehl geht zurück an das system und nun denkt es das B gedrückt wurde wobei das gar nicht der fall war....
Hoffe konnte erklären was ich meine happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 12.06.2011, 16:48    Titel: Antworten mit Zitat

Mit dem Befehl aus dem Beispiel das ich gepostet hab, kann man das machen, also einen Key senden (keybd_event). Soweit ich das verstehe willst du mit deinem Programm den Key abfangen und stattdessen was anderes senden. Abfangen wird mit GetAsyncKeyState nicht klappen, gedrückt ist gedrückt, damit kannst du nur ermitteln, was gedrückt wurde, es aber nicht ändern. Du kannst höchstens was nachsenden.

Um den Keycode wirklich zu ändern, müsstest du wohl an den Tastaturtreiber bzw das Layout ran und da was anpassen, nur halte ich das für höchst fragwürdig, wenn mir ein Programm meine Tastatur durcheinander bringt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 12.06.2011, 19:42    Titel: Antworten mit Zitat

Keycodes ändern geht unter Windows ganz einfach wenn du das statisch machen willst (z.B.: Eingabetaste und Escape-Taste vertauschen o.ä.). Hierzu gibts einen Eintrag in der Registry, der die Key-Mappings übernimmt.
Ich weiß den Registrierungsschlüssel leider nicht mehr auswendig, hab aber auf die schnelle folgende Seiten gefunden:
http://www.winfaq.de/faq_html/Content/tip1500/onlinefaq.php?h=tip1575.htm
http://msdn.microsoft.com/en-us/windows/hardware/gg463447

Programmtechnisch wirds etwas schwieriger - insbesondere das Abfangen des Tastendrucks. Senden (simulieren) von Tastendrücken ist kein großes Problem, wofür auch schon ein paar Ansätze genannt wurden. Eventuell könnte man mit globalen Hooks da etwas bewerkstelligen - ist aber nur eine Vermutung.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 12.06.2011, 22:06    Titel: Antworten mit Zitat

creepi hat Folgendes geschrieben:
SendInput glaube ich isses jedenfalls nicht?

Öhm doch?
Zitat:
SendInput Function

Synthesizes keystrokes, mouse motions, and button clicks.


http://msdn.microsoft.com/en-us/library/ms646310(v=vs.85).aspx

-Array von INPUTS erstellen und befüllen
-SendInput aufrufen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
creepi



Anmeldungsdatum: 13.06.2010
Beiträge: 59

BeitragVerfasst am: 13.06.2011, 22:19    Titel: Antworten mit Zitat

ein ähnliches programm wäre zb. JoyToKey
drückt man ne joysticktaste je nach dem was bei JoyToKey eingestellt ist folgt die entsprächende angebliche tastatur befehl...

Der MS link war mir schon über den weg gelaufen auch ein beispiel bei:
http://www.freebasic.net/forum/viewtopic.php?p=35504&sid=7fb62a9bd8b01045a961bba8b6c9beee


hab beide beispiele zusammen gehauen nur durch include "windows.bi" funktionierte das erste beispiel nimmer wegen duplicate.... habs versucht in nen namespace gepackt nur dann funkte was anderes wieder nimmer....

Die MS seite half mir nicht weiter da das beispiel nicht wirklich so übernommen werden kann.
Der SendInput beispiel von freebasic.net bringt mir nichts da ich ihn schon zerstückelt habe aber trotzdem nicht das passiert was passieren sollte bzw. ich es nicht kompilieren kann.

kurz und knapp: ich steh noch voll aufn schlauch peinlich
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 13.06.2011, 22:47    Titel: Antworten mit Zitat

creepi hat Folgendes geschrieben:
kurz und knapp: ich steh noch voll aufn schlauch peinlich
Tust du nicht, du verfügst lediglich nicht über das notwendige Grundlagenwissen und Verständnis.

Dem kann aber abgeholfen werden: http://fb-referenz.de/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
creepi



Anmeldungsdatum: 13.06.2010
Beiträge: 59

BeitragVerfasst am: 13.06.2011, 22:52    Titel: Antworten mit Zitat

da gibt es leider SendInput nicht : (
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 13.06.2011, 23:38    Titel: Antworten mit Zitat

Ich verstehe zwar dein Problem mit der SendInput Methode nicht ganz, denn die MSDN Dokumentation ist sehr gut, aber hier ist ein kleines Beispiel zur Verwendung:
Code:
#Include Once "windows.bi"

Print "5 Sekunden Zeit um z.B. Notepad zu öffnen ..."
For rt As Integer = 5 To 1 Step -1
   Print rt
   Sleep 1000,1
Next
Print "SendInput ..."

const CntInputs = 2
Dim Inputs(1 To CntInputs) As INPUT_

With Inputs(1)
   .type = INPUT_KEYBOARD
   .ki.wVk = Asc("A")
   .ki.dwFlags =   0
End With
With Inputs(2)
   .type = INPUT_KEYBOARD
   .ki.wVk = Asc("A")
   .ki.dwFlags =   KEYEVENTF_KEYUP
End With

SendInput(CntInputs, @Inputs(1), SizeOf(INPUT_))

Print "Fertig"

Sleep

Das Programm simuliert das Drücken und anschließende Loslassen der "A"-Taste. Nach dem Programmstart wird 5 Sekunden gewartet, damit man Zeit hat z.B. Notepad zu starten um die Auswirkungen zu sehen.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
creepi



Anmeldungsdatum: 13.06.2010
Beiträge: 59

BeitragVerfasst am: 14.06.2011, 01:12    Titel: Antworten mit Zitat

habs jetzt mit dem code zum laufen gebracht, vielen dank!!
Aber wie gewonnen so zerronnen - . -

Konnte wie geplant anpassen und beim tippen klappte es auch noch wie zb. im texteditor oder...
nur nachdem spiel gestartet wurde ging es nimmer.
Als würde das spiel das prog sperren / daran hindern??
Weil die befehle gehen doch von tastertur zum rechner, wie kann das spiel das abfragen obwohl das prog im hintergrund läuft o.O
ps. spiel is von 2001

Sobald ich auf den desktop wechselte ging es wieder, minimierte ich das programm ebenfalls und tippte einfach mal just4fun so gings auch noch nur wurde das spiel wieder maximiert - ging es wieder nicht.

*amkopfkratz*


#edit#
hab gerade mal ein anderes spiel getestet, da funktionierte es.
Scheint also am spiel zu liegen, vielleicht weils an ein anderen ort abfragt wodurch das program ausgehebelt wird? : /
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 14.06.2011, 01:46    Titel: Antworten mit Zitat

DirectInput, nehme ich an. Das umgeht einige Umwege der WAPI, sodass die von SendInput verabreichten Daten gar nicht zum Zuge kommen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
creepi



Anmeldungsdatum: 13.06.2010
Beiträge: 59

BeitragVerfasst am: 14.06.2011, 02:14    Titel: Antworten mit Zitat

verdammt - . -
Dennnoch ein dank an alle beteiligten die sich mein problem annahmen : )
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