Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ctrl+Esc

519
01 июня 2003 года
VaGon
134 / / 26.03.2003
Еще глупый вопрос...
как Ctrl+Esc заблоктровать программно в W2k...
442
02 июня 2003 года
HexoGenus
121 / / 20.03.2000
Цитата:
Originally posted by VaGon
Еще глупый вопрос...
как Ctrl+Esc заблоктровать программно в W2k...



Способ не проверял и не знаю работает ли,
но в моем электронном справочнике написано так:

Как подавить реакцию Windows на CTRL+ALT+DEL, ALT-TAB, CTRL-ESC

В некоторых случаях (например, при работе в полноэкранном режиме, показе своей презентации или экранной заставки ...) бывает полезно заблокировать перечисленные комбинации клавиш. Они блокируются при работе системы в режиме "экранная заставка" , который в свою очередь несложно включить и выключить:

// Включение режима
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, 0, 0);
// Выключение режима
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, 0, 0);

519
02 июня 2003 года
VaGon
134 / / 26.03.2003
Цитата:
Originally posted by HexoGenus


Способ не проверял и не знаю работает ли,
но в моем электронном справочнике написано так:

Как подавить реакцию Windows на CTRL+ALT+DEL, ALT-TAB, CTRL-ESC
[skiped]

// Включение режима
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, 0, 0);
// Выключение режима
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, 0, 0);


этот случай не подходит для WinNT/W2k/WinXP так как в них скринсавер не блокирует клавиатуру

989
02 июня 2003 года
Vlad232ua
182 / / 02.04.2003
Цитата:
Originally posted by VaGon

этот случай не подходит для WinNT/W2k/WinXP так как в них скринсавер не блокирует клавиатуру


Блокировать стандартные сочетания признак дурного тона - раздражает, а от дурака все равно не спасет (или кнопку выключения питания, ты тоже выкрутишь);)

519
02 июня 2003 года
VaGon
134 / / 26.03.2003
Цитата:
Originally posted by Vlad232ua

Блокировать стандартные сочетания признак дурного тона - раздражает, а от дурака все равно не спасет (или кнопку выключения питания, ты тоже выкрутишь);)


этого хочу не я а заказчик, так что меня это не волнует, что он будет делать с питанием :)

429
03 июня 2003 года
Slon
78 / / 20.01.2000
Цитата:
Originally posted by Vlad232ua

Блокировать стандартные сочетания признак дурного тона - раздражает, а от дурака все равно не спасет (или кнопку выключения питания, ты тоже выкрутишь);)



Иногда все-таки нужно.
Например, если идет вывод в инвы в режиме полноэкр. DirectDraw, то сочетание Ctrl-Esc приведет к сворачиванию окна.
Я предотвратил это использованием DirectInput в эксклюзивном режиме. Но если в вашем случае не используется DX, то вряд ли данный способ будет подходящим.

989
04 июня 2003 года
Vlad232ua
182 / / 02.04.2003
Цитата:
Originally posted by Slon


Иногда все-таки нужно.
Например, если идет вывод в инвы в режиме полноэкр. DirectDraw, то сочетание Ctrl-Esc приведет к сворачиванию окна.
Я предотвратил это использованием DirectInput в эксклюзивном режиме. Но если в вашем случае не используется DX, то вряд ли данный способ будет подходящим.


Вот и я про то-же, проблема то была в твоем приложении, а не в винде с Ctrl-Esc.
А если уж действительно нужно блокировать Ctrl+Esc, используй хук, в NT и 2000 это работает. В MSDN все есть да и примеров по конфам валом.

429
05 июня 2003 года
Slon
78 / / 20.01.2000
Цитата:
Originally posted by Vlad232ua

Вот и я про то-же, проблема то была в твоем приложении, а не в винде с Ctrl-Esc.



Как раз дело в винде. То, что позволено в Win9x, не позволено в NT.
Это касается как Ctrl-Esc, так и Alt-Tab и тем более Ctrl-Alt-Del. На то она и NT, чтоб не позволять такие вещи.


А если уж действительно нужно блокировать Ctrl+Esc, используй хук, в NT и 2000 это работает.
[/QUOTE]

Я сомневаюсь, что это можно реализовать без написания, скажем, драйвера.

