J'écris une application qui fonctionne comme un kiosque code> et devrait permettre à l'utilisateur de sortir de l'application. Dans Windows 7 code>, lorsqu'il appuie sur la touche Win kbd> ou Ctrl kbd> + alt kbd> + Supprimer kbd >, cela sort du programme. J'ai besoin de désactiver le Ctrl kbd> + alt kbd> + Supprimer la touche de combinaison kbd> et gagnant kbd> clé dans Windows 7 < / code> programmatiquement. p>
3 Réponses :
AFAIK, vous ne pouvez pas attraper la touche CTRL + ALT + Suppr X dans Win32. Il existe des moyens de contourner le problème si vous êtes prêt cependant. P>
J'ai essayé d'attraper le combo, ça n'a jamais travaillé ...
Appuyez sur alt kbd> + onglet kbd> passera de l'application, également. CTRL KBD> + ESC KBD> est un raccourci alternatif pour ouvrir le menu Démarrer. ALT KBD> + ESC KBD> retourne entre les applications exécutées. Il existe un certain nombre de séquences clés différentes qui peuvent faire cela; Une conséquence naturelle de Windows étant un système d'exploitation multitâche. Pour contourner cela, vous allez avoir à installer un crochet de clavier de bas niveau pouvant piéger ces touches de tâches. Le crochet surveillera l'une des séquences de clés communes utilisées pour changer de tâche. Chaque fois qu'il détecte une de ces séquences, elle ignorera l'entrée en ne le transmettant pas dans la chaîne de crochet. Paul Dilascia a écrit un article qui aborde cette question très question en septembre 2002 édition du magazine MSDN. La partie que vous vous souciez de démarre à peu près à mi-chemin de la page, mais je l'ai réimprimée ici pour plus de commodité et d'obtenir les plaisirs de la sélection de la syntaxe: P> taskkeyhook.h: p> ////////////////////////////////////////////////////////////////
// MSDN Magazine â September 2002
// If this code works, it was written by Paul DiLascia.
// If not, I don't know who wrote it.
// Compiles with Visual Studio 6.0 and Visual Studio .NET on Windows XP.
//
// This file implements the low-level keyboard hook that traps the task
// keys.
//
#define _WIN32_WINNT 0x0500 // for KBDLLHOOKSTRUCT
#include <afxwin.h> // MFC core and standard components
#define DLLEXPORT __declspec(dllexport)
//////////////////
// App (DLL) object
//
class CTaskKeyHookDll : public CWinApp {
public:
CTaskKeyHookDll() { }
~CTaskKeyHookDll() { }
} MyDll;
////////////////
// The section is SHARED among all instances of this DLL.
// A low-level keyboard hook is always a system-wide hook.
//
#pragma data_seg (".mydata")
HHOOK g_hHookKbdLL = NULL; // hook handle
BOOL g_bBeep = FALSE; // beep on illegal key
#pragma data_seg ()
#pragma comment(linker, "/SECTION:.mydata,RWS") // tell linker: make it
// shared
/////////////////
// Low-level keyboard hook:
// Trap task-switching keys by returning without passing along.
//
LRESULT CALLBACK MyTaskKeyHookLL(int nCode, WPARAM wp, LPARAM lp)
{
KBDLLHOOKSTRUCT *pkh = (KBDLLHOOKSTRUCT *) lp;
if (nCode==HC_ACTION) {
BOOL bCtrlKeyDown =
GetAsyncKeyState(VK_CONTROL)>>((sizeof(SHORT) * 8) - 1);
if ((pkh->vkCode==VK_ESCAPE && bCtrlKeyDown) || // Ctrl+Esc
// Alt+TAB
(pkh->vkCode==VK_TAB && pkh->flags & LLKHF_ALTDOWN) ||
// Alt+Esc
(pkh->vkCode==VK_ESCAPE && pkh->flags & LLKHF_ALTDOWN)||
(pkh->vkCode==VK_LWIN || pkh->vkCode==VK_RWIN)) { // Start Menu
if (g_bBeep && (wp==WM_SYSKEYDOWN||wp==WM_KEYDOWN))
MessageBeep(0); // only beep on downstroke if requested
return 1; // gobble it: go directly to jail, do not pass go
}
}
return CallNextHookEx(g_hHookKbdLL, nCode, wp, lp);
}
//////////////////
// Are task keys disabledâie, is hook installed?
// Note: This assumes there's no other hook that does the same thing!
//
DLLEXPORT BOOL AreTaskKeysDisabled()
{
return g_hHookKbdLL != NULL;
}
//////////////////
// Disable task keys: install low-level kbd hook.
// Return whether currently disabled or not.
//
DLLEXPORT BOOL DisableTaskKeys(BOOL bDisable, BOOL bBeep)
{
if (bDisable) {
if (!g_hHookKbdLL) {
g_hHookKbdLL = SetWindowsHookEx(WH_KEYBOARD_LL,
MyTaskKeyHookLL, MyDll.m_hInstance, 0);
}
} else if (g_hHookKbdLL != NULL) {
UnhookWindowsHookEx(g_hHookKbdLL);
g_hHookKbdLL = NULL;
}
g_bBeep = bBeep;
return AreTaskKeysDisabled();
}
Merci Cody .... Je l'ai eu de travailler en utilisant msgina.dll ..... merci pour votre réponse détaillée ...
Msgina travaille-t-il avec Windows 7?
@Sparcu: Non. Il n'y a pas de msgina dans Windows Vista ou plus tard (qui comprend Windows 7). Ce n'est pas une option au-delà de Windows XP.
"Le crochet doit être mis en œuvre comme une DLL" uhh, non. Je ne le pense pas. Avez-vous une preuve de cela?
@ IronManmark20 peut confirmer sur la victoire 10, il n'est pas nécessaire de ne pas être placé dans une DLL. Remplacer mydll.m_hinstance code> avec getModulehandle (null) code> et ça fonctionnera
Les commentateurs précédents étaient corrects. Les crochets de clavier de bas niveau (et de souris) sont à l'exception de la règle que les crochets Windows doivent être mis en œuvre dans des DLL. C'était une gaffe de ma part. J'ai mis à jour la réponse. Mieux vaut tard que jamais.
Je pense que cela serait possible en remplaçant le pilote de clavier principal de Windows, KBDClass.sys. Il devrait être possible à l'intérieur de lui pour gérer la touche Suppr Clé appuyant sur et, par exemple, évitez de le transférer plus loin lorsque les touches CTRL et ALT sont déjà en panne. P>
Vous aurez peut-être mieux la chance de poser cette question à Serverfault - il existe des moyens de mettre des fenêtres en mode kiosque via une stratégie.