Hallo,
ich möchte unter Verwendung der user32.dll die Maus und die Tastatur blockieren. Hierzu gibt es in der user32.dll die Funktion >>BlockInput
Hallo,
ich möchte unter Verwendung der user32.dll die Maus und die Tastatur blockieren. Hierzu gibt es in der user32.dll die Funktion >>BlockInput
Hallo Christoph,
a) BlockInput() wurde in Win NT SP irgendwas einmal versuchsweise eingeführt. Wirklich vorhanden ist es eit Win98 und W2k.
b) Der genaue Wortlaut der Fehlermeldung würde wirklich weiter helfen !!! Genau dazu sind Fehlermeldungen ja da, raten macht irgendwie keinen Spass !
c) Wieso machst du den Aufruf so kompliziert? Gibt es einen Grund für die dynamische Bindung???
Ansonsten:
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv^
#include
.
.
.
bool ret;
ret = blockInput( TRUE );
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Programmiertechnisch habe ich das unter C++ wiefolgt gelöst:
______________________________________________________________________typedef bool (*ImportBlockInput) (bool); //Prototyp user32.dll
BlockInputHINSTANCE dll = LoadLibrary( „user32.dll“ ); //User32.dll
ladenif( dll == NULL ) //DLL nicht gefunden
exit(1);ImportBlockInput blockInput = (ImportBlockInput)
GetProcAddress( dll, „BlockInput“ ); //Adresse der Funktion
BlockInput holenif( blockInput == NULL ) //Funktion nicht gefunden
exit(2);bool ret = blockInput( true ); //Funktion aufrufen
müsste hier nicht:
ret = blockInput( TRUE );
stehen ???
if( ret == false ) //Tastatur und Maus sind bereits geblockt
exit(3);FreeLibrary( dll ); //DLL entladen
exit(0);
______________________________________________________________________
MfG Peter(TOO)
Hallo Peter.
auf deine Art, also mit der Funktion BlockInput( true ), habe ich es auch schon versucht. Allerdings hat das keinen Effekt auf die Tastatur und/oder die Maus. Sie funktionieren nach wie vor noch.
Aus diesem Grund wollte ich die Funktion einfach direkt in der DLL ausführen. Wie ich bereits anfangs geschrieben habe, funktioniert dies bis auf die Fehlermeldung auch einwandfrei. Nach Aufruf der Funktion blockInput ist die Tastatur und die Maus gesperrt.
Folgende Fehlermeldung verursacht jedoch der Funktionsaufruf:
______________________________________________________________________
Debug Error!
Program: …en\Visual Studio Projects\WinApi Test\Debug\WinApi Test.exe
Module: …en\Visual Studio Projects\WinApi Test\Debug\WinApi Test.exe
File: …en\Visual Studio Projects\WinApi Test\main.cpp
Line: 20
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
______________________________________________________________________
Mit anderen Worten, mein Funktionspointer unterscheidet sich mit dem Prototyp der Funktion BlockInput welche sich in der DLL befindet.
Ich habe meinen Funktionpointer wie folgt deklariert:
______________________________________________________________________
typedef bool (*ImportBlockInput) (bool); //Prototyp user32.dll BlockInput
______________________________________________________________________
Vielleich kannst du mir ja den korrekten Prototyp sagen.
Gruß
Christoph
Hallo Christoph,
a) BlockInput() wurde in Win NT SP irgendwas einmal
versuchsweise eingeführt. Wirklich vorhanden ist es eit Win98
und W2k.b) Der genaue Wortlaut der Fehlermeldung würde wirklich weiter
helfen !!! Genau dazu sind Fehlermeldungen ja da, raten macht
irgendwie keinen Spass !c) Wieso machst du den Aufruf so kompliziert? Gibt es einen
Grund für die dynamische Bindung???
Ansonsten:vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv^
#include
.
.
.
bool ret;
ret = blockInput( TRUE );^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
MfG Peter(TOO)
Hallo Christoph,
auf deine Art, also mit der Funktion BlockInput( true ), habe
ich es auch schon versucht. Allerdings hat das keinen Effekt
auf die Tastatur und/oder die Maus. Sie funktionieren nach wie
vor noch.
Dann geht da schon etwas schief …
Vielleich kannst du mir ja den korrekten Prototyp sagen.
Vielleicht schreibst du mal, welchen Compiler und welches BS du gerade benutzt ?
Mir fällt gerade noch auf:
C ist Casesensitiv also Gross- oder Kleinschreibung macht einen Unterschied. Du schreibst „bool“ und „true“ wo eigentlich „BOOL“ und „TRUE“ stehen sollte …
Ansonsten:
http://msdn.microsoft.com/library/default.asp?url=/l…
MfG Peter(TOO)
P.S. schreib mal etwas in deine ViKa !
Hallo Peter,
BOOL ret = BlockInput( TRUE );
cout [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Hallo Peter,
habe den Fehler jetzt gefunden. Und zwar funktionierte der Code bisweilen nicht, weil der Thread (also hier das eigentliche Programm) immer kurz danach beendet wurde. Der Block funktioniert nämlich nur so lange, wie der Thread noch ausgeführt wird.
#include
#include
#include
#include
typedef BOOL (*ImportBlockInput) (BOOL); //Prototyp user32.dll BlockInput
int main( void ) {
BOOL ret = BlockInput( TRUE );
cout
Hallo Christoph,
Jetzt wäre nur noch interessant zu wissen, wieso das mit der
dynamischen Bindung nicht funktioniert.
Mach mal das getch() vor dem FreeLibrary().
MfG Peter(TOO)
Das bringt nichts, habe ich bereits probiert. Der Fehler liegt sehr wahrscheinlich daran, dass ich den falschen Prototyp verwende. Also dass in der DLL die Funktion anders angesteuert werden muss.
Gruß
Christoph
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Hallo Christoph,
Das bringt nichts, habe ich bereits probiert. Der Fehler liegt
sehr wahrscheinlich daran, dass ich den falschen Prototyp
verwende. Also dass in der DLL die Funktion anders angesteuert
werden muss.
Jetzt habe ich gesehen was du falsch machst.
Du schreibst in C++ , BlockINput() ist aber in C geschrieben. Bei C++ wird als erstes noch ein zusätzlicher Pointer (This-Pointer) übergeben.
Schau dir doch einmal die Definition in „winable.h“ an, bzw. binde mit ein, anstelle deines eigenen Prototyps.
Du musst in deiner eigenenen den Prototyp als „C“ declarieren.
MfG Peter(TOO)