989
05 июня 2003 года
Vlad232ua
182 / / 02.04.2003
Цитата:
Originally posted by Slon


Как раз дело в винде. То, что позволено в Win9x, не позволено в NT.
Это касается как Ctrl-Esc, так и Alt-Tab и тем более Ctrl-Alt-Del. На то она и NT, чтоб не позволять такие вещи.


А если уж действительно нужно блокировать Ctrl+Esc, используй хук, в NT и 2000 это работает.



Я сомневаюсь, что это можно реализовать без написания, скажем, драйвера. [/QUOTE]

Ерунда.Никакой драйвер ненужен. Сейчас занят, вечером (если не будут доставать то раньше)сброшу кусок кода и именно под 2000.

429
05 июня 2003 года
Slon
78 / / 20.01.2000
Цитата:
Originally posted by Vlad232ua

Ерунда.Никакой драйвер ненужен. Сейчас занят, вечером (если не будут доставать то раньше)сброшу кусок кода и именно под 2000.



Ах да. Признаю: таки можно.
Я до этого использовал хук в dll. Но ушел от этого по причине того, что винда иногда на уши становилась (в частности, иногда отказывалась перезагружаться, но бывало и по другому). Поэтому я от хука отказался.
Привожу пример. Автор: Devnvd.

429
05 июня 2003 года
Slon
78 / / 20.01.2000
P.S. Alt-Tab и Ctrl-Alt-Del в NT так не перехватить.
989
05 июня 2003 года
Vlad232ua
182 / / 02.04.2003
Цитата:
Originally posted by Slon
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 уже интереснее т.к. это твой логин и блокировка системы, поэтому занюханому приложению туда пути нет, нужно писать свою гину.

429
06 июня 2003 года
Slon
78 / / 20.01.2000
Что ж, оказалось все просто. Буду знать. Спасибо.
Вот только не понятно, почему это не работает в Win9x ? Вроде ничего NT-only не применяется.
989
06 июня 2003 года
Vlad232ua
182 / / 02.04.2003
Цитата:
Originally posted by Slon
Что ж, оказалось все просто. Буду знать. Спасибо.
Вот только не понятно, почему это не работает в Win9x ? Вроде ничего NT-only не применяется.


Пардон, пробовал по быстрому. Естественно то там то тут ползла разная дрянь, а 98-ой у меня под рукой нет. Но возможно проблема в
#define _WINNT 0x0400
в оригинале #define _WIN32_WINNT 0x0400
но у меня чего-то поползло редекларейшен и я его рубанул (проверять времени не было).
Тут вот в плане размышления. В принципе, когда народ пытается зарубить Ctrl-Alt-Del, в большинстве случаев это запрет доступа к диспетчеру задач (за исключением админов, которые рубят рабочие станции). Но ведь диспетчер задач вызывается и по Ctrl-Shift-Esc тоже. Делать отлуп по этим клавишам в приложении глупо, т.к. юзверь доберется к нему через Ctrl-Alt-Del, а рубить и то и другое, гиморно и некрасиво.
А вот если-бы отлавливать окно "Диспетчер задач Windows" и скрывать(запрещать) его на время работы приложения, это было бы интересно. Но вот как к нему добраться из под юзера? Рабочий стол -"Default" и "Winlogon" под правами юзера просто не откроется. Будет время попробую. Если кто-то уже делал - ПОДЕЛИТЕСЬ, чтоб велосипед не изобретать.

989
08 июня 2003 года
Vlad232ua
182 / / 02.04.2003
Цитата:
Originally posted by Vlad232ua

А вот если-бы отлавливать окно "Диспетчер задач 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 не добраться, но уж больно некрасиво. Окно успевает блымнуть. А по-другому чтой-то никак. У кого какие мысли :???:

429
09 июня 2003 года
Slon
78 / / 20.01.2000
Цитата:
Originally posted by Vlad232ua

В принципе работает. К 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);
---

989
09 июня 2003 года
Vlad232ua
182 / / 02.04.2003
Цитата:
Originally posted by Slon

Но я не понял, как твой код должен работать и куда его помещать. И зачем пытаться скрыть окно и иконку в таскбаре? Может проще так? :
---
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 добраться незнаю.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог