使用Delphi编写自动关闭Windows信使服务窗体程序
Windows信使服务是Windows为了方便尽心系统管理而设置的一项工具,初衷是很好的可以使得管理员方便的在局域网内发布消息给各个用户。
可是却常常被一个菜的不能再菜的家伙利用,到处扰乱别人的学习和生活。每每让人在用电脑的同时突然弹出一个确认对话框。如果只是在办公的还好,尽管是最上层窗口,只要关闭了即可。可是如果是在CS,则会突然跳出CS,要求再去点击确认,让人烦躁的没办法。
如下程序使用Delphi编写可以自动识别信使服务的弹出窗口并自动关闭。内部使用了Timer空间来定时识别信使服务窗体。原本还打算用线程,可是后来调试出了点问题就把这个垃圾功能去掉了。
unit untmain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, untclosew, ExtCtrls, winprocs;
type
Tfrmmain = class(TForm)
Label1: TLabel;
edtcount: TEdit;
btnok: TButton;
Timer1: TTimer;
procedure btnokClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
closew:tclosew;
end;
var
frmmain: Tfrmmain;
implementation
{$R *.dfm}
procedure Tfrmmain.btnokClick(Sender: TObject);
begin
if btnok.caption='启动服务' then
begin
btnok.Caption:='停止服务';
timer1.Enabled:=true;
end
else
begin
btnok.Caption:='启动服务';
timer1.Enabled:=false;
closew.suspend;
end;
closew.FreeOnTerminate:=true;
end;
procedure Tfrmmain.Timer1Timer(Sender: TObject);
var
hwndwin:hwnd;
begin
hwndwin:=winprocs.FindWindow(nil,pchar('信使服务 '));
if hwndwin<>0 then
begin
closew.Resume;
end
else
begin
if not(closew.Suspended) then
closew.suspend;
end;
end;
procedure Tfrmmain.FormCreate(Sender: TObject);
begin
closew:=tclosew.Create(true);
end;
procedure Tfrmmain.FormDestroy(Sender: TObject);
begin
if closew<>nil then
begin
closew.FreeOnTerminate:=true;
closew.Terminate;
end;
end;
end.
unit untclosew;
interface
uses
Classes, sysutils, windows, winprocs, messages;
type
tclosew = class(TThread)
private
protected
procedure update;
procedure Execute; override;
end;
implementation
uses untmain;
procedure tclosew.Execute;
var
hwndwin:hwnd;
begin
while not(terminated) do
begin
hwndwin:=winprocs.FindWindow(nil,pchar('信使服务 '));
if hwndwin<>0 then
begin
winprocs.SendMessage(hwndwin,WM_CLOSE,0,0);
synchronize(update);
end;
end;
end;
procedure tclosew.update;
var
i:integer;
begin
i:=strtoint(untmain.frmmain.edtcount.text);
i:=i+1;
untmain.frmmain.edtcount.text:=inttostr(i);
end;
end.