主题:本人珍藏:关于线程的精间例子,请补充
说明:如果编译不能通过请加上uses shellapi;
得到鼠标点的窗口的句柄
procedure TForm1.Timer3Timer(Sender: TObject);
var
Yxs:TPoint;
H:HWND; //句柄
Buf: array[0..1024] of Char;
begin
GetCursorPos(Yxs);
H:= WindowFromPoint(Yxs); // 返回指定位置的句柄 ,是一个数字,可用inttostr显示出来看
end;//WindowFromPoint:返回包含了指定点的窗口的句柄。忽略屏蔽、隐藏以及透明窗口
根据句柄得到类名称及窗口标题
procedure hwndclassname(hd:HWND);
//GetClassName:为指定的窗口取得类名
//SendMessage:将一条消息发给那个窗口
var
Buf: array[0..1024] of Char;
begin
GetClassName(H, Buf, 1024); // 得到指定句柄所在的类名称
edit1.Text:=buf; //显示结果
SendMessage(H, WM_GETTEXT, 33, Integer(@Buf)); // 得到鼠标点所在位置控件的标题.
edit2.Text:= buf; //显示结果
//对话框有句柄但得不到类名(返回#32768),如QQ登录对话框,系统属性对话框,右键菜单....
end;
获得活动窗口的句柄
procedure TForm1.Timer1Timer(Sender: TObject);
var
Yxs:Thandle;
begin
Yxs:=GetForegroundWindow();//前台应用程序的活动窗口
edit1.text:=inttostr(LongInt(Yxs));
end;
获得活动窗口的标题一(不太稳定)
procedure TForm1.Timer1Timer(Sender: TObject);
var
W: PChar;
TextLen: Integer;
begin
TextLen:=GetWindowTextLength(GetForegroundWindow());
GetMem(W,TextLen);
GetWindowText(GetForegroundWindow(),W,TextLen+1);
Edit1.Text:=string(W);
FreeMem(W);
end;
根据任务栏的内容得到该程序的句柄
//理论上全部进程都可以,只是只有很少一部分才出现在任务条上,调试时可以先枚举出来再试试
procedure TForm1.Button3Click(Sender: TObject);
var
hw:Thandle;
cnt:thandle;
Buf: array[0..1024] of Char;
begin
Hw := FindWindow(nil,'api.txt - 记事本' );//可用pchar(edit1.text)代替参数二
if Hw = 0 then begin //这里只能列出第一个.
ShowMessage('没有发现相同的应用程序实例。');
end else begin
ShowMessage('应用程序已经加载。');//这里的句柄与枚举出来的句柄一样
end;
end;
枚举指定窗口的子控件
procedure TFRM.TimerTimer(Sender: TObject);
var
Point:TPoint;
HD:THandle;
WndClassName:Array [0..254] of Char;
Li:TListItem;
begin
GetCursorPos(Point); //获取鼠标指针的当前位置
HD:=WindowFromPoint(point); //得到鼠标点的句柄
Lv.Clear;
if HD>0 then //多数时候是大于0
begin //GetClassName:返回窗口类名称
得到指定句柄的类名
GetClassName(HD,wndClassName,255); //为指定的窗口取得类名 (这里的窗口指的是控件对象)
Label1.Caption:='类名:'+ string(wndClassName)+' '+
'名称:'+ GetText(HD)+' '+ //GetText是一个Delphi方法 ,获得指定句柄的文本.可显示密码字符原文
'句柄:'+ inttostr(HD); //显示句柄号
if CBB.Checked then //是否光显示单独控件类 (是否枚举子类)只有窗体,面板,框架才有子类
begin
Li:=Lv.Items.Add;
Li.Caption:=String(wndClassName);
Li.SubItems.Add(GetText(HD));
Li.SubItems.Add(inttostr(HD));
end
else
EnumChildWindows(HD,@EnumChildWndProc,0); ////枚举子窗口句柄
end;
if cb.Checked then SendMessage(HD,WM_NEXTDLGCTL,0,0); //好玩,焦点在自动移动 !!!!!!!!!
end;
----
获得活动窗口的标题三(远不如二)
function GetText(IHwnd:LongInt):String;
var
TextLen:LongInt;
TextStr:Array [0..254] of Char;
begin
TextLen:=SendMessage(IHwnd, WM_GETTEXTLENGTH, 0, 0); //??
if TextLen=0 Then
begin
Result:='>No Text<';
Exit;
end;
SendMessage(IHwnd, WM_GETTEXT, 255, Integer(@TextStr)); //??
Result:=StrPas(@TextStr);
end;
----
//枚举控件句柄过程
function EnumChildWndProc(AHWnd:LongInt;ALParam:LParam):boolean;stdcall;
var
WndClassName:Array [0..254] of Char;
Li:TListItem;
begin
GetClassName(AHWnd,wndClassName,255);
with FRM do
begin
Li:=Lv.Items.Add;
Li.Caption:=String(wndClassName);
Li.SubItems.Add(GetText(AHWnd));
Li.SubItems.Add(inttostr(AHWnd));
end;
result:=true;
end;
------------------
获得活动窗口的标题二
procedure TForm1.Timer2Timer(Sender: TObject);
var
Yxs:Thandle;
Buf: array[0..1024] of Char;
begin
Yxs:=GetForegroundWindow();//前台应用程序的活动窗口
SendMessage(yxs, WM_GETTEXT, 33, Integer(@Buf));
edit2.Text:= buf; //显示结果
end;
--------------
//设置当前获动窗口名称:当然也可指定窗口了
procedure TForm1.Timer1Timer(Sender: TObject);
begin
SetWindowText(GetForegroundWindow(),Pchar('维特创业'));
end;
-------------
关闭进程一
procedure TForm1.Button4Click(Sender: TObject);
var
W: HWnd;
str: String;
begin
str := InputBox('提示','请输入完整的应用程序在任务栏中的名称:','');
if str = '' then Exit;
W := FindWindow(nil, PChar(str));
if W <> 0 then SendMessage(W,WM_CLOSE,0,0) // 目标要提示保存
end;
关闭进程二 uses tlhelp32,shellapi;
procedure TClosePramForm.Button2Click(Sender: TObject);
var
lppe:tprocessentry32;
sshandle:thandle;
hh:hwnd;
found:boolean;
begin
sshandle:=createtoolhelp32snapshot(TH32CS_SNAPALL,0);
found:=process32first(sshandle,lppe);
while found do
begin
if uppercase(extractfilename(lppe.szExeFile))='EXCEL.EXE' then //必须是一个完整的进程名称
begin
hh:=OpenProcess(PROCESS_ALL_ACCESS,true,lppe.th32ProcessID);
TerminateProcess(hh,0); //目标不保存改变,没任何提示即退出
end;
found:=process32next(sshandle,lppe); //关闭相同的多个进程
end;
end;
-----------
//将窗口调到前台
SetForegroundWindow(yxs); //指定句柄
----------------
//将进程置顶
setwindowpos(strtoint(edit1.Text),hwnd_topmost,0,0,0,0,SWP_NOMOVE+SWP_NOSIZE)//HWND_NOTOPMOST=最顶部窗口的后面
=====================
//禁止程序显示在任务栏上 当然也可指定窗口了
procedure TIcoForm.Button1Click(Sender: TObject);
begin
showwindow(application.Handle,SW_HIDE);//sw_show恢复
===枚举正在运行的进程===
procedure TForm1.Button1Click(Sender: TObject);
var
hCurrentWindow:HWnd;
szText:array[0..254] of char;
begin
hCurrentWindow := GetWindow(Handle, GW_HWNDFIRST);\\得到第一个窗口
while hCurrentWindow <> 0 do
begin
if GetWindowText(hCurrentWindow, @szText, 255)>0 then Memo1.Lines.Add(StrPas(@szText));
hCurrentWindow:=GetWindow(hCurrentWindow, GW_HWNDNEXT);\\得到下一个窗口
end;
end;
end;
得到鼠标点的窗口的句柄
procedure TForm1.Timer3Timer(Sender: TObject);
var
Yxs:TPoint;
H:HWND; //句柄
Buf: array[0..1024] of Char;
begin
GetCursorPos(Yxs);
H:= WindowFromPoint(Yxs); // 返回指定位置的句柄 ,是一个数字,可用inttostr显示出来看
end;//WindowFromPoint:返回包含了指定点的窗口的句柄。忽略屏蔽、隐藏以及透明窗口
根据句柄得到类名称及窗口标题
procedure hwndclassname(hd:HWND);
//GetClassName:为指定的窗口取得类名
//SendMessage:将一条消息发给那个窗口
var
Buf: array[0..1024] of Char;
begin
GetClassName(H, Buf, 1024); // 得到指定句柄所在的类名称
edit1.Text:=buf; //显示结果
SendMessage(H, WM_GETTEXT, 33, Integer(@Buf)); // 得到鼠标点所在位置控件的标题.
edit2.Text:= buf; //显示结果
//对话框有句柄但得不到类名(返回#32768),如QQ登录对话框,系统属性对话框,右键菜单....
end;
获得活动窗口的句柄
procedure TForm1.Timer1Timer(Sender: TObject);
var
Yxs:Thandle;
begin
Yxs:=GetForegroundWindow();//前台应用程序的活动窗口
edit1.text:=inttostr(LongInt(Yxs));
end;
获得活动窗口的标题一(不太稳定)
procedure TForm1.Timer1Timer(Sender: TObject);
var
W: PChar;
TextLen: Integer;
begin
TextLen:=GetWindowTextLength(GetForegroundWindow());
GetMem(W,TextLen);
GetWindowText(GetForegroundWindow(),W,TextLen+1);
Edit1.Text:=string(W);
FreeMem(W);
end;
根据任务栏的内容得到该程序的句柄
//理论上全部进程都可以,只是只有很少一部分才出现在任务条上,调试时可以先枚举出来再试试
procedure TForm1.Button3Click(Sender: TObject);
var
hw:Thandle;
cnt:thandle;
Buf: array[0..1024] of Char;
begin
Hw := FindWindow(nil,'api.txt - 记事本' );//可用pchar(edit1.text)代替参数二
if Hw = 0 then begin //这里只能列出第一个.
ShowMessage('没有发现相同的应用程序实例。');
end else begin
ShowMessage('应用程序已经加载。');//这里的句柄与枚举出来的句柄一样
end;
end;
枚举指定窗口的子控件
procedure TFRM.TimerTimer(Sender: TObject);
var
Point:TPoint;
HD:THandle;
WndClassName:Array [0..254] of Char;
Li:TListItem;
begin
GetCursorPos(Point); //获取鼠标指针的当前位置
HD:=WindowFromPoint(point); //得到鼠标点的句柄
Lv.Clear;
if HD>0 then //多数时候是大于0
begin //GetClassName:返回窗口类名称
得到指定句柄的类名
GetClassName(HD,wndClassName,255); //为指定的窗口取得类名 (这里的窗口指的是控件对象)
Label1.Caption:='类名:'+ string(wndClassName)+' '+
'名称:'+ GetText(HD)+' '+ //GetText是一个Delphi方法 ,获得指定句柄的文本.可显示密码字符原文
'句柄:'+ inttostr(HD); //显示句柄号
if CBB.Checked then //是否光显示单独控件类 (是否枚举子类)只有窗体,面板,框架才有子类
begin
Li:=Lv.Items.Add;
Li.Caption:=String(wndClassName);
Li.SubItems.Add(GetText(HD));
Li.SubItems.Add(inttostr(HD));
end
else
EnumChildWindows(HD,@EnumChildWndProc,0); ////枚举子窗口句柄
end;
if cb.Checked then SendMessage(HD,WM_NEXTDLGCTL,0,0); //好玩,焦点在自动移动 !!!!!!!!!
end;
----
获得活动窗口的标题三(远不如二)
function GetText(IHwnd:LongInt):String;
var
TextLen:LongInt;
TextStr:Array [0..254] of Char;
begin
TextLen:=SendMessage(IHwnd, WM_GETTEXTLENGTH, 0, 0); //??
if TextLen=0 Then
begin
Result:='>No Text<';
Exit;
end;
SendMessage(IHwnd, WM_GETTEXT, 255, Integer(@TextStr)); //??
Result:=StrPas(@TextStr);
end;
----
//枚举控件句柄过程
function EnumChildWndProc(AHWnd:LongInt;ALParam:LParam):boolean;stdcall;
var
WndClassName:Array [0..254] of Char;
Li:TListItem;
begin
GetClassName(AHWnd,wndClassName,255);
with FRM do
begin
Li:=Lv.Items.Add;
Li.Caption:=String(wndClassName);
Li.SubItems.Add(GetText(AHWnd));
Li.SubItems.Add(inttostr(AHWnd));
end;
result:=true;
end;
------------------
获得活动窗口的标题二
procedure TForm1.Timer2Timer(Sender: TObject);
var
Yxs:Thandle;
Buf: array[0..1024] of Char;
begin
Yxs:=GetForegroundWindow();//前台应用程序的活动窗口
SendMessage(yxs, WM_GETTEXT, 33, Integer(@Buf));
edit2.Text:= buf; //显示结果
end;
--------------
//设置当前获动窗口名称:当然也可指定窗口了
procedure TForm1.Timer1Timer(Sender: TObject);
begin
SetWindowText(GetForegroundWindow(),Pchar('维特创业'));
end;
-------------
关闭进程一
procedure TForm1.Button4Click(Sender: TObject);
var
W: HWnd;
str: String;
begin
str := InputBox('提示','请输入完整的应用程序在任务栏中的名称:','');
if str = '' then Exit;
W := FindWindow(nil, PChar(str));
if W <> 0 then SendMessage(W,WM_CLOSE,0,0) // 目标要提示保存
end;
关闭进程二 uses tlhelp32,shellapi;
procedure TClosePramForm.Button2Click(Sender: TObject);
var
lppe:tprocessentry32;
sshandle:thandle;
hh:hwnd;
found:boolean;
begin
sshandle:=createtoolhelp32snapshot(TH32CS_SNAPALL,0);
found:=process32first(sshandle,lppe);
while found do
begin
if uppercase(extractfilename(lppe.szExeFile))='EXCEL.EXE' then //必须是一个完整的进程名称
begin
hh:=OpenProcess(PROCESS_ALL_ACCESS,true,lppe.th32ProcessID);
TerminateProcess(hh,0); //目标不保存改变,没任何提示即退出
end;
found:=process32next(sshandle,lppe); //关闭相同的多个进程
end;
end;
-----------
//将窗口调到前台
SetForegroundWindow(yxs); //指定句柄
----------------
//将进程置顶
setwindowpos(strtoint(edit1.Text),hwnd_topmost,0,0,0,0,SWP_NOMOVE+SWP_NOSIZE)//HWND_NOTOPMOST=最顶部窗口的后面
=====================
//禁止程序显示在任务栏上 当然也可指定窗口了
procedure TIcoForm.Button1Click(Sender: TObject);
begin
showwindow(application.Handle,SW_HIDE);//sw_show恢复
===枚举正在运行的进程===
procedure TForm1.Button1Click(Sender: TObject);
var
hCurrentWindow:HWnd;
szText:array[0..254] of char;
begin
hCurrentWindow := GetWindow(Handle, GW_HWNDFIRST);\\得到第一个窗口
while hCurrentWindow <> 0 do
begin
if GetWindowText(hCurrentWindow, @szText, 255)>0 then Memo1.Lines.Add(StrPas(@szText));
hCurrentWindow:=GetWindow(hCurrentWindow, GW_HWNDNEXT);\\得到下一个窗口
end;
end;
end;