Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отмена меню пуск [D7, WinXP]


irzyxa ©   (2010-09-05 21:25:00) 

Поставил хук на клавиатуру. Отлавливаю нажатие клавиши Win. Задача если была нажата Win + колесо мышки, то не выводить меню пуск, иначе нормальная реакция на клавишу Win.


ziztracer   (2010-10-16 20:51:00) [1]

спасибо за рабочий код)


irzyxa   (2010-09-11 18:16:00) [2]

На Win7 все работает нормально. Проверено


Eraser   (2010-09-11 01:18:00) [3]

хм.. чудеса. сейчас протестил в своем проекте, там практически аналогичный код, за исключением того, что нажатия не просто блокируются, не просто ради блокировки. работает! хотя точно помню, что были проблемы с блокированием win не только в моем проекте, но и у конкурентов. может в каком-то обновлении винды починили..


DVM   (2010-09-10 21:15:00) [4]

Без мыши но работает нормально, в том числе и в W7


{******************************************************************************}
{* Module:  DisableLowLevelKeys.cpp                                           *}
{* Notices: Written 2000 Jeffrey Richter                                      *}
{*                                                                            *}
{* Translated by: Dmitry Muratov                                              *}
{* 2008                                                                       *}
{******************************************************************************}

program DisableLowLevelKeys;

uses
 Windows, Messages;

const
 LLKHF_ALTDOWN  = KF_ALTDOWN shr 8;
 WH_KEYBOARD_LL = 13;

type

 TKBDLLHOOKSTRUCT = record
   vkCode: DWORD;
   scanCode: DWORD;
   flags: DWORD;
   time: DWORD;
   dwExtraInfo: DWORD;
 end;
 PKBDLLHOOKSTRUCT = ^TKBDLLHOOKSTRUCT;

var
 hhkLowLevelKybd: HHOOK;

//------------------------------------------------------------------------------

function LowLevelKeyboardProc(nCode: integer;  wParam: WPARAM;  lParam: LPARAM): LRESULT; stdcall;
var
 fEatKeystroke: boolean;
 p: PKBDLLHOOKSTRUCT;
begin
 fEatKeystroke := false;
 if nCode = HC_ACTION then
   begin
     case wParam of
       WM_KEYDOWN,
       WM_SYSKEYDOWN,
       WM_KEYUP,
       WM_SYSKEYUP:
         begin
           p := PKBDLLHOOKSTRUCT(lParam);
           fEatKeystroke := ((p^.vkCode = VK_LWIN) or (p^.vkCode = VK_RWIN)) or
                            ((p^.vkCode = VK_TAB) and ((p^.flags and LLKHF_ALTDOWN) 0)) or
                            ((p^.vkCode = VK_ESCAPE) and ((p^.flags and LLKHF_ALTDOWN) 0)) or
                            ((p^.vkCode = VK_ESCAPE) and ((GetKeyState(VK_CONTROL) and $8000) 0)) or
                            ((p^.vkCode = VK_F4) and ((p^.flags and LLKHF_ALTDOWN) 0));
         end;
     end;
   end;
 if fEatKeystroke then
   result := 1
 else
   result :=  CallNextHookEx(0, nCode, wParam, lParam);
end;

//------------------------------------------------------------------------------

begin
 // Install the low-level keyboard & mouse hooks
 hhkLowLevelKybd := SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);

 // Keep this app running until we're told to stop
 MessageBox(0,
            PChar('Alt+Esc, Ctrl+Esc, WIN, Alt+F4, and Alt+Tab are now disabled.' + #13#10 +
                  'Click "Ok" to terminate this application and re-enable these keys.'),
            PChar('Disable Low-Level Keys'),
            MB_OK);

 // Remove hooks
 UnhookWindowsHookEx(hhkLowLevelKybd);
end.


Eraser   (2010-09-09 17:55:00) [5]

> [4] irzyxa ©   (09.09.10 14:59)


>    if ((p^.vkCode=VK_LWIN)or(p^.vkCode=VK_RWIN)) then
>    begin
>      IsWinKeyPressed:=True;
> //        Kill:=True;
>    end;

