SendMessage 能否发信息到一个调用的程序哪里?

rocket204 2009-10-30 10:22:55
我调用一个EXE应用程序,在这个程序弹出输入框的时候,我想把做的DELPHI程序中的字符串STR赋到这个输入框中,不知道能否这样做,或者有其他的办法?
谢谢!
...全文
251 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
agang200008 2009-11-01
  • 打赏
  • 举报
回复
学习了哈
mjp1234airen4385 2009-10-30
  • 打赏
  • 举报
回复
可以实现
参考
liugaohui 2009-10-30
  • 打赏
  • 举报
回复
顶一下,学习
rocket204 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ljfwyh 的回复:]
{发卡信息给焦点所在可编辑框}
procedure TMainForm.SendCardNOTOEdit(const A_sText: string);
var
  cn: array[0..255] of Char;
  HD: HWND;
  T1,T2: DWORD;
begin
  (*获得焦点所在窗口句柄,可以是除本身外的所有其他应用程序。
  如果焦点所在子窗体中,则获得的是父窗口句柄。*)
  HD := GetForegroundWindow;
  if HD > 0 then
  begin
    //通过焦点所在窗口的句柄,获得其线程的标识符
    T1 := GetWindowThreadProcessId(HD);
    //通过本身的句柄,获得本身的线程的标识符
    T2 := GetWindowThreadProcessId(Application.Handle);
    //共享焦点
    AttachThreadInput(T2,T1,True);
    HD := GetFocus;
    if (HD > 0) then
    begin
      GetClassName(HD,cn,Length(cn));
      if Trim(cn) = 'TEdit' then //类名
      begin
        SendMessage(HD,WM_SETTEXT,1,LongInt(PChar(A_sText)));
        PostMessage(HD,WM_KEYDOWN,VK_RETURN,0);  //发回车命令
      end;
    end;
    //撤销连接
    AttachThreadInput(T2,T1,False);
  end;
  //HD := GetFocus; //如果单独用,只能获得当前应用程序的焦点所在控件的句柄。
end;

这段代码是发送字符串到当前光标所在位置。可以应用于两个不同的程序。你看下,不明白再问。

[/Quote]

这个我实现不了,我测试过:弹出一个记事本,然后再焦点处把STR的值传过去,但是实现不了。
我要说明一下,我调用的EXE程序不是用DELPHI开发的,这个应该没关系的吧。
虎滴小猪猪 2009-10-30
  • 打赏
  • 举报
回复
发送端:
type
TCopyDataStruct = packed record
dwData: DWORD; // 条件
cbData: DWORD; // 信息长度 需要 + 1,加一个结束符的位
lpData: Pointer; // 数据指针,传送数据的地址
end;


var
HD: THandle;
MyCopyDataStruct: TCopyDataStruct;
begin
MyCopyDataStruct.dwData := 1;
MyCopyDataStruct.cbData := StrLen(PChar(Trim(MainForm.edtCardNO.Text))) + 1;
MyCopyDataStruct.lpData := PChar(Trim(MainForm.edtCardNO.Text));
HD := FindWindow(nil,'MainForm');
if HD > 0 then
SendMessage(HD,WM_COPYDATA,Longint(MainForm.Handle),LongInt(@MyCopyDataStruct));
end;

接收端:
procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;

procedure TMainForm.WMCopyData(var Msg: TWMCopyData);
var
sText: array[0..99] of Char;
begin
FillChar(sText,Length(sText),#0);
StrLCopy(sText, Msg.CopyDataStruct^.lpData, Msg.CopyDataStruct^.cbData);
case Msg.CopyDataStruct^.dwData of
1: RzEdit1.Text := Trim(sText);
2: ShowMessage(sText);
end;
end;
rocket204 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ljfwyh 的回复:]
bdmh提醒了我,还有一个wm_copydata的方法,楼主如果需要我可以贴出来。
[/Quote]

THANKS ,非常需要!
虎滴小猪猪 2009-10-30
  • 打赏
  • 举报
回复
bdmh提醒了我,还有一个wm_copydata的方法,楼主如果需要我可以贴出来。
bdmh 2009-10-30
  • 打赏
  • 举报
回复
同一个程序传递字符串的话,可以直接传递,如果是跨进程传递的话,就不能直接传递了,可以考虑内存映像或者WM_COPYDATA消息
wintergoes 2009-10-30
  • 打赏
  • 举报
回复
用Findwindow和FindwindowEx找到窗口的句柄
再用Sendmessage给那个输入框发送WM_SetText消息
虎滴小猪猪 2009-10-30
  • 打赏
  • 举报
