请问:如何读取工控软件里的数值(100分)

  • 主题发起人 主题发起人 狂龙
  • 开始时间 开始时间

狂龙

Unregistered / Unconfirmed
GUEST, unregistred user!
我单位有个自动计量系统,我想用DELPHI做个小软件,读取里面的有关数值,比如:有个流量的标识名是PT101,请问,如何能把他的数值显示到DELPHI软件里的EDIT里,谢谢
 
用SendMessage(handle,WM_GETTEXT.........
具体怎么用去搜索,网上很多资料
 
有这方面的资料吗,在哪里可以找到呀
 
百度里找,要么去CSDN,大富翁的集成资料里也很多
 
是不是就是读取别人界面上的控件里的值吧,是的话就没错了
去年做过一个类似的东西,是直接往别人界面里自动填东西,用WM_SETTEXT
 
兄台说的没有错,是读取别人软件里的值,把他的值显示到自己的软件里来
 
procedure TForm1.Timer1Timer(Sender: TObject);
var
Pos: TPoint;
Handle: HWND;
Buf: array[0..1024] of Char;
begin
GetCursorPos(Pos); //得到当前光标位置
Handle := WindowFromPoint(Pos); //返回当前位置的句柄
GetClassName(Handle, Buf, 1024); //得到类名
SendMessage(Handle, WM_GETTEXT, 33, Integer(@Buf)); //得到标题
TitleText.Caption := Buf; //得到内容
end;
 
这段代码,没有看出来是在取PT101的值,是不是我水平太差的原因,看不出来
 
//取控件值并修改的几个函数-----------------------------------------------

function SplitString(Source, Deli: string ): TStringList;stdcall;
var
EndOfCurrentString: byte;
StringList:TStringList;
begin
StringList:=TStringList.Create;
while Pos(Deli, Source)>0 do
begin
EndOfCurrentString := Pos(Deli, Source);
StringList.add(Copy(Source, 1, EndOfCurrentString - 1));
Source := Copy(Source, EndOfCurrentString + length(Deli), length(Source) - EndOfCurrentString);
end;
Result := StringList;
StringList.Add(source);
end;

// 获得窗口文本
function GetWndText(hWnd: HWND): String;
Var
Ret:LongInt;
mText:PChar;
Buf:Integer;
begin
Ret:=SendMessage(hWnd,WM_GETTEXTLENGTH,0,0)+1;
GetMem(mText,Ret);
try
Buf:=LongInt(mText);
SendMessage(hWnd,WM_GETTEXT,Ret,Buf);
Result:=StrPas(mText);
finally
FreeMem(mText,Ret);
end;
end;

// 发送文本到窗口

procedure SetWndText(hWnd: HWND; Text: String);

Var
//Ret:LongInt;
mText:PChar;
Buf:Integer;
begin
GetMem(mText,Length(Text));
StrCopy(mText,PChar(Text));
try
Buf:=LongInt(mText);
SendMessage(hWnd,WM_SETTEXT,0,Buf);
finally
FreeMem(mText,Length(Text));
end;
end;

// 取得窗口句柄
function GetSoftWnd(str:string): HWND;
var
hCurrentWindow: HWnd;
WndText:String;
begin
hCurrentWindow := GetWindow(Application.Handle, GW_HWNDFIRST);
while hCurrentWindow <> 0 do
begin
WndText:=GetWndText(hCurrentWindow);
if Pos(str,WndText)>0 then
begin
Result:=hCurrentWindow;
Exit;
end;
hCurrentWindow := GetWindow(hCurrentWindow, GW_HWNDNEXT);
end;
Result:=0;
end;

//------取控件值并修改的几个函数结束----------------------------------------------

//具体这么用
procedure TForm1.Button1Click(Sender: TObject);
function EnumChildWindowsProc(hwnd: Integer): Boolean; stdcall;
var
buffer: array[0..255] of Char;
begin
Result := True;
GetClassName(hwnd,buffer,256); //得到类名
//if ComNum=61 then SetWndText(hwnd,'奶奶的');
Form1.Memo2.Lines.add(inttostr(ComNum)+' ◆ '+GetWndText(hwnd)+' ◆ '+buffer);//加到Memo显示
inc(ComNum);
end;
var
hwnd: Integer;
//buffer: Array[0..1023] of Char;
begin

ComNum:=0;
Memo2.Clear;
hwnd := GetSoftWnd(edit4.text); //得到目标窗口句柄
if hwnd<>0 then
EnumChildWindows(hwnd,@EnumChildWindowsProc,Integer(@hwnd));

ComNum:=0;

end;
 
取到STRINGLIST里,看是哪个控件,每次按序号取那个值就可以了
这个是我那个例程里用的,可以取值,也可以改值
 
但他的显示数值的控件都是一样的,是不是关键在显示的序号上啦
 
对,关键是判断哪个控件的句柄,找到序号,每次取就可以了
给你的代码里很清楚,有几个变量你看没有就在最上面声明一下就行
 
后退
顶部