在键盘的左下角第2个键不是有一个“开始菜单”键吗?按一下那个键就会弹出开始菜单.
我想实现的功能是:我运行一个Project1.exe,点一下按钮,然后再按"开始菜单"键,弹不出开始菜单, 请问怎么实现?  多谢!!

解决方案 »

  1.   


    unit Unit3;
    interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Controls, Forms,
      Dialogs, StdCtrls;
      {按键消息的结构,Delphi中没有。
      注意:这个结构在Windows   NT   4   sp3以上系统
      中才能使用}
    type
      tagKBDLLHOOKSTRUCT = packed record
        vkCode: DWORD; //虚拟键值
        scanCode: DWORD; //扫描码值(没有用过)
      {一些扩展标志,这个值比较麻烦,MSDN上说得也不太明白,但是
      根据这个程序,这个标志值的第六位数(二进制)为1时ALT键按下为0相反。}
        flags: DWORD;
        time: DWORD; //消息时间戳
        dwExtraInfo: DWORD; //和消息相关的扩展信息
      end;
      KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT;
      PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;  //这个是低级键盘钩子的索引值,Delphi中没有,必须自己定义
    const WH_KEYBOARD_LL = 13;
      //定义一个常量好和上面哪个结构中的flags比较而得出ALT键是否按下
    const LLKHF_ALTDOWN = $20;
      //----声明各个函数-------------
    function LowLevelKeyboardProc(nCode: Integer;
      WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
    procedure hookstar; //设置钩子
    procedure hookend;
    var
      hhkLowLevelKybd: HHOOK;
    implementation
      {
      功能:低级键盘钩子的回调函数,在里面过滤消息
      参数:nCode   是Hook的标志
      WParam   表示消息的类型
      LParam   是一个指向我们在上面定义的哪个结构KBDLLHOOKSTRUCT的指针
      返回值:如果不是0的话windows就把这个消息丢掉,程序就不会再收到这个消息了。
      }function LowLevelKeyboardProc(nCode: Integer;
      WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
    var
      fEatKeystroke: BOOL;
      p: PKBDLLHOOKSTRUCT;
    begin
      Result := 0;
      fEatKeystroke := FALSE;
      p := PKBDLLHOOKSTRUCT(lParam);
      //nCode值为HC_ACTION时表示WParam和LParam参数包涵了按键消息
      if (nCode = HC_ACTION) then
      begin
      //拦截按键消息并测试是否是Ctrl+Esc、Alt+Tab、和Alt+Esc功能键。
        case wParam of
          WM_KEYDOWN,
            WM_SYSKEYDOWN,
            WM_KEYUP,
            WM_SYSKEYUP:
            fEatKeystroke :=
              ((p.vkCode = VK_TAB) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or //   Alt+Tab
              ((p.vkCode = VK_ESCAPE) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or //
              (p.vkCode = VK_Lwin) or (p.vkCode = VK_Rwin) or (p.vkCode = VK_apps) or //上面是屏蔽WIN按键
      //((p.vkCode   =   VK_CONTROL)   and   (P.vkCode   =   LLKHF_ALTDOWN)   and   (P.vkCode   =   VK_Delete))   or
            ((p.vkCode = VK_ESCAPE) and ((GetKeyState(VK_CONTROL) and $8000) <> 0)) or
              ((p.vkCode = VK_F4) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or
              ((p.vkCode = VK_SPACE) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or
              (((p.vkCode = VK_CONTROL) and (P.vkCode = LLKHF_ALTDOWN and p.flags) and (P.vkCode = VK_Delete))) //AND   (p.flags   =   true)   ;
        end;
      end;  if fEatKeystroke = True then
        Result := 1;
      if nCode <> 0 then
        Result := CallNextHookEx(0, nCode, wParam, lParam);
    end;
      //----------------------回调函数结束-----------------------------------------procedure hookstar; //设置钩子
    begin
      //设置键盘钩子
      if hhkLowLevelKybd = 0 then
      begin
        hhkLowLevelKybd := SetWindowsHookExW(WH_KEYBOARD_LL,
          LowLevelKeyboardProc,
          Hinstance,
          0);
        if hhkLowLevelKybd <> 0 then
        //MessageBox(0,   '键盘钩子设置成功!',   '提示',   MB_OK)
        else
          MessageBox(0, '键盘钩子设置失败!', '提示', MB_OK);
      end
      else
          //MessageBox(Handle,   '键盘钩子已设置!',   '提示',   MB_OK);
    end;
      //---------------------设置钩子完成-----------------procedure hookend; //卸载键盘钩子
    begin
      if hhkLowLevelKybd <> 0 then
        if UnhookWindowsHookEx(hhkLowLevelKybd) <> False then
        begin
      //MessageBox(0,   '系统热键恢复使用!',   '提示',   MB_OK);
          hhkLowLevelKybd := 0;
        end
        else
      //MessageBox(Handle,   '键盘钩子卸载失败!',   '提示',   MB_OK)
      else
      //MessageBox(Handle,   '没有发现键盘钩子!',   '提示',   MB_OK);
    end;
      //-------------卸载键盘钩子完成-------------------------end.
      

  2.   

    再来个屏蔽CTRL+ALT+DEL的
    -------------
    正想要,上次给了200分结贴了也没得到答案,我需要能在xp系统下屏蔽的。
      

  3.   

    [email protected]
    -----------
    最好给个完整的工程给我, 我用过钩子程序。要看完整的例子才看得懂。 :)