回复
{发卡信息给焦点所在可编辑框}
procedure TMainForm.SendCardNOTOEdit(const A_sText: string);
var
cn: array[0..255] of Char;
HD: HWND;
T1,T2: DWORD;
begin
(*获得焦点所在窗口句柄,可以是除本身外的所有其他应用程序。
如果焦点所在子窗体中,则获得的是父窗口句柄。*)
HD := GetForegroundWindow;
if HD > 0 then
begin
//通过焦点所在窗口的句柄,获得其线程的标识符
T1 := GetWindowThreadProcessId(HD);
//通过本身的句柄,获得本身的线程的标识符
T2 := GetWindowThreadProcessId(Application.Handle);
//共享焦点
AttachThreadInput(T2,T1,True);
HD := GetFocus;
if (HD > 0) then
begin
GetClassName(HD,cn,Length(cn));
if Trim(cn) = 'TEdit' then //类名
begin
SendMessage(HD,WM_SETTEXT,1,LongInt(PChar(A_sText)));
PostMessage(HD,WM_KEYDOWN,VK_RETURN,0); //发回车命令
end;
end;
//撤销连接
AttachThreadInput(T2,T1,False);
end;
//HD := GetFocus; //如果单独用,只能获得当前应用程序的焦点所在控件的句柄。
end;

这段代码是发送字符串到当前光标所在位置。可以应用于两个不同的程序。你看下,不明白再问。
rocket204 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jiap1723 的回复:]
当然可以啊 sendmessage()不是有个句柄吗 传入接受程序的句柄 在接受程序中写接受事件处理就可以了
[/Quote]

能否详细说一下该怎么做?
风之谷 2009-10-30
  • 打赏
  • 举报
回复
当然可以啊 sendmessage()不是有个句柄吗 传入接受程序的句柄 在接受程序中写接受事件处理就可以了
贝隆 2009-10-30
  • 打赏
  • 举报
回复
一堆高论!学习了
hjkto 2009-10-30
  • 打赏
  • 举报
回复

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
function EnumChildWindowsProc(hwnd: Integer; lparam: Longint):Boolean; stdcall;
var
buffer: array[0..255] of Char;
begin
Result := True;
GetClassName(hwnd,buffer,256);
if StrPas(Buffer)='Edit' then
begin
PInteger(lparam)^ := hwnd;
Result:=False;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Handle: Integer;
begin
Handle := FindWindow(nil,'新建 文本文档 - 记事本');
if Handle<>0 then
begin
EnumChildWindows(Handle,@EnumChildWindowsProc,Integer(@Handle));
SendMessage(Handle,WM_SETTEXT,0,Integer(pchar('这是我的文本')));
end;
end;

end.
这个我测试过,你试试看!
hjkto 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ljfwyh 的回复:]
{发卡信息给焦点所在可编辑框}
procedure TMainForm.SendCardNOTOEdit(const A_sText: string);
var
  cn: array[0..255] of Char;
  HD: HWND;
  T1,T2: DWORD;
begin
  (*获得焦点所在窗口句柄,可以是除本身外的所有其他应用程序。
  如果焦点所在子窗体中,则获得的是父窗口句柄。*)
  HD := GetForegroundWindow;
  if HD > 0 then
  begin
    //通过焦点所在窗口的句柄,获得其线程的标识符
    T1 := GetWindowThreadProcessId(HD);
    //通过本身的句柄,获得本身的线程的标识符
    T2 := GetWindowThreadProcessId(Application.Handle);
    //共享焦点
    AttachThreadInput(T2,T1,True);
    HD := GetFocus;
    if (HD > 0) then
    begin
      GetClassName(HD,cn,Length(cn));
      if Trim(cn) = 'TEdit' then //类名
      begin
        SendMessage(HD,WM_SETTEXT,1,LongInt(PChar(A_sText)));
        PostMessage(HD,WM_KEYDOWN,VK_RETURN,0);  //发回车命令
      end;
    end;
    //撤销连接
    AttachThreadInput(T2,T1,False);
  end;
  //HD := GetFocus; //如果单独用,只能获得当前应用程序的焦点所在控件的句柄。
end;

这段代码是发送字符串到当前光标所在位置。可以应用于两个不同的程序。你看下,不明白再问。

[/Quote]


这段代码,我也没能实现,哈。
Dingnifei123 2009-10-30
  • 打赏
  • 举报
回复
看一下头像最难看的那位的“参考”!
gwhdaxia 2009-10-30
  • 打赏
  • 举报
回复
临时性路过
rocket204 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ljfwyh 的回复:]
引用 9 楼 rocket204 的回复:
引用 3 楼 ljfwyh 的回复:
{发卡信息给焦点所在可编辑框}
procedure TMainForm.SendCardNOTOEdit(const A_sText: string);
var
  cn: array[0..255] of Char;
  HD: HWND;
  T1,T2: DWORD;