ты, говорю, на семерке тестировал?


irzyxa   (2010-09-09 14:59:00) [6]

Да я думал будет больше ответов.
Решение нашел сам. Нужно просто нажать Win+ любую кнопку модификатор (Alt,Ctrl,Shift).

//Хук на клавиатуру
function LowLevelKeyboardProc(nCode: integer; wParam: longint; lParam: longint): integer; stdcall;
var  p: PKBDLLHOOKSTRUCT;
   Kill:Bool;
begin
Kill:=False;
if (nCode = HC_ACTION) then
begin
  if (wParam=WM_KEYDOWN)or(wParam=WM_SYSKEYDOWN)then
  begin
    p:=PKBDLLHOOKSTRUCT(lParam);
    if ((p^.vkCode=VK_LWIN)or(p^.vkCode=VK_RWIN)) then
    begin
      IsWinKeyPressed:=True;
//        Kill:=True;
    end;
  end
  else
  if (wParam=WM_KEYUP)or(wParam=WM_SYSKEYUP) then
  begin
    p:=PKBDLLHOOKSTRUCT(lParam);
    if ((p^.vkCode=VK_LWIN)or(p^.vkCode=VK_RWIN)) then
      IsWinKeyPressed:=False;

    if ((p^.vkCode=VK_LWIN)or(p^.vkCode=VK_RWIN))and(IsMouseWheel) then
    begin
      IsMouseWheel:=False;
      IsWinKeyPressed:=False;
     //Нажимаем комбинацию Win+Shift чтобы не показывалось меню Пуск
      keybd_event(VK_LWIN,0,0,0);
      keybd_event(VK_SHIFT,0,0,0);
      keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
      keybd_event(VK_LWIN,0,KEYEVENTF_KEYUP,0);
//        Kill:=True;
    end
  end
end;

if Kill then
  Result:=1
else
  Result:=CallNextHookEx(0, nCode, wParam, lParam);
end;


Eraser   (2010-09-06 01:15:00) [7]

> [0] irzyxa   (05.09.10 21:25)

перехватить клавишу win таким способом, начиная с висты, не удастся.


irzyxa   (2010-09-05 22:15:00) [8]


//Хук на клавиатуру
function LowLevelKeyboardProc(nCode: integer; wParam: longint; lParam: longint): integer; stdcall;
var  p: PKBDLLHOOKSTRUCT;
    Kill:Bool;
begin
 Kill:=False;
 if (nCode = HC_ACTION) then
 begin
   if (wParam=WM_KEYDOWN)or(wParam=WM_SYSKEYDOWN)then
   begin
     p:=PKBDLLHOOKSTRUCT(lParam);
     if ((p^.vkCode=VK_LWIN)or(p^.vkCode=VK_RWIN)) then
     begin
       IsWinKeyPressed:=True;
//        Kill:=True;
     end;
   end
   else
   if (wParam=WM_KEYUP)or(wParam=WM_SYSKEYUP) then
   begin
     p:=PKBDLLHOOKSTRUCT(lParam);
     if ((p^.vkCode=VK_LWIN)or(p^.vkCode=VK_RWIN)) then
       IsWinKeyPressed:=False;

     if ((p^.vkCode=VK_LWIN)or(p^.vkCode=VK_RWIN))and(IsMouseWheel) then
     begin
       IsMouseWheel:=False;
       IsWinKeyPressed:=False;
//        Kill:=True;
     end
   end
 end;

 if Kill then
   Result:=1
 else
   Result:=CallNextHookEx(0, nCode, wParam, lParam);
end;


И получается если я убиваю Win на KEYDOWN у меня она остается нажатой, если убиваю и на KEYUP, то кнопка вообще не работает, и горячие клавиши естественно тоже


Rouse_   (2010-09-05 22:00:00) [9]

Если стоит хук - то не пускай сообщение дальше по цепочке...


Наверх

Титульная страница Поиск, карта сайта Написать письмо