下面是一个搞硬件的朋友的意见,不过我觉得太浪费系统资源。:)
看到你的标题我现在能想到的解决方法有两种 (168字)(jhj9 今天6:43 阅读 3)
1. 截获WindowExitEx这个API即可,它位于USER32.DLL里
2. 开个timer查"关闭 Windows"这个窗口是否存在,如果存在继续获得其选项信息
我认为第二种方案简单些,我有空再给代码吧。
我刚实验了一下,第二种方案不行 (33字)(jhj9 今天6:51 阅读 3)
处于选择关闭状态时,timer被停掉了
搞定了,差点被系统骗,并不是timer不运行了,而是windows把窗口刷新暂停了 (1千字)(jhj9 今天7:28 阅读 7)
顺便说一句,你既然是问问题的,说话的口气应该客气些 (空)(jhj9 今天7:30 阅读 2)
差点以为是timer不行。
你建一个form,包含一个timer, 一个label,然后在timer里写:
procedure TForm1.Timer1Timer(Sender: TObject);
var
r,h:integer;
buff
char;
s:string;
begin
h:=findwindow(nil,'关闭 Windows');
if h<>0 then
begin
h:=getwindow(h,GW_CHILD);
while h<>0 do
begin
r:=sendmessage(h,BM_GETCHECK,0,0);
if (r=BST_CHECKED) then
begin
getmem(buff,256);
getwindowtext(h,buff,256);
s:=strpas(buff);
if s='将您的计算机转入睡眠状态(&E)' then
begin
label1.caption:='1';
label1.refresh;
end
else if s='关闭计算机(&S)' then
begin
label1.caption:='2';
label1.refresh;
end
else if s='重新启动计算机(&R)' then
begin
label1.caption:='3';
label1.refresh;
end
else if s='重新启动计算机并切换到 MS-DOS 方式(&M)' then
begin
label1.caption:='4';
label1.refresh;
end;
freemem(buff);
end;
h:=getwindow(h,GW_HWNDNEXT);
end;
end;
end;
这样你在运行程序后,在'关闭系统'中选择的项就会记录到label1中(当然,为了测试你得点取消关闭,否则你怎么看呀?)
有了这个程序,相信你不难把它改成你所需要的用途。
----------------------------------------------