使用Findwindow 得到窗口句柄 HW后,可以设置组件的标题信息(使用SetWindowText),可是如果要对其他属性进行设置,怎么操作?
例如:我在Public中定义了TSockAddrIn类型的一个组件addrP2P,如果要设置addrP2P的sin_family属性为AF_INET,addrP2P.sin_port:=iP2PUserInfoResp.port;addrP2P.sin_addr.S_addr:=iP2PUserInfoResp.ip;怎么办?
能办到不???????
例如:我在Public中定义了TSockAddrIn类型的一个组件addrP2P,如果要设置addrP2P的sin_family属性为AF_INET,addrP2P.sin_port:=iP2PUserInfoResp.port;addrP2P.sin_addr.S_addr:=iP2PUserInfoResp.ip;怎么办?
能办到不???????
说的细点行吗?这个等函数包括什么啊?都怎么用!
得到了窗口句柄HW,我想将这个窗体内的某个组件的属性进行修改,怎么做!例如:我在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;
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在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;
内部的话更简单了,上面的就够了。
思路就是这样的,具体操作需要自己慢慢去调试,试验。