Maus und tastatur sperren
-
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.
-
Naja, mir egal. Bei mir funktioniert's!
-
und ich wollte schon Microsoft bitten, die MSDN-Lib zu korrigieren
MfG
-
hmm nunja seltsam, bei mir gehts auch nich!!!....könnte das vielleicht an irgendwelchen diensten liegen, oder anderen umgebungsunterschieden.....könnte das mal wer nachprüfen...oder so?!! thx
-
wenn mas in ne while schleife setzt bringt auch kein strg + alt + entf was