Maus und tastatur sperren
-
hallo,
ich habe mal ne Frage. ich würde gerne wissen wie man die Maus und Tastatur in C++ sperrt und wieder freigibt.
Es soll auch möglich sein mit einen Server die anderen Rechner im Netzwerk zu steuern und deren Tastaturen und Mäuse zu sperren und evtl. zu entsperren.
würde mich auf eine antwort freuen ...danke
-
Für welches Betriebsystem denn? Mit standard C++ kannste IMHO nur innerhalb des Programmes ganz einfach "nicht auf die Tastatur reagieren" aber ausserhalb des Programmes läuft alles weiter wie gehabt.
-
es sollte für windows 98, 2000 und evtl. xp funktionieren.
-
Du könntest versuchen mit SetWindowsHookEx einen systemweiten Hook einzurichten und dort dann die entsprechenden Nachrichten abzufangen oder weiterzuleiten - ob das so funktioniert weiß ich allerdings nicht
-
Oneill84 schrieb:
hallo,
ich habe mal ne Frage. ich würde gerne wissen wie man die Maus und Tastatur in C++ sperrt und wieder freigibt.
Es soll auch möglich sein mit einen Server die anderen Rechner im Netzwerk zu steuern und deren Tastaturen und Mäuse zu sperren und evtl. zu entsperren.
würde mich auf eine antwort freuen ...dankeUnd was soll das ganze bitte sehr?
-
?? wie bist du denn drauf Luckie? das war ne ganz normale Frage? Werd mal erwachsen.
-
Sorry, ich bin erwachesn und gerade deshalb frage ich mich, was das soll. Du findest es wohl auch nicht so toll mit einer plötzlich einrastenden Lenkradsperre mit 180 Sachen über die Autobahn zu donnern. Und wie gesagt, ich kann mir keine sinnvolle gelegnheit vorstellen bei der es nötig wäre dem Benutzer seinem PC komplett zu sperren.
-
ok dann erzähle ich es dir. Ich muss am Ende meiner Ausbildung eine Projektarbeit schreiben, und dahe ich in einen Internet-Cafe Praktikum mache, möchte mein Chef so ein Programm was die verschiedenen Rechner im Cafe über den Server steuern lässt. Verstehst du mich nun?
Währe schön wenn jemand ne Ahnung davon hat und mir dabei weiterhelfen könnte.
-
Unter win9x könntest du es mal mit SystemParametersInfo und SPI_SETSCREENSAVERRUNNING versuchen - bei win2k/xp hilft dir evtl. LockWorkStation weiter (allerdings hast du hier evtl. das Problem, dass du nicht remote die Sperrung wieder aufheben kannst) Wenn du viel Aufwand betreiben willst kannst du es hier mit einer eigenen GINA versuchen - hier ist aber Vorsicht angesagt
-
Nein, das geht auch anders.
Bei uns in der Firma wird ein Software-Verteil-Tool eingesetzt (ON Technology), welches beim Systemstart prüft, ob Software zur Installation ansteht. Dies Tool sperrt bei der Installation von Software auf einem Client-Rechner auch Maus und Tastatur. Dies ist (unter Eingabe einer gewissen Tastenkombination) wieder lösbar, falls man manuell eingreifen muß (Installation läuft in Fehler usw.)
Ich würde auf Keyboard/MausHooks tippen...
-
Hepi schrieb:
Ich würde auf Keyboard/MausHooks tippen...
Das war ja auch mein erster Gedanke / Vorschlag
-
BlockInput.
-
Luckie schrieb:
BlockInput.
Damit hab ich jetzt ein bisschen rumprobiert. Nach unzähligen Tests hab ich's dann doch noch hinbekommen. Folgendes Programm läuft bei mir unter WinXP wunderbar:
#include <windows.h> //--------------------------------------------------------------------------- // Global Variables LPCTSTR g_lpszAppTitle = TEXT("InputBlocker"); LPCTSTR g_lpszAppClass = TEXT("InputBlockerClass"); HINSTANCE g_hInstance; HWND g_hAppWindow; //--------------------------------------------------------------------------- // Function Prototypes VOID RegisterAppWindow(); VOID Create_GUI_Interface(); LRESULT CALLBACK AppWndProc(HWND, UINT, WPARAM, LPARAM); BOOL My_BlockInput(BOOL bBlockIt); int ErrorMessage(LPCTSTR lpszErr); //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int) { MSG msg; g_hInstance = hInstance; RegisterAppWindow(); Create_GUI_Interface(); My_BlockInput(TRUE); // Message Loop while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam ; } //--------------------------------------------------------------------------- VOID RegisterAppWindow() { WNDCLASSEX wndclass; wndclass.cbSize = sizeof(WNDCLASSEX); wndclass.style = 0; wndclass.lpfnWndProc = AppWndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = g_hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = g_lpszAppClass; wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); RegisterClassEx(&wndclass); } //--------------------------------------------------------------------------- VOID Create_GUI_Interface() { LONG style, ex_style; // Create Application Window style = WS_VISIBLE|WS_MINIMIZEBOX|WS_SYSMENU; ex_style = WS_EX_TOPMOST; g_hAppWindow = CreateWindowEx(ex_style, g_lpszAppClass, g_lpszAppTitle, style, 100, 100, 300, 400, NULL, NULL, g_hInstance, NULL); } //--------------------------------------------------------------------------- LRESULT CALLBACK AppWndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { static RECT rc; switch(iMsg) { case WM_ACTIVATE: if( LOWORD(wParam) == WA_INACTIVE ) { HWND hNewActive = GetForegroundWindow(); if( IsWindow(hNewActive) ) { TCHAR lpszText[1024]; GetWindowText(hNewActive, lpszText, 1023); if( lstrcmp(lpszText, TEXT("Windows Task-Manager")) == 0 ) { My_BlockInput(TRUE); // Den Task-Manager hinter mein Fenster bringen und schließen SetWindowLong(hNewActive, GWL_EXSTYLE, GetWindowLong(hNewActive, GWL_EXSTYLE) & (~WS_EX_TOPMOST)); GetWindowRect(hNewActive, &rc); SetWindowPos(hNewActive, hwnd, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, SWP_SHOWWINDOW); SendMessage(hNewActive, WM_CLOSE, 0, 0); // Mein Fenster aktivieren und in den Vordergrund bringen GetWindowRect(hwnd, &rc); mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTDOWN, rc.left + 40, rc.top + 40, 0, 0); mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTUP, rc.left + 4, rc.top + 40, 0, 0); SetForegroundWindow(hwnd); } } } return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, iMsg, wParam, lParam); } //--------------------------------------------------------------------------- BOOL My_BlockInput(BOOL bBlockIt) { typedef BOOL (__stdcall *LPBI)(BOOL); HMODULE hLib = LoadLibrary( TEXT("User32.DLL") ); BOOL bRet; if(!hLib) { ErrorMessage("Cannot Load User32.dll"); return FALSE; } LPBI BlockInput = (LPBI)GetProcAddress(hLib, TEXT("BlockInput")); if(!BlockInput) { ErrorMessage("Cannot load \"BlockInput\" into memory"); FreeLibrary(hLib); return FALSE; } bRet = BlockInput(bBlockIt); FreeLibrary(hLib); return bRet; } //--------------------------------------------------------------------------- int ErrorMessage(LPCTSTR lpszErr) { return MessageBox(g_hAppWindow, lpszErr, TEXT("ERROR"), MB_OK|MB_ICONERROR); } //---------------------------------------------------------------------------
Ach ja, danach könnt ihr euren PC resetten.
-
hehe danke ich probiere das heut nachmittag gleich mal.
-
@WebFritzi, wozu das:
// Den Task-Manager hinter mein Fenster bringen und schließen
Einmal Strg+Alt+Entf und BlockInput ist wieder aufgehoben unter NT ff. Systemen zu mindest.
-
Luckie schrieb:
@WebFritzi, wozu das:
// Den Task-Manager hinter mein Fenster bringen und schließen
Einmal Strg+Alt+Entf und BlockInput ist wieder aufgehoben unter NT ff. Systemen zu mindest.
Liest du die Beiträge nicht richtig. Ich habe geschrieben, dass es bei mir unter WinXP wunderbar funzt. Du kannst es ja ausprobieren. Du hast keine Chance mehr, in den normalen Betrieb zu kommen. Den Computer kannst du dann neu starten.
-
The system will unblock input in the following cases:
- The thread that blocked input unexpectedly exits without calling BlockInput with fBlock set to FALSE. In this case, the system cleans up properly and re-enables input.
- Windows 95/98/Me: The system displays the Close Program/Fault dialog box. This can occur if the thread faults or if the user presses CTRL+ALT+DEL.
- Windows 2000/XP: The user presses CTRL+ALT+DEL or the system invokes the Hard System Error modal message box (for example, when a program faults or a device fails).
Dass sich dein XP da anders verhält ist allerdings merkwürdig
-
flenders schrieb:
Dass sich dein XP da anders verhält ist allerdings merkwürdig
Hast du das Programm mal ausprobiert? Ich bezweifle, dass es bei dir anders ist. Anstatt dass ihr hier eure oberschlauen Kommentare ablasst, probiert's doch einfach mal aus!
-
Also wenn ich Alt-Strg-Entf drücke komme ich wieder raus und kann Maus und Tastatur auch wieder weitgehend verwenden (z.B. diesen Beitrag schreiben), allerdings verhält sich das System anschließend manchmal etwas eigenartig (evtl. wegen fehlendem explizitem Aufruf von My_BlockInput(FALSE)
) - z.B. kann ich Programme nicht mehr über den Taskbar-Button aktivieren
Aber offensichtlich bietet diese Lösung noch keinen wirklichen
-
Aha. Das ist komisch. Bei funktioniert das Programm so wie es soll. Ich kann nichts mehr machen. Musste das System nach Probieren schon häufiger neu starten.
Vielleicht sagen noch andere hier, ob es bei ihnen funktioniert.