FindWindowEx ******************************** The FindWindowEx function retrieves a handle to a window whose class name and window name match the specified strings. The function searches child windows, beginning with the one following the specified child window. This function does not perform a case-sensitive search. 钮上的文字有可能是图片
type TForm1 = class(TForm) button2: TButton; ListBox1: TListBox; Button1: TButton; procedure tutton2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation {$R *.DFM}
function GetText(Wnd : HWND) : string; var textlength : integer; text : PChar; begin textlength:=SendMessage(Wnd,WM_GETTEXTLENGTH,0,0); if textlength=0 then Result := '' else begin getmem(text,textlength+1); SendMessage(Wnd,WM_GETTEXT,textlength+1,Integer(text)); Result:=text; freemem(text); end; end; function EnumWindowsProc (Wnd: HWND; LParam: LPARAM): BOOL; stdcall; var st:string; begin Result := True; if (IsWindowVisible(Wnd)) and (GetWindowLong(Wnd, GWL_HWNDPARENT) = 0) and (GetWindowLong(Wnd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW = 0) then begin st:=GetText(Wnd); Form1.Listbox1.items.add(st); end; end; procedure TForm1.tutton2Click(Sender: TObject); var Param : Longint; begin Form1.Listbox1.Clear; Param := 0 ; EnumWindows(@EnumWindowsProc , Param); end; procedure TForm1.Button1Click(Sender: TObject); function EnumChildWindowsProc(hwnd: Integer; lparam: Longint):Boolean; stdcall; var buffer: array[0..255] of Char; begin Result := True; GetClassName(hwnd,buffer,256); if StrPas(Buffer)='TEdit' then begin PInteger(lparam)^ := hwnd; Result:=False; end; end; var Handle: Integer; buffer: Array[0..1023] of Char; begin Handle := FindWindow(nil,pchar(Form1.listbox1.Items[listbox1.ItemIndex])); if Handle<>0 then begin EnumChildWindows(Handle,@EnumChildWindowsProc,Integer(@Handle)); SendMessage(Handle,WM_SETTEXT,0,Integer(pchar('你所需要填写的文本'))); end; end; end.
思路是按楼上的来做的,是用SPY++查找的组件类名,但是根据此类名却找不到对应的组件,很奇怪。但我用此方法却可以找到记事本并修改记事本的内容 [code=Delphi(Pascal)] procedure TFrm_Main.Button6Click(Sender: TObject); var TxtHandle,ChildHandle:Thandle; begin TxtHandle:=FindWindow(nil,'无标题 - 记事本'); if TxtHandle > 0 then begin ChildHandle:=FindWindowEx(TxtHandle,0,'Edit',nil); if ChildHandle > 0 then begin SendMessage(ChildHandle,WM_SETTEXT,0,Integer(Pchar('这是写入的内容'))); EnableWindow(ChildHandle,False); end; end;end; [/code
然后发送消息
********************************
The FindWindowEx function retrieves a handle to a window whose class name and window name match the specified strings. The function searches child windows, beginning with the one following the specified child window. This function does not perform a case-sensitive search.
钮上的文字有可能是图片
unit unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls, ExtCtrls;
type
TForm1 = class(TForm)
button2: TButton;
ListBox1: TListBox;
Button1: TButton;
procedure tutton2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation {$R *.DFM}
function GetText(Wnd : HWND) : string;
var
textlength : integer;
text : PChar;
begin
textlength:=SendMessage(Wnd,WM_GETTEXTLENGTH,0,0);
if textlength=0 then
Result := ''
else begin
getmem(text,textlength+1);
SendMessage(Wnd,WM_GETTEXT,textlength+1,Integer(text));
Result:=text;
freemem(text);
end;
end;
function EnumWindowsProc (Wnd: HWND; LParam: LPARAM): BOOL; stdcall;
var
st:string;
begin
Result := True;
if (IsWindowVisible(Wnd)) and (GetWindowLong(Wnd, GWL_HWNDPARENT) = 0) and (GetWindowLong(Wnd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW = 0) then begin
st:=GetText(Wnd);
Form1.Listbox1.items.add(st);
end;
end;
procedure TForm1.tutton2Click(Sender: TObject);
var
Param : Longint;
begin
Form1.Listbox1.Clear;
Param := 0 ;
EnumWindows(@EnumWindowsProc , Param);
end; procedure TForm1.Button1Click(Sender: TObject);
function EnumChildWindowsProc(hwnd: Integer; lparam: Longint):Boolean; stdcall;
var
buffer: array[0..255] of Char;
begin
Result := True;
GetClassName(hwnd,buffer,256);
if StrPas(Buffer)='TEdit' then
begin
PInteger(lparam)^ := hwnd;
Result:=False;
end;
end;
var
Handle: Integer;
buffer: Array[0..1023] of Char;
begin
Handle := FindWindow(nil,pchar(Form1.listbox1.Items[listbox1.ItemIndex]));
if Handle<>0 then
begin
EnumChildWindows(Handle,@EnumChildWindowsProc,Integer(@Handle));
SendMessage(Handle,WM_SETTEXT,0,Integer(pchar('你所需要填写的文本')));
end;
end; end.
Program = "C:\Documents and Settings\QQ2009\QQ.exe"
Set WshShell=createobject("wscript.shell")
Set Exec=WshShell.Exec(Program)
WScript.Sleep 3000
WshShell.AppActivate "Idiot.CN"
WshShell.SendKeys "+{TAB}"
WshShell.SendKeys "qq号"
WScript.Sleep 200
WshShell.SendKeys "{TAB}"
WshShell.SendKeys "qq密码"
WScript.Sleep 200
WshShell.SendKeys "{ENTER}"
至于窗口和组件句柄,可以用VC自带的spy++这个工具来看看
[code=Delphi(Pascal)]
procedure TFrm_Main.Button6Click(Sender: TObject);
var TxtHandle,ChildHandle:Thandle;
begin
TxtHandle:=FindWindow(nil,'无标题 - 记事本');
if TxtHandle > 0 then
begin
ChildHandle:=FindWindowEx(TxtHandle,0,'Edit',nil);
if ChildHandle > 0 then
begin
SendMessage(ChildHandle,WM_SETTEXT,0,Integer(Pchar('这是写入的内容')));
EnableWindow(ChildHandle,False);
end;
end;end;
[/code
但还是可以实现,而且不是用VBS的方法解决,因为VBS脚本不是在所有机器上都支持的。
早些年有人写的“新欢乐时光病毒”,把VBS脚本运用的非常精僻,而且该病毒是VBS(相当于直接开源)格式,那段时间杀毒软件对VBS格式的文件都封杀了。
接收的自己写消息方法来接收数据
难道用delphi操作网页你不会?
2009QQ窗口句柄不好弄
总不能写一个Exescope程序出来吧?