# SendInput()?



## Nizomi (24. August 2005)

Hi,

ich finde kaum etwas zur SendInput Funktion...
habe zwar mal probiert es selbst zu machen(was dann natürlich in ner flutwelle von fehlermeldungen endete) aber nuja
ich möchte der im moment aktiven applikation sagen das die taste h gedrückt wurde

ich find auch kaum source wo sendinput verwendet wird so das ich mir diesen ansehen und daraus lernen könnte
also wie verwende ich sendinput ( am besten wäre mit source beispiel)


----------



## jokey2 (24. August 2005)

Das sollte eigentlich so gehen:

```
INPUT InputData;
  int iEvents;
  
  
  InputData.type = INPUT_KEYBOARD;
  InputData.ki.wVk = VK_H;
  InputData.ki.wScan = 35;
  InputData.ki.dwFlags = 0;
  InputData.ki.time = time(NULL);
  InputData.ki.dwExtraInfo = 0;
  
  
  iEvents = SendInput(1, &InputData, sizeof(InputData)):
```
Aber wenn Du uns sagst, was Du schon gemacht hast und welche Fehler wo auftreten und auch, welchen Compiler Du verwendest, dann können wir Dir evtl. besser helfen.
 Und bitte beachte die Groß/Kleinschreibung!


----------



## Nizomi (25. August 2005)

Ach,

in den meisten Foren wird nich so auf Groß-/Kleinschreibung geachtet ^^
Ich benutze Code::Blocks IDE mit Microsoft Visual C++ Toolkit 2003 und Microsoft Platform SDK.


```
#include <windows.h>
bool done;
INPUT haction[2];
haction[0].type=INPUT_KEYBOARD;
haction[0].ki.wVk=VK_H;
haction[0].ki.wScan=35;
haction[0].ki.dwFlags=0;
haction[0].ki.time=time(NULL);
haction[0].ki.dwExtraInfo=0;
haction[1].type=INPUT_KEYBOARD;
haction[1].ki.wVk=VK_H;
haction[1].ki.wScan=35;
haction[1].ki.dwFlags=KEYEVENTF_KEYUP;
haction[1].ki.time=time(NULL);
haction[1].ki.dwExtraInfo=0;
```
Line 3              error C2146: syntax error : missing ';' before identifier 'haction'
Line 3              error C2501: 'INPUT' : missing storage-class or type specifiers
Line 3              error C2501: 'haction' : missing storage-class or type specifiers
Line 4              error C2466: cannot allocate an array of constant size 0
Und dann noch einige Folgefehler weil die Initialisierung nich geklappt hat...


----------



## jokey2 (25. August 2005)

Da ist der Fall ziemlich klar: Die Struktur INPUT ist nicht bekannt.
Warum das allerdings so ist, ist mir auch nicht ganz klar. INPUT ist in winuser.h deklariert, die in der windows.h eingebunden wird (Zeile 166). Allerdings muß dafür 'RC_INVOKED' definiert sein und 'NOWINRES' darf nicht definiert sein. Wenn er INPUT nicht kennt, dann kennt er aber auch SentInput nicht, da das gleich darunter in der Winuser.h deklariert ist.
Die Funktion selber ist in der user32.lib.
Es könnte funktionieren, wenn Du die Struktur und den Funktionskopf selber deklarierst, das könnte aber auch andere Probleme verursachen. Möglicherweise kannst Du das Gleiche ja mit keybd_event erreichen. Das ist zwar auch in der Winuser.h, aber braucht evtl. andere Defines.


----------



## Nizomi (25. August 2005)

Hmm ja aber bei 

```
keybd_event(48,0,0,0);
keybd_event(48,KEYEVENTF_KEYUP,0,0);
```

kommt nur 00 raus ^^
bei Microsoft's MSDN steht aber 48 ist der Virtual Scancode für H


----------



## Tobias K. (25. August 2005)

moin




> bei Microsoft's MSDN steht aber 48 ist der Virtual Scancode für H


Falsch, in der MSDN steht das 0x48 (also hexadezimal) für H steht.
Dezimal isses die 72.


mfg
umbrasaxum


----------



## Nizomi (25. August 2005)

welches MSDN? o_o
bVk
    [in] Specifies a virtual-key code. The code must be a value in the range 1 to 254. For a complete list, see Virtual-Key Codes.

mitn Link darauf
http://msdn.microsoft.com/library/d...wsUserInterface/UserInput/VirtualKeyCodes.asp


----------



## Tobias K. (25. August 2005)

moin


Nochmal:
Die Angaben dort sind hexadezimal!
Scroll mal ein bischen runter, da kommt z.B. eine 4D und da wirst du jawohl einsehen müssen das das nicht dezimal ist.


mfg
umbrasaxum


----------



## jokey2 (25. August 2005)

