Windows Delphi:如何向其他应用程序发送命令?

Windows Delphi:如何向其他应用程序发送命令?,windows,delphi,process,delphi-7,Windows,Delphi,Process,Delphi 7,如何从其他Delphi创建的应用程序发送和接收命令?我想向我编写的另一个应用程序发送命令。查找进程间通信。以下是一些适合您的轻量级选项: 定义自己的自定义窗口 信息 使用WM_COPYDATA Windows邮件可能是一个解决方案-可以在此处找到一篇有趣的文章:发件人: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialo

如何从其他Delphi创建的应用程序发送和接收命令?我想向我编写的另一个应用程序发送命令。
查找进程间通信。以下是一些适合您的轻量级选项:

  • 定义自己的自定义窗口 信息
  • 使用WM_COPYDATA

Windows邮件可能是一个解决方案-可以在此处找到一篇有趣的文章:

发件人:

unit Unit1;

interface

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

const
  WM_MY_MESSAGE = WM_USER + 1;

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

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  h: HWND;
begin
  h := FindWindow(nil, 'My Second Window');
  if IsWindow(h) then
    SendMessage(h, WM_MY_MESSAGE, 123, 520);
end;

end.
接收人:

unit Unit1;

interface

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

const
  WM_MY_MESSAGE = WM_USER + 1;

type
  TForm1 = class(TForm)
  private
    { Private declarations }
  protected
    procedure WndProc(var Message: TMessage); override;    
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WndProc(var Message: TMessage);
begin
  inherited;
  case Message.Msg of
    WM_MY_MESSAGE:
      ShowMessageFmt('The other application sent the data %d and %d.', [Message.WParam, Message.LParam]);
  end;
end;

end.

确保接收表单的标题为“我的第二个窗口”。

如果您同时编写这两个应用程序,TCP/IP可能是比windows消息更干净的解决方案。这两个应用程序甚至可以位于网络中的不同计算机上

你所问的是一个复杂的问题。首先,您的其他应用程序使用什么输入管道?是基于命令行接受标准输入吗?你只是想用一些开关来启动它吗?或者它是否有一些可以调用的API?也许它使用信号量或信号?如果不先确定管道,就无法确定如何通信。这并不复杂=我只是不那么聪明。我不是有意暗示什么的。我只是认为你的另一个应用程序已经编写好了,在这种情况下,抛开沟通建议并没有多大帮助。如果你没有API可以交互,那么解释如何使用API的答案就无关紧要了。我不太懂英语。请用拉脱维亚语复述谷歌翻译学院(我否认所有错误):Estānegribēju,lai norādītu uz kaut ko。这就是解决办法。没有理由否决投票。补偿,+1。@robrok你很快就投了反对票。这样做会使我们不那么热衷于回答问题。如果我是你,我会集中精力投票。就我个人而言,我从不对自己的问题投反对票。我把这个留给其他人。你说的编辑答案是什么意思?你问了一个问题,我提供了一个答案,这就足够了。它没有代码,但这并不意味着它是错误的。您没有要求输入代码。我链接的文章将帮助您理解消息传递的主题,这是一个在使用Delphi或Windows编程时非常值得了解的复杂主题。EOT。Robrok的意思是,如果你对你的答案进行编辑(例如,在答案末尾添加一个%20),那么他可以将他的反对票改为赞成票。[如果你向下投票并等待五分钟,向下投票将被“锁定”,除非问题/答案被编辑,否则你无法将其删除或更改为向上投票。]@Andreas:谢谢,我不知道这一点。看来我一定读过更多关于Stack是如何工作的@罗布罗克:请忽略我在评论中写的任何东西。看来我得多睡一会儿了,我最近太紧张了。抱歉。@AndreasNN,这是一个教程类型的问题,您的答案包含大量代码,但没有突出显示一个(另外,新引入的消息标识符应该在项目之间共享,而不是复制粘贴,但这是更高级的问题)…写一本关于技术细节的书的要点。此外,我仍然不认为我的上述方法有任何实际问题。@Andreas Rejbrand(我复制粘贴了它,因为SO没有提供更方便的方式引用用户的显示名称,而没有任何形式的缩短和/或损坏)。我不同意,重点是教给正确的方法™ 从一开始(请看,消息处理程序方法支持上升到
TObject
)。这是VCL,一个旨在将我们与Windows(或Qt)设计隔离开来的库@用户:您不能在堆栈溢出上教授编程!这是一个问答网站。答案中提供的代码必须理解为说明性代码。安德烈亚斯的回答无论如何都是极好的。@Kev:你说得对。我很抱歉。这对我来说太过分了@大卫:谢谢你回复我的帖子!我很抱歉变得这么沮丧。你有任何指导吗?