提个问题?请高手帮助。(100分)

  • 主题发起人 主题发起人 archonwang
  • 开始时间 开始时间
A

archonwang

Unregistered / Unconfirmed
GUEST, unregistred user!
我有个tlb文件可以被程序调出窗体,如果说在这个窗体上存在一个按钮,怎么实现对这个按钮的操作?请大家帮忙。谢谢。
 
找到这个窗口的句柄,然后根据这个窗口的句柄枚举出它的所有的子窗口,再记下你要的那个按钮的ID,然后发送按键给那按钮就行了.

它们都是用API函数来实现 的,前不久还有人问个这个问题,你自己再搜搜
 
问题描述的不是很清楚,不同的情况,解决的方法不一样。给你一个例子吧。
function GetEditHandle(hwnd: Integer; lparam: Longint):Boolean; stdcall;
var
buffer: array[0..255] of Char;
begin
Result := True;
//得到目标窗口的控件
GetClassName(hwnd,buffer,256);
//找到目标窗口的目标控件
if StrPas(Buffer)='TButton' then
begin
PInteger(lparam)^ := hwnd; //得到目标控件的Hwnd(句柄)
Result:=False; //终止循环
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Handle: Integer;
begin
Handle := FindWindow(nil,'对话模式'); //就是窗口的Caption
// Handle :=GetActiveWindow; //GetForegroundWindow;
if Handle<>0 then
begin
//在这里循环取到想要的句柄为止
EnumChildWindows(Handle,@GetEditHandle,Integer(@Handle));
//此时,Handle就是你要的句柄
PostMessage(Handle, BM_Click, 0, 0);
end;
end;
 
谢谢,已经捕捉到了。那我应该怎么样在这个窗体上实现我想要的功能呢?比如说,一个Click事件?
 
PostMessage(Handle, BM_Click, 0, 0);
这句就是向它发Click消息呀
 
yostgxf:
谢谢,能捕捉到那个button,click的事件了,刚刚是参数没有设置正确导致捕捉不到,那如果有两个Click的话,刚刚那条消息应该怎么写?
不好意思,以前从来就没有用过句柄,今天一下子冒出那么多问题了
:(
 
没明白你说的,
PostMessage(Handle, BM_Click, 0, 0);只是向这个控件发一个Click消息
两个Click什么意思?是模拟按二次?那就发二遍
 
哦,不是的,那个窗体上有两个这样的按钮,前面的那个函数
StrPas(Buffer)='TButton' 只能判断是不是'TButton' ,但是不能判断是不是我需要的那个Button。我不知道是不是能够使用按钮名称或者其他的方法判断我需要使用的button。这个问题我应该怎么解决。
 
这样修改:
function GetEditHandle(hwnd: Integer; lparam: Longint):Boolean; stdcall;
var
buffer: array[0..255] of Char;
begin
Result := True;
//得到目标窗口的控件
GetWindowText(hwnd, buffer, 256);//!!(刚才是类名,现在是文本)
//找到目标窗口的目标控件
if StrPas(Buffer)='Button1' then//!!
begin
PInteger(lparam)^ := hwnd; //得到目标控件的Hwnd(句柄)
Result:=False; //终止循环
end;
end;
 
多谢!!
万分感激...
 
因为回调函数只能返回一个句柄,如果你需要多个句柄(得到多个控件)就这样修改:
取掉这句‘Result:=False; //终止循环’,用一个类似TStringList的全局变量来保存你获得的句柄,回调函数会多次调用的。

好了,该说的都说了,下面是发分鼓励。哈哈
 
后退
顶部