首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

根据窗口句柄,怎么对组件进行编程?高手作答!老急了!

2012-03-05 
根据窗口句柄,如何对组件进行编程?高手作答!!!老急了!!!!!!!!!使用Findwindow 得到窗口句柄 HW后,可以设置

根据窗口句柄,如何对组件进行编程?高手作答!!!老急了!!!!!!!!!
使用Findwindow 得到窗口句柄 HW后,可以设置组件的标题信息(使用SetWindowText),可是如果要对其他属性进行设置,怎么操作?
例如:我在Public中定义了TSockAddrIn类型的一个组件addrP2P,如果要设置addrP2P的sin_family属性为AF_INET,addrP2P.sin_port:=iP2PUserInfoResp.port;addrP2P.sin_addr.S_addr:=iP2PUserInfoResp.ip;怎么办?


能办到不???????

[解决办法]

 var i: integer
begin
for i := 0 to findcontrol(self.Handle).ComponentCount - 1 do
if findcontrol(self.Handle).Components[i] is TSockAddrIn then
with TSockAddrIn(findcontrol(self.Handle).Components[i]) do
begin
sin_family:=ΪAF_INET ;
...

end;
[解决办法]
哈哈,刚好看《Inside VCL》看到一个超酷的技巧,如何根据一个控件的Handle得到控件引用,试试下面这个函数
function GetControl(Handle:HWnd):TWinControl;
var
ControlAtomString: string;
RM_GetObjectInstance: DWORD;
begin
ControlAtomString := Format('ControlOfs%.8X%.8X', [HInstance, GetCurrentThreadID]);
RM_GetObjectInstance := RegisterWindowMessage(PChar(ControlAtomString));
result:=Pointer(SendMessage(Handle,RM_GetObjectInstance,0,0));
end;

调用如上函数得到返回结果后再做强制类型转换为你的窗体
[解决办法]
首先FindControl只能找到从TComponent继承下来的控件,保证你的addrP2P是从TComponent继承下来的。
其次,FindControl在DLL中应用时就会有问题,具体的原因看看FindControl的实现代码。

如果你要设置外部程序中addrP2P的属性,那么,处理的思路就是DLL注入-〉找到目标控件-〉强制转换成 addrP2P类型。

代码示例(注入就不写了):
var
m_Ctrl: TWinControl;
begin
m_Ctrl:= FindControl(AHandle); //这个函数可能需要修改

//遍历窗体上所有的控件,查找需要的控件
for m_iTmp:= 0 to m_Ctrl.ComponentCount - 1 do
begin
if m_Ctrl.Components[m_iTmp] is addrP2P then
begin
addrP2P(m_Ctrl).sin_port:= '端口';
//.....
end;
end;
end;
内部的话更简单了,上面的就够了。
思路就是这样的,具体操作需要自己慢慢去调试,试验。

热点排行