begin
  (*获得焦点所在窗口句柄,可以是除本身外的所有其他应用程序。
  如果焦点所在子窗体中,则获得的是父窗口句柄。*)
  HD := GetForegroundWindow;
  if HD > 0 then
  begin
    //通过焦点所在窗口的句柄,获得其线程的标识符
    T1 := GetWindowThreadProcessId(HD);
    //通过本身的句柄,获得本身的线程的标识符
    T2 := GetWindowThreadProcessId(Application.Handle);
    //共享焦点
    AttachThreadInput(T2,T1,True);
    HD := GetFocus;
    if (HD > 0) then
    begin
      GetClassName(HD,cn,Length(cn));
      if Trim(cn) = 'TEdit' then //类名
      begin
        SendMessage(HD,WM_SETTEXT,1,LongInt(PChar(A_sText)));
        PostMessage(HD,WM_KEYDOWN,VK_RETURN,0);  //发回车命令
      end;
    end;
    //撤销连接
    AttachThreadInput(T2,T1,False);
  end;
  //HD := GetFocus; //如果单独用,只能获得当前应用程序的焦点所在控件的句柄。
end;

这段代码是发送字符串到当前光标所在位置。可以应用于两个不同的程序。你看下,不明白再问。


这个我实现不了,我测试过:弹出一个记事本,然后再焦点处把STR的值传过去,但是实现不了。
我要说明一下,我调用的EXE程序不是用DELPHI开发的,这个应该没关系的吧。


把'TEdit'改成'Edit',如果不是delphi写的exe,编辑框的类名不是TEdit,比如PB的就是edit,记事本好像也是edit的类名。
[/Quote]

不好意思,我实现不了。你能否做个例子,然后发给我。Q:14308807,万分感谢!
风之谷 2009-10-30
  • 打赏
  • 举报
回复
const WM_Str=WM_APP+1;
var
h:handle;

h:=findwindow(nil,'你要的窗体')
sendmessage(h,MW_str,integer(Pchar('内容1')),Integer(Pchar('内容2')));


接收消息处:
const WM_Str=WM_APP+1;
type
TWMSTR= record
Msg:Cardinal;//该记录对应的消息。
Name:Integer;//内容1
Time:Integer;//内容2;
Result:Longint;
end;


private
procedure OnWMsStr(var MSG:TWMSTR); message WM_Str;


procedure TForm1.OnWMsStr(var Msg: TWMStr);
begin
ShowMessage(String(Pchar(MSG.NAME)));//相应消息 可获得消息参数质
end;

虎滴小猪猪 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 rocket204 的回复:]
引用 3 楼 ljfwyh 的回复:
{发卡信息给焦点所在可编辑框}
procedure TMainForm.SendCardNOTOEdit(const A_sText: string);
var
  cn: array[0..255] of Char;
  HD: HWND;
  T1,T2: DWORD;
begin
  (*获得焦点所在窗口句柄,可以是除本身外的所有其他应用程序。
  如果焦点所在子窗体中,则获得的是父窗口句柄。*)
  HD := GetForegroundWindow;
  if HD > 0 then
  begin
    //通过焦点所在窗口的句柄,获得其线程的标识符
    T1 := GetWindowThreadProcessId(HD);
    //通过本身的句柄,获得本身的线程的标识符
    T2 := GetWindowThreadProcessId(Application.Handle);
    //共享焦点
    AttachThreadInput(T2,T1,True);
    HD := GetFocus;
    if (HD > 0) then
    begin
      GetClassName(HD,cn,Length(cn));
      if Trim(cn) = 'TEdit' then //类名
      begin
        SendMessage(HD,WM_SETTEXT,1,LongInt(PChar(A_sText)));
        PostMessage(HD,WM_KEYDOWN,VK_RETURN,0);  //发回车命令
      end;
    end;
    //撤销连接
    AttachThreadInput(T2,T1,False);
  end;
  //HD := GetFocus; //如果单独用,只能获得当前应用程序的焦点所在控件的句柄。
end;

这段代码是发送字符串到当前光标所在位置。可以应用于两个不同的程序。你看下,不明白再问。



这个我实现不了,我测试过:弹出一个记事本,然后再焦点处把STR的值传过去,但是实现不了。
我要说明一下,我调用的EXE程序不是用DELPHI开发的,这个应该没关系的吧。
[/Quote]

把'TEdit'改成'Edit',如果不是delphi写的exe,编辑框的类名不是TEdit,比如PB的就是edit,记事本好像也是edit的类名。

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