Ctrl+Esc
как Ctrl+Esc заблоктровать программно в W2k...
Еще глупый вопрос...
как Ctrl+Esc заблоктровать программно в W2k...
Способ не проверял и не знаю работает ли,
но в моем электронном справочнике написано так:
Как подавить реакцию Windows на CTRL+ALT+DEL, ALT-TAB, CTRL-ESC
В некоторых случаях (например, при работе в полноэкранном режиме, показе своей презентации или экранной заставки ...) бывает полезно заблокировать перечисленные комбинации клавиш. Они блокируются при работе системы в режиме "экранная заставка" , который в свою очередь несложно включить и выключить:
// Включение режима
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, 0, 0);
// Выключение режима
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, 0, 0);
Способ не проверял и не знаю работает ли,
но в моем электронном справочнике написано так:
Как подавить реакцию Windows на CTRL+ALT+DEL, ALT-TAB, CTRL-ESC
[skiped]
// Включение режима
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, 0, 0);
// Выключение режима
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, 0, 0);
этот случай не подходит для WinNT/W2k/WinXP так как в них скринсавер не блокирует клавиатуру
этот случай не подходит для WinNT/W2k/WinXP так как в них скринсавер не блокирует клавиатуру
Блокировать стандартные сочетания признак дурного тона - раздражает, а от дурака все равно не спасет (или кнопку выключения питания, ты тоже выкрутишь);)
Блокировать стандартные сочетания признак дурного тона - раздражает, а от дурака все равно не спасет (или кнопку выключения питания, ты тоже выкрутишь);)
этого хочу не я а заказчик, так что меня это не волнует, что он будет делать с питанием :)
Блокировать стандартные сочетания признак дурного тона - раздражает, а от дурака все равно не спасет (или кнопку выключения питания, ты тоже выкрутишь);)
Иногда все-таки нужно.
Например, если идет вывод в инвы в режиме полноэкр. DirectDraw, то сочетание Ctrl-Esc приведет к сворачиванию окна.
Я предотвратил это использованием DirectInput в эксклюзивном режиме. Но если в вашем случае не используется DX, то вряд ли данный способ будет подходящим.
Иногда все-таки нужно.
Например, если идет вывод в инвы в режиме полноэкр. DirectDraw, то сочетание Ctrl-Esc приведет к сворачиванию окна.
Я предотвратил это использованием DirectInput в эксклюзивном режиме. Но если в вашем случае не используется DX, то вряд ли данный способ будет подходящим.
Вот и я про то-же, проблема то была в твоем приложении, а не в винде с Ctrl-Esc.
А если уж действительно нужно блокировать Ctrl+Esc, используй хук, в NT и 2000 это работает. В MSDN все есть да и примеров по конфам валом.
Вот и я про то-же, проблема то была в твоем приложении, а не в винде с Ctrl-Esc.
Как раз дело в винде. То, что позволено в Win9x, не позволено в NT.
Это касается как Ctrl-Esc, так и Alt-Tab и тем более Ctrl-Alt-Del. На то она и NT, чтоб не позволять такие вещи.
А если уж действительно нужно блокировать Ctrl+Esc, используй хук, в NT и 2000 это работает. [/QUOTE]
Я сомневаюсь, что это можно реализовать без написания, скажем, драйвера.
Как раз дело в винде. То, что позволено в Win9x, не позволено в NT.
Это касается как Ctrl-Esc, так и Alt-Tab и тем более Ctrl-Alt-Del. На то она и NT, чтоб не позволять такие вещи.
А если уж действительно нужно блокировать Ctrl+Esc, используй хук, в NT и 2000 это работает.
Я сомневаюсь, что это можно реализовать без написания, скажем, драйвера. [/QUOTE]
Ерунда.Никакой драйвер ненужен. Сейчас занят, вечером (если не будут доставать то раньше)сброшу кусок кода и именно под 2000.
Ерунда.Никакой драйвер ненужен. Сейчас занят, вечером (если не будут доставать то раньше)сброшу кусок кода и именно под 2000.
Ах да. Признаю: таки можно.
Я до этого использовал хук в dll. Но ушел от этого по причине того, что винда иногда на уши становилась (в частности, иногда отказывалась перезагружаться, но бывало и по другому). Поэтому я от хука отказался.
Привожу пример. Автор: Devnvd.
P.S. Alt-Tab и Ctrl-Alt-Del в NT так не перехватить.
Разговор был про Сtrl-Esc, хотя и Alt-Tab не проблема
//------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <Windows.h>
#define _WINNT 0x0400
USERES("Examples_for_BCB.res");
USEFORM("Examples.cpp", Form1);
LRESULT CALLBACK LowLevelKeyboardProc(int nCode,WPARAM wParam, LPARAM lParam)
{ BOOL fEatKeystroke = FALSE;
if (nCode == HC_ACTION)
{ switch (wParam)
{ case WM_KEYDOWN: case WM_SYSKEYDOWN: case WM_KEYUP: case WM_SYSKEYUP:
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam;
fEatKeystroke =
((p->vkCode == VK_TAB) && ((p->flags & LLKHF_ALTDOWN)!= 0)) ||
((p->vkCode == VK_ESCAPE) && ((p->flags & LLKHF_ALTDOWN)!= 0)) ||
((p->vkCode == VK_ESCAPE) && ((GetKeyState(VK_CONTROL) & 0x8000) != 0));
break;
}
}
return(fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam,lParam));
}
typedef int (__stdcall * pFunc)();
//------------------------------------------------
WINAPI WinMain(HINSTANCE hinstEXE, HINSTANCE, LPSTR, int)
{ HHOOK hhkLowLevelKybd = SetWindowsHookEx(WH_KEYBOARD_LL,(pFunc)LowLevelKeyboardProc,hinstEXE,0);
MessageBox(NULL,"Alt+Esc,Ctrl+Esc & Alt+Tab are now disabled.","Disable Low-Level Keys", MB_OK);
try { Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
UnhookWindowsHookEx(hhkLowLevelKybd);
MessageBox(NULL,"Alt+Esc,Ctrl+Esc & Alt+Tab are now enabled.","Enable Low-Level Keys", MB_OK);
return 0;
}
//------------------------------------------------
Причем я ничего не изобретал, все это сделал Джефри в 2000-ом году (это все придумал Черчиль в 18-ом году:)). Вот с Ctrl-Alt-Del уже интереснее т.к. это твой логин и блокировка системы, поэтому занюханому приложению туда пути нет, нужно писать свою гину.
Вот только не понятно, почему это не работает в Win9x ? Вроде ничего NT-only не применяется.
Что ж, оказалось все просто. Буду знать. Спасибо.
Вот только не понятно, почему это не работает в Win9x ? Вроде ничего NT-only не применяется.
Пардон, пробовал по быстрому. Естественно то там то тут ползла разная дрянь, а 98-ой у меня под рукой нет. Но возможно проблема в
#define _WINNT 0x0400
в оригинале #define _WIN32_WINNT 0x0400
но у меня чего-то поползло редекларейшен и я его рубанул (проверять времени не было).
Тут вот в плане размышления. В принципе, когда народ пытается зарубить Ctrl-Alt-Del, в большинстве случаев это запрет доступа к диспетчеру задач (за исключением админов, которые рубят рабочие станции). Но ведь диспетчер задач вызывается и по Ctrl-Shift-Esc тоже. Делать отлуп по этим клавишам в приложении глупо, т.к. юзверь доберется к нему через Ctrl-Alt-Del, а рубить и то и другое, гиморно и некрасиво.
А вот если-бы отлавливать окно "Диспетчер задач Windows" и скрывать(запрещать) его на время работы приложения, это было бы интересно. Но вот как к нему добраться из под юзера? Рабочий стол -"Default" и "Winlogon" под правами юзера просто не откроется. Будет время попробую. Если кто-то уже делал - ПОДЕЛИТЕСЬ, чтоб велосипед не изобретать.
А вот если-бы отлавливать окно "Диспетчер задач Windows" и скрывать(запрещать) его на время работы приложения, это было бы интересно.
... ПОДЕЛИТЕСЬ, чтоб велосипед не изобретать.
Продолжаем тему?;)
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_TASKLIST, -1);
HWND hWnd = FindWindow(NULL,"Windows Task Manager");
if(!hWnd) hWnd = FindWindow(NULL,"Диспетчер задач Windows");
if(hWnd)
{ ShowWindow(hWnd,SW_HIDE);
NOTIFYICONDATA nid;
ZeroMemory(&nid, sizeof(NOTIFYICONDATA));
nid.hWnd = hWnd;
nid.uID = 1034;
Shell_NotifyIcon(NIM_DELETE, &nid);
}
try { ... }
catch (Exception &exception)
{ ... }
CloseWindow(hWnd);
return 0;
В принципе работает. К Task Manager ни через Ctrl-Alt-Del ни через Ctrl-Shift-Esc не добраться, но уж больно некрасиво. Окно успевает блымнуть. А по-другому чтой-то никак. У кого какие мысли :???:
В принципе работает. К Task Manager ни через Ctrl-Alt-Del ни через Ctrl-Shift-Esc не добраться, но уж больно некрасиво. Окно успевает блымнуть. А по-другому чтой-то никак. У кого какие мысли :???:
Насчет блокирования Диспетчера задач (и тем более Ctrl-Alt-Del), то я согласен, что это признак дурного тона, т.к. почти невозможно случайно их
нажать. И я бы с подозрением отнесся к программе, которая мне бы не позволила выбросить себя из памяти.
Хотя я понимаю, что в данном случае это - спортивный интерес.
Но я не понял, как твой код должен работать и куда его помещать. И зачем пытаться скрыть окно и иконку в таскбаре? Может проще так? :
---
HWND hWnd = FindWindow(NULL,"Windows Task Manager");
if(!hWnd) hWnd = FindWindow(NULL,"Диспетчер задач Windows");
if(hWnd) SendMessage(hWnd, WM_CLOSE, 0, 0);
---
Но я не понял, как твой код должен работать и куда его помещать. И зачем пытаться скрыть окно и иконку в таскбаре? Может проще так? :
---
HWND hWnd = FindWindow(NULL,"Windows Task Manager");
if(!hWnd) hWnd = FindWindow(NULL,"Диспетчер задач Windows");
if(hWnd) SendMessage(hWnd, WM_CLOSE, 0, 0);
---
Помещать в WINAPI WinMain.
А вышеприведенная конструкция не сработает. Нужно сначала до "WinLogon" добраться, а справами юзера это зась. Поэтому и приходится
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_TASKLIST, -1);
поднимать чтоб за хендел зацепиться. После чего закрывать никак нельзя - (Ctrl-Shift-Esc) опять начнет работать. А иконку нужно прибить потому, что хоть распахнуть с иконки и не получиться, но закрыть запросто => мы его отпустим. А в коде мы на него просто повисли в не зависимости от прав и т.п. и не даем до него добраться. А отпускаем перед самым выходом из WinMain
CloseWindow(hWnd);
return 0;
Все вроде нормально, но успевает распахнуться перед скрытием, раздражает.
С.Васкецов приводил пример следующей конструкции
HDESK hDeskPrev = GetThreadDesktop(GetCurrentThreadId());
HDESK hDesktop = OpenDesktop(L"Winlogon",0,0,MAXIMUM_ALLOWED);
if (!hDesktop)
wprintf(L"OpenDesktop failed\n");
if (!SetThreadDesktop(hDesktop))
wprintf(L"FindWindow failed\n");
//1
HWND h = FindWindow(L"SAS Window class",L"SAS window");
if (h)
PostMessage(h,WM_HOTKEY,0,0x002E8003);
else
wprintf(L"FindWindow failed\n");
//2
SetThreadDesktop(hDeskPrev);
CloseDesktop(hDesktop);
Можно было-бы попытаться пользу извлечь, но толку, у юзверя рабочий стол "Default", а как до Winlogon добраться незнаю.