问了很久的问题!(100分)

  • 主题发起人 主题发起人 Carem
  • 开始时间 开始时间
C

Carem

Unregistered / Unconfirmed
GUEST, unregistred user!
在浏览网页的时候,有时候会出现一些要你输入user & pass的窗口(不是java写的那些,是系统的登陆程序),程序里面如何判别此类窗口是否已经打开??
 
windows.open打开窗口是指定窗口名称
 
对不起,我忘了说,那个窗口的名称是不固定的,我永远都无法知道下一个窗口的名字!
 
如何获得程序的类名呢?
首先打开程序(此处以“记事本”为例),然后,运行WinSight32(Delphi自带)或
spy++(VC自带),找到程序(“记事本”)的运行状态,即可找到我们需要的类名
(两者均为“Class Name”项)。参考一个例子:
procedure TForm1.CloseVAppClick(Sender: TObject);//标题不确定
var ExeHandle:Thandle;
begin
//获得句柄-->标题不确定
ExeHandle:=FindWindow('notepad',nil);//'');//返回句柄
//关闭程序
if ExeHandle<>0 then
SendMessage(ExeHandle,WM_Close,0,0)
else
Application.MessageBox('没有打开“记事本”程序!','提示',
MB_IconInformation+MB_OK);
end;
这是我从别的地方看到的,你试试吧!
 
判断这个窗口的句柄
 
多谢各位!
 
>>> 在浏览网页的时候....
你是指浏览器中还是其他什么程序中?
这个很关键,需要你明示。
 
如果弹出的是浏览器窗口,可以通过地址来判断。
以下程序可用来获得所有已打开的IE浏览器窗口中的访问地址!!!!!

43. 获得IE中的浏览地址
function GetIEAddress(IEHandle:THandle;var Address:string):Boolean;
Const WM_GETTEXT = $D;
WM_GETTEXTLENGTH =$E;
CtlNames:array[0..4] of string=(
'WorkerA', //获得IE窗口的工作区的句柄
'ReBarWindow32', //获得IE窗口的菜单栏的句柄
'ComboBoxEx32', //获得IE窗口的下拉菜单的句柄
'ComboBox', //获得IE窗口的下拉菜单当前项的句柄
'Edit' //获得这个下拉菜单的编辑框句柄
);
var
hwnd :THandle;
i,AddLen:integer;
AddBuf :Array[0..4095] of char;
s :string;
begin
Result:=True;
hwnd:=IEHandle;
try
for i:=0 to length(ctlnames)-1 do
hwnd:=FindWindowEx(hwnd,0,PChar(CtlNames),nil);
except
Result:=false;
end;
if (Result) then begin
AddLen:=SendMessage(Hwnd,WM_GETTEXTLENGTH,0,0);
//向系统发送获得IE窗口的地址栏中的字符串长度命令
SendMessage(Hwnd,WM_GETTEXT,AddLen+1,DWord(@AddBuf));
//向系统发送获得IE窗体地址栏中的字符串命令
if length(AddBuf)>0 then
begin
Address:=AddBuf;
GetWindowText(IEHandle,AddBuf,length(AddBuf)+1);
s:=Addbuf;
i:=pos(Uppercase(' - Microsoft Internet Explorer'),
Uppercase(s));
if i>0 then s:=Trim(copy(s,1,i-1));
Address:=Address+' ['+s+']';
end
else Result:=false;
end;
end;

function EnumIEProc(hwnd:THandle;Param:LPARAM):Boolean;stdcall;
const NAME_LEN=1024;
type
PStrings=^TStrings;
var
sClassName:Array[0..NAME_LEN] of char;
IEAddress:string;
AddLen:Integer;
begin
AddLen:=GetClassName(hwnd,@sClassName,NAME_LEN);
if (AddLen=7) and (sClassName='IEFrame') then
if GetIEAddress(hwnd,IEAddress) then
PStrings(Param).Add(IEAddress);
Result:=true;
end;

function GetAllIEAddress(var Addresses:TStrings):Integer;
var
s:TStrings;
begin
s:=TStringList.Create ;
EnumWindows(@EnumIEProc,LPARAM(@s));
Result:=s.Count ;
if Result>0 then Addresses.Assign (s);
s.free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
s:TStrings;
begin
s:=TStringList.Create ;
GetAllIEAddress(s);
if s.Count >0 then Memo1.Lines.Assign (s);
s.free;
end;
 
monkeyking1983说的正是我需要的,多谢各位了!保持联系!
 
后退
顶部