Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Tastatur sperren

5 views
Skip to first unread message

Matthias Meier

unread,
Jun 21, 2007, 8:27:36 AM6/21/07
to
Hallo zusammen,

ich habe eine Appliaktion die statt des Win-Explorers auf einem
Rechner läuft. Der Benutzersoll nur die Möglichkeit haben die Maus zu
benutzen und sich möglicherweise abzumelden. Ich weiß, nicht
Benutzerfreundlich, aber es soll ein System für Schüler sein, die nun
mal nichts anderes machen dürfen.
Geht das irgendwie einfach, alle Tastaturevents (v.a. Alt-F4 und
sonstige Eingaben, da es kein Eingabefeld gibt und dies nur zu
nervigen Bing-Tönen führt) wegzunehmen bis auf abmelden?
Evtl. über WM_CHAR, aber wie lasse ich da Strg-Alt-Entf zu?

Viele Grüße,

Matthias

Juergen Thuemmler

unread,
Jun 21, 2007, 11:47:30 AM6/21/07
to
> Geht das irgendwie einfach, alle Tastaturevents (v.a. Alt-F4 und
> sonstige Eingaben, da es kein Eingabefeld gibt und dies nur zu
> nervigen Bing-Tönen führt) wegzunehmen bis auf abmelden?
> Evtl. über WM_CHAR, aber wie lasse ich da Strg-Alt-Entf zu?

Entweder per DLL einen systemweiten WH_KEYBOARD-Keyboardhook setzen und in
der Hook-Funktion 1 zurückgeben oder ohne DLL einen LowLevel-Hook
WH_KEYBOARD_LL verwenden. Beim ersteren gehen alle Tastaturereignisse außer
den Systentasten (Alt+Tab, Windows-Taste, Affengriff, ...) ins Leere, beim
letzteren alle außer Affengriff.
Notfalls kannst Du in der Hook-Funktion auch noch filtern, was sonst noch
durchgelassen werden soll...

Jürgen.


Andreas Heyer

unread,
Jun 21, 2007, 12:10:23 PM6/21/07
to
"Juergen Thuemmler" <th...@removethisgmx.de> wrote:
> beim letzteren alle außer Affengriff.

Mhm, wenn der Explorer auf einem Desktop nicht läuft, geht nicht mal
mehr der Affengriff!
Ich habe nämlich mal spasseshalber mit CreateDesktop mir einen zweiten
Desk gebaut und darauf umgeschaltet. Auf dem jungfräulichen Desktop
läuft *NICHTS*, und da der Affengriff nicht funktioniert (zumindest habe
ich fremde Hooks nicht erlaubt), kann man nicht mal über den Taskmanager
eine Shell aufrufen. Es half nur, Windows-L unter XP zum Abmelden, um
aus dem Dilemma wieder raus zu kommen. :-)

Mein Tipp also: Eigenen Desktop kreieren, dort das Programm starten
(Desk bei CreateProcess angeben!) und evtl. noch den Hook gegen
Windows-L anbringen.

MfG
Andreas

PS: Der Explorer ist aber auch wirklich untauglich! Das dämliche Ding
kann nicht mal mehrere Desktops verwalten, man sieht immer die gleichen
Desktopicons im Listctrl. Und Windows an sich kann auch nur *1*
Wallpaper für alle Desktops gleichzeitig setzen.

SvenC

unread,
Jun 21, 2007, 12:26:19 PM6/21/07
to
Hi Andreas,

> "Juergen Thuemmler" <th...@removethisgmx.de> wrote:
>> beim letzteren alle außer Affengriff.
>
> Mhm, wenn der Explorer auf einem Desktop nicht läuft, geht nicht mal
> mehr der Affengriff!

Das stimmt so nicht: schieß den Explorer doch einfach mal per Task-Manager
ab und siehe, dass der "Affengriff" immer noch funktioniert. Die Kombination
ist wohl doch etwas tiefer im System angelegt, sonst wäre das auch zu leicht
zu hacken.

--
SvenC

Andreas Heyer

unread,
Jun 21, 2007, 12:38:22 PM6/21/07
to
"SvenC" <Sv...@community.nospam> wrote:
> Das stimmt so nicht: schieß den Explorer doch einfach mal per
> Task-Manager ab und siehe, dass der "Affengriff" immer noch
> funktioniert. Die Kombination ist wohl doch etwas tiefer im System
> angelegt, sonst wäre das auch zu leicht zu hacken.

Ok, ich habe mich falsch ausgedrückt bzw. falsch in Erinnerung gehabt.
Der Griff geht wohl, aber der Taskmanager zeigt sich nur auf dem Desktop
"Default", d.h. man erhält keinen Zugriff. Auch für den Explorer
(Windows-E) gilt das. Im Endeffekt hat man damit den Benutzerzugriff
effektiv eingeschränkt. :-)

MfG
Andreas

SvenC

unread,
Jun 21, 2007, 12:50:36 PM6/21/07
to

Ahh, verstehe. Hübscher Aussperr-Effekt ;-)

Andreas Heyer

unread,
Jun 21, 2007, 1:20:50 PM6/21/07
to
Für alle, die einen kleinen Desktopswitcher gebrauchen können, hier mein
Code. Beispielanwendung:
deskmgr /c MyDesk C:\Windows\System32\notepad.exe
deskmgr /s MyDesk

