8 个解决方案
#1
你把程序想象成什么了,想怎么改就怎么改。
#2
我把PACAL的源码找出来了,应该跟这个有关系。
function TComponent.FindComponent(const AName: string): TComponent;
var
I: Integer;
begin
Result := nil;
if (AName <> '') and (FComponents <> nil) then
begin
if FSortedComponents = nil then
begin
{ Fill the sorted list (and sort it) }
FSortedComponents := TList.Create;
FSortedComponents.Count := FComponents.Count;
for I := 0 to FComponents.Count - 1 do
FSortedComponents[I] := FComponents[I];
FSortedComponents.SortList(
function(Item1, Item2: Pointer): Integer
begin
Result := CompareText(TComponent(Item1).Name, TComponent(Item2).Name);
end);
end;
Result := FindSortedComponent(AName, I);
end;
end;
function TComponent.FindSortedComponent(const AName: string; var Index: Integer): TComponent;
var
L, H, I, C: Integer;
LList: PPointerList;
begin
L := 0;
H := FSortedComponents.Count - 1;
LList := FSortedComponents.List;
while L <= H do
begin
I := (L + H) shr 1;
Result := TComponent(LList^[I]);
C := CompareText(Result.Name, AName);
if C < 0 then
L := I + 1
else
begin
H := I - 1;
if C = 0 then
begin
Index := I;
Exit;
end;
end;
end;
Index := L;
Result := nil;
end;
#3
void __fastcall TForm1::Button3Click(TObject *Sender)没有给你翻译,给你个例子
{
HWND Formh = FindWindow(NULL,"测试窗口");
if(Formh)
{
HWND Edith = FindWindowEx(Formh,NULL,"TEdit",NULL);
if(Edith)
{
int length = SendMessage(Edith, WM_GETTEXTLENGTH, 0, 0);
// ShowMessage(length);
char *Temp = new char[length];
//GetWindowText(Memoh,Temp,length);
SendMessage(Edith, WM_GETTEXT, length,(long)Temp );
Memo1->Lines->Add(String(Temp));
delete Temp;
char TT[] = "测试文字";
SendMessage(Edith, WM_SETTEXT, strlen(TT),(long)TT );
}
}
}
#4
获取窗体句柄,控件句柄,发送消息
#5
关键是看自己的进程还是别的进程?如果是自己的进程,可以用FindComponent或FindControl找到该组件的名称,然后以对象->属性的方式访问。
#6
不是自己的进程,也不是用VCL开发的。窗口中有三个EDIT,EDIT的标题会变,ID也会变(用SPY++看的)。GetDlgItem似乎不行。
SendMessage(DestHandle,WM_SETTEXT, 0, (LPARAM)str); //改变的是窗口的标题,但我需要的是改变EDIT中的文本。
HWND Edith = FindWindowEx(Formh,NULL,"Edit",NULL);//能对控件历遍吗?
SendMessage(DestHandle,WM_SETTEXT, 0, (LPARAM)str); //改变的是窗口的标题,但我需要的是改变EDIT中的文本。
HWND Edith = FindWindowEx(Formh,NULL,"Edit",NULL);//能对控件历遍吗?
#7
如果只是Edit类的窗口,找到该窗口句柄以后,用API:SetWindowText或者发消息WM_SETTEXT就可以更改其窗口文本。
至于其他类型的窗口,就要考虑另外的方法了。
至于其他类型的窗口,就要考虑另外的方法了。
#8
3楼zzb的代码中有一处错误,可能导致内存泄露。
delete Temp;
应该改成:
delete []Temp;
delete Temp;
应该改成:
delete []Temp;
#1
你把程序想象成什么了,想怎么改就怎么改。
#2
我把PACAL的源码找出来了,应该跟这个有关系。
function TComponent.FindComponent(const AName: string): TComponent;
var
I: Integer;
begin
Result := nil;
if (AName <> '') and (FComponents <> nil) then
begin
if FSortedComponents = nil then
begin
{ Fill the sorted list (and sort it) }
FSortedComponents := TList.Create;
FSortedComponents.Count := FComponents.Count;
for I := 0 to FComponents.Count - 1 do
FSortedComponents[I] := FComponents[I];
FSortedComponents.SortList(
function(Item1, Item2: Pointer): Integer
begin
Result := CompareText(TComponent(Item1).Name, TComponent(Item2).Name);
end);
end;
Result := FindSortedComponent(AName, I);
end;
end;
function TComponent.FindSortedComponent(const AName: string; var Index: Integer): TComponent;
var
L, H, I, C: Integer;
LList: PPointerList;
begin
L := 0;
H := FSortedComponents.Count - 1;
LList := FSortedComponents.List;
while L <= H do
begin
I := (L + H) shr 1;
Result := TComponent(LList^[I]);
C := CompareText(Result.Name, AName);
if C < 0 then
L := I + 1
else
begin
H := I - 1;
if C = 0 then
begin
Index := I;
Exit;
end;
end;
end;
Index := L;
Result := nil;
end;
#3
void __fastcall TForm1::Button3Click(TObject *Sender)没有给你翻译,给你个例子
{
HWND Formh = FindWindow(NULL,"测试窗口");
if(Formh)
{
HWND Edith = FindWindowEx(Formh,NULL,"TEdit",NULL);
if(Edith)
{
int length = SendMessage(Edith, WM_GETTEXTLENGTH, 0, 0);
// ShowMessage(length);
char *Temp = new char[length];
//GetWindowText(Memoh,Temp,length);
SendMessage(Edith, WM_GETTEXT, length,(long)Temp );
Memo1->Lines->Add(String(Temp));
delete Temp;
char TT[] = "测试文字";
SendMessage(Edith, WM_SETTEXT, strlen(TT),(long)TT );
}
}
}
#4
获取窗体句柄,控件句柄,发送消息
#5
关键是看自己的进程还是别的进程?如果是自己的进程,可以用FindComponent或FindControl找到该组件的名称,然后以对象->属性的方式访问。
#6
不是自己的进程,也不是用VCL开发的。窗口中有三个EDIT,EDIT的标题会变,ID也会变(用SPY++看的)。GetDlgItem似乎不行。
SendMessage(DestHandle,WM_SETTEXT, 0, (LPARAM)str); //改变的是窗口的标题,但我需要的是改变EDIT中的文本。
HWND Edith = FindWindowEx(Formh,NULL,"Edit",NULL);//能对控件历遍吗?
SendMessage(DestHandle,WM_SETTEXT, 0, (LPARAM)str); //改变的是窗口的标题,但我需要的是改变EDIT中的文本。
HWND Edith = FindWindowEx(Formh,NULL,"Edit",NULL);//能对控件历遍吗?
#7
如果只是Edit类的窗口,找到该窗口句柄以后,用API:SetWindowText或者发消息WM_SETTEXT就可以更改其窗口文本。
至于其他类型的窗口,就要考虑另外的方法了。
至于其他类型的窗口,就要考虑另外的方法了。
#8
3楼zzb的代码中有一处错误,可能导致内存泄露。
delete Temp;
应该改成:
delete []Temp;
delete Temp;
应该改成:
delete []Temp;