1. Laut MSDN hat keybd_event keinen Rückgabewert.
 2.Es gibt einen 'virtual key code', der ist 'VK_H', und es gibt einen Scancode, der ist 35. das sind zwei unterschiedliche Dinge:


> *virtual key code
> *A device-independent value that identifies the purpose of a keystroke as interpreted by the Windows keyboard device driver.





> *scan code
> *A device-dependent value that identifies a physical key on the keyboard. Each key on a keyboard generates two unique scan codes--one when the user presses the key and the other when the user releases the key.


 Du könntest allerdings auch eine WM_KEYDOWN-Message an das Fenster schicken (mit SendMessage oder PostMessage). das Fensterhandle, das Du dafür benötigst, kannst Du mit FindWindow erhalten.


----------



## Nizomi (25. August 2005)

Achso k mein Fehler ^^
Danke für die Hilfe es geht jetzt
würde mich aber trotzdem interessieren warum das die INPUT structure nicht gefunden hat.


----------



## Tobias K. (25. August 2005)

moin


Ich glaub die INPUT Struktur gibts nicht mehr, bin mir aber nicht ganz sicher.


mfg
umbrasaxum


----------



## Nizomi (25. August 2005)

Wie NICHT mehr?
Die neuere SendInput Funktion benutzt eine Struktur die nichtmehr existiert? 
Nagut bei Microsoft weiß man nie...


----------



## Tobias K. (25. August 2005)

moin


So, hab jetzt Deine Arbeit mal erledigt:

```
#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <time.h>


int main()
{
	INPUT InputData;
	int iEvents;

	InputData.type = INPUT_KEYBOARD;
	InputData.ki.wVk = 0x48;
	InputData.ki.wScan = 35;
	InputData.ki.dwFlags = 0;
	InputData.ki.time = time(NULL);
	InputData.ki.dwExtraInfo = 0;

	iEvents = SendInput(1, &InputData, sizeof(InputData));

	return 0;
}
```
Man muss irgendwie ne Version >4.0 benutzen. UNd das wird über das #define am Anfang angegeben.


mfg
umbrasaxum


----------



## Nizomi (25. August 2005)

Ah k Danke
Wie kommst du auf 35 und die 0x48?
Aber als Array will das nich, oder mach ich was falsch?


```
#define _WIN32_WINNT 0x0500
#include <Windows.h>
#include <stdlib.h>
#include <time.h>
INPUT haction[1];
haction[0].type=INPUT_KEYBOARD;
haction[0].ki.wVk=0x48;
haction[0].ki.wScan=35;
haction[0].ki.dwFlags=0;
haction[0].ki.time=time(NULL);
haction[0].ki.dwExtraInfo=0;
haction[1].type=INPUT_KEYBOARD;
haction[1].ki.wVk=0x48;
haction[1].ki.wScan=35;
haction[1].ki.dwFlags=KEYEVENTF_KEYUP;
haction[1].ki.time=time(NULL);
haction[1].ki.dwExtraInfo=0;
```
und ohne array also so wie dein Beispiel hat er auch was zu melden:
error C2143: syntax error: missing ';' before '.'
error C2501: 'InputData' : missing storage-class or type specifiers
error C2371: 'InputData' : redefinition; different basic types
und das für jedes Feld welches gesetzt wird x-x


----------



## deepthroat (25. August 2005)

Hi.

Arrays in C/C++ sind 0 indiziert und haben genau so viele Elemente wie bei der Deklaration angegeben. Wenn du schreibst:
	
	
	



```
INPUT haction[1];
```
dann hat das Array haction genau 1  Element nämlich haction[0]. Du greifst aber noch auf haction[1] zu, welches es eigentlich gar nicht gibt.

Dann findet er bei dir anscheinend die INPUT Struktur immer noch nicht.


----------



## jokey2 (25. August 2005)

In welchen Dateien treten denn diese Fehler auf? In Deinem Code sehe ich nämlich kein 'InputData'.


----------



## Nizomi (25. August 2005)

In der einzigen Datei die ich habe
main.cpp o.o


----------



## deepthroat (25. August 2005)

Ich gehe davon aus, das du den Code von Tobias haargenau abgeschrieben (bzw. kopiert und eingefügt) hast, ja? Wenn nicht, dann poste doch mal bitte deinen kompletten Code (wenn's nicht gerade 500k sind ).


----------



## Tobias K. (25. August 2005)

moin


Mal eben zu meinem Code:
Ich habe nicht getestet ob er funktioniert! Ich wollte nur zeigen wie man "INPUT" benutzen kann.


mfg
umbrasaxum


----------



## Nizomi (25. August 2005)

Ja gut aber trotzdem würde ich gerne wissen warum das bei mir nich will wie es soll. ^^
Hmm werd ich wohl doch beim keybd_event bleibn müssn


----------

