Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2018.02.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2018.02.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.007 c
2-1455549531
Dmk
2016-02-15 18:18
2018.02.11
Метод класса отсутствует


2-1454172714
Dmk
2016-01-30 19:51
2018.02.11
WM_WINDOWPOSCHANGED


2-1412325941
Александр_2012
2014-10-03 12:45
2018.02.11
Word. Таблица, сквозные строки.


15-1470346201
Юрий
2016-08-05 00:30
2018.02.11
С днем рождения ! 5 августа 2016 пятница


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский