delphi XE2 - 实现无敌关机键  
官方Delphi 学习QQ群: 682628230(三千人)\n
频道

delphi XE2 - 实现无敌关机键


当从开始菜单选择关机,很多时候会得到一些叽叽歪歪的提示,让你在是和否之间做抉择,其实你只想关机,其他什么你并不关心。

我们可以做一个热键程序,当你按下某个键或者组合键,然后立即强制关机,就象《生化危机》里的自毁键,一旦按下就不再有什么能够阻止。

这个程序里基本上有两个要点,一是注册热键,二是关机权限。

关于热键,万一写有“注册系统级热键”文章可以参考,原文链接如下:
http://www.cnblogs.com/del/archive/2008/04/15/976834.html

程序源代码(Delphi XE2)如下:

 

program Project1; { 运行本程序后随时按下WIN+Q组合键即可强制关机 }

uses Winapi.Windows;

procedure DoEvents; // 等同Application.ProcessMessages
var
  Msg: TMsg;
begin
  while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
end;

procedure AdjustProcessPrivilege(const ProcessHandle: Cardinal; // 提升指定进程到某个权限
  const PrivilegeName: string; const Enable: Boolean);
var
  H: THandle;
  TP: TTokenPrivileges;
begin
  if OpenProcessToken(ProcessHandle, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, H) then
  try
    if LookupPrivilegeValue(nil, PChar(PrivilegeName), TP.Privileges[0].Luid) then
    begin
      TP.PrivilegeCount := 1;
      if Enable then
        TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
      else
        TP.Privileges[0].Attributes := 0;
      AdjustTokenPrivileges(H, False, TP, SizeOf(TP), nil, PCardinal(nil)^);
    end;
  finally
    CloseHandle(H);
  end;
end;

procedure ForceShutDown; // 强制关机
begin
  AdjustProcessPrivilege(GetCurrentProcess, 'SeShutdownPrivilege', True);  // 获得关机权限
  ExitWindowsEx(EWX_FORCE or EWX_POWEROFF, 0);                             // 关机
  AdjustProcessPrivilege(GetCurrentProcess, 'SeShutdownPrivilege', False); // 取消关机权限
end;

function WndProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  Result := 0;
  if (LOBYTE(lParam) = MOD_WIN) and (LOBYTE(HiWord(lParam)) = Ord('Q')) then
  begin
    ForceShutDown;                       // 强制关机
    SetWindowLong(hWnd, GWL_WNDPROC, 0); // 还原窗口函数
  end;
end;

procedure Main;
const
  CN = 'STATIC'; // 窗口类名
  WN = 'HOTKEY'; // 窗口名称
var
  H: Cardinal;
  WL: NativeInt;
  ID: Word;
begin
  H  := CreateWindowEx(0, CN, WN, 0, 0, 0, 0, 0, HWND_MESSAGE, 0, 0, nil); // 创建message-only窗口
  WL := SetWindowLong(H, GWL_WNDPROC, NativeInt(@WndProc));                // 设置新的窗口函数
  ID := GlobalAddAtom('WIN+Q');                                            // 获得原子ID
  RegisterHotKey(H, ID, MOD_WIN, Ord('Q'));                                // 注册热键WIN+Q

  repeat
    DoEvents;
    Sleep(1);
  until GetWindowLong(H, GWL_WNDPROC) = WL; // 若已还原窗口函数则退出循环

  UnregisterHotKey(H, ID); // 注销热键
  GlobalDeleteAtom(ID);    // 删除原子ID
  DestroyWindow(H);        // 销毁message-only窗口
end;

begin
  Main;
end.

 


推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.048273086547852 seconds