Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2018.02.11;
Скачать: CL | DM;

Вниз

Отмена меню пуск   Найти похожие ветки 

 
irzyxa   (2010-09-05 21:25) [0]

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


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

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


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


//Хук на клавиатуру
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, то кнопка вообще не работает, и горячие клавиши естественно тоже


 
Eraser ©   (2010-09-06 01:15) [3]

> [0] irzyxa   (05.09.10 21:25)

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


 
irzyxa ©   (2010-09-09 14:59) [4]

Да я думал будет больше ответов.
Решение нашел сам. Нужно просто нажать 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-09 17:55) [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;

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


 
DVM ©   (2010-09-10 21:15) [6]

Без мыши но работает нормально, в том числе и в 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-11 01:18) [7]

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


 
irzyxa ©   (2010-09-11 18:16) [8]

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2018.02.11;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
2-1412325941
Александр_2012
2014-10-03 12:45
2018.02.11
Word. Таблица, сквозные строки.


15-1470045469
sniknik
2016-08-01 12:57
2018.02.11
Можно ли залогинится в один домен под учеткой другого?


11-1266590664
Dimaxx
2010-02-19 17:44
2018.02.11
Добавление айтемов одного PTree в другой


15-1470554356
ВладОшин
2016-08-07 10:19
2018.02.11
Цифровой старый фотик, останавливается копирование


2-1455535545
i2e
2016-02-15 14:25
2018.02.11
Memo - как выводить данные в одну строку?