Laden...

p/Invoke SendInput

Erstellt von IMGregor vor 19 Jahren Letzter Beitrag vor 19 Jahren 4.355 Views
IMGregor Themenstarter:in
84 Beiträge seit 2004
vor 19 Jahren
p/Invoke SendInput

Hi

Ich habe einen eigenen kleinen VNC Client geschrieben. Jetzt versuche ich CTRL-ALT-DEL an diesen Rechner zu senden um ihn remote entsperren zu können.
Ich habe bereits zwei Lösungsansätze:
KeysSend.Send("blabla");
Allerdings krieg ich es nicht hin hier ein CTRL-ALT-DELETE abzusetzen...
%{F4} funktioniert z.B. Wobei % für ALT steht..
CTRL-ALT-DELETE funtzt aber nicht.. Ich weiss auch nicht ob das die Lösung ist.

Zweite Lösung wäre p/invoke SendInput API...
Aber damit habe ich keine Erfahrung.. Man soll sie ungefähr so (siehe unten)einbinden. Ich werde aus dem Code aber noch nicht ganz schlau. Kann mir das jemand erklären und wie binde ich CTRL-ALT-DELETE daran??

Gruß
[DllImport("User32.dll", SetLastError=true)]

   public static extern int SendInput(int nInputs, ref INPUT pInputs, int cbSize);  



   public struct INPUT   

   {   

          public int type;   

          public MOUSEINPUT mi;   

   }  



   public struct MOUSEINPUT   

   {  

          public int dx;  

          public int dy;  

          public int mouseData;  

          public int dwFlags;  

          public int time;  

          public int dwExtraInfo;  

   }  

   // Call the API  

   int resSendInput;  

   resSendInput = SendInput(1, ref input, Marshal.SizeOf(input));  

   if (resSendInput == 0 || Marshal.GetLastWin32Error() != 0)  

          System.Diagnostics.Debug.WriteLine(Marshal.GetLastWin32Error());
49.485 Beiträge seit 2005
vor 19 Jahren

Hallo IMGregor,

mit


[DllImport("User32.dll", SetLastError=true)]
public static extern int SendInput(int nInputs, ref INPUT pInputs, int cbSize);

erhältst du Zugriff auf die Win32-Funktion SendInput und zwar so, als hätte der Compiler für die obigen zwei Zeilen das folgende eingesetzt:


public static int SendInput(int nInputs, ref INPUT pInputs, int cbSize)
{
   // Aufruf der gleichnamigen Win32-Funktion
}

Du kannst SendInput also wie jede andere normale static-Methode der Klasse, in der die Deklaration steht, aufrufen.

Die zugehörige Win32-Funktion ist hier beschrieben:

http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputfunctions/sendinput.asp?frame=true

Dort kannst du also auch sehen, was die einzelen Paramter bedeuten.

HTH

herbivore

PS: Axo, die public-struct-Zeilen sind dafür da, die Win32-C-Strukturen nachzubauen, die man als Parameter beim Aufruf (und evtl. der Rückgabe) braucht.

IMGregor Themenstarter:in
84 Beiträge seit 2004
vor 19 Jahren
p/Invoke SendInput

Moin

Danke für deine Antwort.. So ähnlich hatte ich mir das auch vorgestellt.
Was mich etwas verwirrt ist wie ich nun damit arbeiten kann...
Wie übergebe ich denn hier die Tastatur Befehle?? Das ist eigentlich
das was mir Sorgen bereitet...

thx

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo IMGregor,

Wenn Du Tastatureingaben senden willst, dann musst du die Deklaration von struct INPUT erstmal abändern:


public struct INPUT
{
   public int type;
   public KEYBDINPUT  ki;
}

Das ergibt sich aus http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputstructures/input.asp?frame=true wo u.a. zu lesen steht:


typedef struct tagINPUT { 
  DWORD type; 
  union {MOUSEINPUT mi; 
            KEYBDINPUT ki;
            HARDWAREINPUT hi;
           };
  }INPUT, *PINPUT;

Dann musst du die Win32-KEYBDINPUT-Struktur nachbilden, zu sehen unter http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputstructures/keybdinput.asp :


typedef struct tagKEYBDINPUT {
    WORD wVk;
    WORD wScan;
    DWORD dwFlags;
    DWORD time;
    ULONG_PTR dwExtraInfo;
} KEYBDINPUT, *PKEYBDINPUT;

Alles weitere sollte sich daraus ergeben oder den verlinkten MSDN-Seiten entnehmen zu sein.

HTH

herbivore

_
416 Beiträge seit 2005
vor 19 Jahren

Hi,

ich will dich ja nicht ganz entmutigen, aber ich glaub selbst mit SendInput bekommst du das nicht hin, denn Crtl-Alt-Del wird auf niedrigerer Ebene vom Betriebssystem behandelt, als wie du via SendInput Events erzeugen kannst.

(Zumindest les ich das hier so raus)

Ich habs auch mal selbst ausprobiert und solche Sachen wie Alt-Tab oder Win-Taste funktionieren einwandfrei, nur halt kein Crtl-Alt-Del.

Aber da du den Rechner ja nur entsperren willst, gibs da sicher auch noch andere Möglichkeiten.

IMGregor Themenstarter:in
84 Beiträge seit 2004
vor 19 Jahren
Idee?

Moin

Hast du vielleicht eine Idee wie man einen Remote Rechner entsperren kann??

thx

4.506 Beiträge seit 2004
vor 19 Jahren

Hallo Gregor!

Vielleicht schaust Du mal bei VNC (freeware remote desktop programm) mit einem Sniffer oder ähnlichem, wenn Du hier Ctr-Alt-Del sendest.

Dann kannst Du doch das mitgesniffte einfach übernehmen, oder irre ich mich da?

Vielleicht hilft dir das weiter?

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

IMGregor Themenstarter:in
84 Beiträge seit 2004
vor 19 Jahren
Genau darum..

geht es.. Ich habe einen eigen VNC Client geschrieben und brauche jetzt diese Funktion in C#. Es gibt in der user32.dll eine Funktion die LockWorkStation heißt. Diese macht genau das Gegenteil von dem was ich brauche..
Gibt es in der user32.dll eine umgekehrte Funktion?
Die Information aus VNC direkt auszulesen ist natürlich auch nicht dumm? Wie genau kann ich das machen???

Thx