Aber Vorsicht, wenn der Befehl beim Erstellen des Desktops fehl schlägt,
steht ihr ohne Möglichkeit, ein Programm zu starten, da. Nur der Logout
unter XP mit Windows-L funktioniert. Im Notepad könnt ihr dann z.B. über
den Öffnen-Befehl eine Shell (cmd.exe, explorer) starten. Leider gibt es
Probleme, wenn man bei der /c-Option direkt cmd.exe angibt.

#include <windows.h>
#include <string>
#include <iostream>


void DisplayUsage(const char* AppName)
{
std::cout<<"Usage:\n"<<AppName<<" [/d] [/c DesktopName Command] [/s
DesktopName]"<<std::endl;
std::cout<<"Options:"<<std::endl;
std::cout<<" /d\t\t\t-- Displays all available desktops inside your
window station"<<std::endl;
std::cout<<" /c DesktopName Command\t-- Creates a new desktop
\"DesktopName\" and executes \"Command\" on creation"<<std::endl;
std::cout<<" /s DesktopName\t\t-- Switch to desktop
\"DesktopName\""<<std::endl;
}

BOOL CALLBACK EnumProc(LPTSTR lpszDesktop,LPARAM lParam)
{
std::cout<<lpszDesktop<<std::endl;
return TRUE;
}

int main(int argc,char* argv[])
{
if(1 == argc)
DisplayUsage(argv[0]);

for(int i=1;i<argc;i++)
{
std::string param=argv[i];

//Enum desktops
if(param == "/d")
{
EnumDesktops(GetProcessWindowStation(),EnumProc,NULL);
continue;
}

//Create new desktop, next 2 parameters are name of new desktop and
command to execute
if(param == "/c")
{
if(2 > (argc-1-i))
{
std::cout<<"Parameter is missing, can not create new
desktop."<<std::endl;
return 1;
}
else
{
HDESK hNew=OpenDesktop(argv[++i],NULL,FALSE,GENERIC_READ);
if(NULL != hNew)
{
CloseDesktop(hNew);
continue;
}
else
{
hNew=CreateDesktop(argv[i],NULL,NULL,DF_ALLOWOTHERACCOUNTHOOK,GENERIC_ALL,NULL);
if(NULL == hNew)
{
std::cout<<"Invalid desktop name, can not create new
desktop."<<std::endl;
return 1;
}

HDESK hOld=GetThreadDesktop(GetCurrentThreadId());
SetThreadDesktop(hNew);

//Start up command
PROCESS_INFORMATION pi={NULL};
STARTUPINFO si={NULL};
si.cb=sizeof(STARTUPINFO);
si.lpDesktop=argv[i]; //Name of new desk

if(0 ==
CreateProcess(argv[++i],NULL,NULL,NULL,NULL,NULL,NULL,NULL,&si,&pi))
{
std::cout<<"Failed to execute command. Error code:
"<<GetLastError()<<std::endl;
}

CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);

Sleep(2000);
SetThreadDesktop(hOld);
CloseDesktop(hNew);
}
}

continue;
}

//Switch desktop
if(param == "/s")
{
if(1 > (argc-1-i))
{
std::cout<<"Desktop name is missing, can not switch."<<std::endl;
return 1;
}

HDESK hDesk=OpenDesktop(argv[++i],NULL,FALSE,DESKTOP_SWITCHDESKTOP);
if(NULL == hDesk)
{
std::cout<<"Invalid desktop name, can not switch."<<std::endl;
return 1;
}
SwitchDesktop(hDesk);
CloseDesktop(hDesk);

continue;
}

//Default
DisplayUsage(argv[0]);
return 1;
}

return 0;
}

Karsten Schulz

unread,
Jun 22, 2007, 3:39:39 AM6/22/07
to
Hi Matthias,

Du kannst auch die Hotkey sperren zb WindowsTaste oder Affengriff

RegisterHotKey(m_hWnd,100,MOD_ALT, VK_TAB);

man könnte auch die usb leitung mit einem reedrelay unterbrechen LOL
ansonnsten deutet das jetzt auf ein designproblem hin *g*

grüße Karsten
Schulz


Hans-J. Ude

unread,
Jun 22, 2007, 8:39:55 AM6/22/07
to
"Karsten Schulz" <kahn...@freenet.de> schrieb:

>Hi Matthias,
>
>Du kannst auch die Hotkey sperren zb WindowsTaste oder Affengriff
>
>RegisterHotKey(m_hWnd,100,MOD_ALT, VK_TAB);

IMHO kannst du den Affengriff nicht blocken oder verbiegen, auch nicht
mit Hooks. Der geht glaube ich am Tastaturtreiber vorbei, direkt ins
Rückenmark. Wenn's doch geht, dann wüsste ich auch gerne wie.

Hajü

Juergen Thuemmler

unread,
Jun 22, 2007, 9:45:41 AM6/22/07
to

> IMHO kannst du den Affengriff nicht blocken oder verbiegen, auch nicht
> mit Hooks.

Indirekt schon: Einen systemweiten Shell-Hook installieren
(HSHELL_WINDOWCREATED auswerten) und beim Erscheinen des
Taskmanager-Fensters diesem ein freundliches WM_CLOSE schicken...

Jürgen.


0 new messages