知道句柄,怎么知道改控件的名称?(50分)

  • 主题发起人 主题发起人 SeekMyself
  • 开始时间 开始时间
S

SeekMyself

Unregistered / Unconfirmed
GUEST, unregistred user!
代码如下:
begin
GetCursorPos(TmpOp); //取得鼠标当前坐标
TmpHandle:=WindowFromPoint(TmpOp); //鼠标所点击的控件句柄;

如果该句柄 是个TEdit,我要用什么函数得到该 句柄 的Name,相当于
AName := AFunc(TmpHandle).Name;

简单的说,就是知道句柄,如何得到对象?

end
 
CListBox* pListBox=DYNAMIC_DOWNCAST(CListBox,pWnd);

if(pListBox!=NULL)
{}

以上是 C++ 语法,可以得到 ListBox 实例,delphi有这样的函数吗?
 
getwindowtext(hand,@str,length(str));
getclassname(hand,@strclass,length(str));
 
to sbzldlb : getclassname 只能得到 TEdit,不能得到Edit2这个实例啊!

我是想在鼠标点中一个控件后,显示出这个控件的名称,比如点中 Edit2,就显示
Edit2.Name,点中Label1,就显示 Label1.Name!
 
搞定了,但没有人回答 :(

还是把答案写出来吧,免的其他的人浪费资源

FindControl(EditHandle)
 
不会吧,我刚想答,答案跟你的一样,不过 findControl 应该用在同一进程内, 如果用在 全局 hook 的 dll, findControl 这个 函数要改改。
 
to xuxiaohan : 怎样改啊?
 
var
ControlAtom: TAtom;
ControlAtomString: string;
RM_GetObjectInstance: DWORD; // registered window message

function FindControl(Handle: HWnd): TWinControl;
var
OwningProcess: DWORD;
begin
Result := nil;
if (Handle <> 0) and (GetWindowThreadProcessID(Handle, OwningProcess) <> 0) and
(OwningProcess = GetCurrentProcessId) then
begin
if GlobalFindAtom(PChar(ControlAtomString)) = ControlAtom then
Result := Pointer(GetProp(Handle, MakeIntAtom(ControlAtom)))
else
Result := Pointer(SendMessage(Handle, RM_GetObjectInstance, 0, 0));
end;
end;


initialization
ControlAtomString := Format('ControlOfs%.8X%.8X', [GetModuleHandle(nil), GetCurrentThreadID]);
ControlAtom := GlobalAddAtom(PChar(ControlAtomString));
RM_GetObjectInstance := RegisterWindowMessage(PChar(ControlAtomString));
finalization

end.
 
同意 xuxiaohan,不过对应没有Handle的控件,就需要另外的取法,两个函数如下:
function GetObjectByPosNoHandle(var AControl : TControl;APos : TPoint) : boolean;
var
AWin : TWinControl;
begin
Result := False;
AWin := FindVCLWindow(APos);
if AWin <> nil then
begin
AControl := AWin.ControlAtPos(AWin.ScreenToClient(APos), True,True);
if AControl <> nil then
Result := True; //AImg := TImage(ACn).Name;
end;
end;

function GetObjectByPosHandle(var AControl : TWinControl) : boolean;
var
AHandle : THandle;
APos : TPoint;
szClassName: array[0..255] of Char;
begin
Result := False;
GetCursorPos(APos); //取得鼠标当前坐标;
AHandle:=WindowFromPoint(APos); //鼠标所点击的控件句柄;
GetClassName(AHandle, szClassName, 255);
AControl := FindControl(AHandle);
if AControl <> nil then
Result := True;
//ShowMessage(TEdit(FindControl(AHandle)).Text);
end;
 
多人接受答案了。
 
后退
顶部