各位DX,如何在程序中控制另外一个软件的操作???是不是要利用Spy++来获得软件窗口中的某个控件的ID,然后通过发送消息的方法来操纵该控件???具体能给个简单的小例子吗??该方法是不是一定有效???
解决方案 »
- 怎么在image控件上实现:用鼠标框选(象在桌面一样按住鼠标左键进行框选,有个虚框出来,框完后虚框消失,得到相应的坐标)
- vista+delphi2007的程序 xp下出现错误
- 如何用SQL语句删除主明细表中的特定信息?
- 该有图片的地方都没有图片?路径也对呀(SCRIPTS目录下有images目录和图片),源程序如下:
- 如何将PChar类型转换成string类型?
- list index out of bounds(12) 是个什么类型的错误?
- 三层结构中如何实现多帐套功能?
- 怎样才能杀入软件世界
- 如何去改变StringGrid中的某一个cell 的背景颜色,(28分)
- 救命呀!为什么try{}catch(...){}不工作。
- 请问怎样动态添加treeview的根节点很子节点?
- 200分,用一个程序关闭一个运行中的程序
总之 枚举找句柄最好!
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
function mygettext(hwnd:THandle):string;
end;
var
Form1: TForm1;
// function EnumWindowsProc(Hwnd:THandle;lParam:LParam):boolean;Stdcall;
function EnumChildProc(Hwnd:THandle;lParam:LParam):boolean;Stdcall;
implementation
{$R *.dfm}
function TForm1.mygettext(hwnd:THandle):string;
var
buf:pchar;
len:Longint;
begin
Len:=Longint(SendMessage(hWnd,WM_GETTEXTLENGTH ,0,0));
if len>0 then
begin//1
try
getmem(buf,len);
SendMessage(hWnd,WM_GETTEXT,Len+1,Int64(buf));
Result:=strpas(buf);
finally
freemem(buf);
end;
end;//1
end;
function EnumChildProc(Hwnd:THandle;lParam:LParam):boolean;
var
WindowCaption,WindowClass:array[0..254] of Char;
begin
GetClassName(Hwnd,WindowClass,255);
if Pos('BUTTON',UpperCase(StrPas(WindowClass))) > 0 then
begin
// if Form1.mygettext(Hwnd)='Button1' then
// begin
sendmessage(hwnd,WM_LBUTTONDOWN,0,1);
sendmessage(hwnd, WM_LBUTTONUP,0,1);
// end;
end;
Result := True;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
h:hwnd;
begin
h := FindWindow(nil, 'MyForm');
if h<>0 then
begin
// sendmessage(h,WM_close,0,1);
EnumChildWindows(H,@EnumChildProc,0);
end
else
showmessage('No Form');
end;
end.