【问题标题】:Delphi: How to send command to other application?Delphi:如何向其他应用程序发送命令?
【发布时间】:2011-09-01 04:46:57
【问题描述】:

如何从其他 Delphi 创建的应用程序发送和接收命令?我想向我编写的另一个应用程序发送命令。

【问题讨论】:

  • 你问的是一个复杂的话题。首先,您的其他应用程序使用什么输入管道?它是基于命令行在标准输入上接受输入吗?你只是想用一些开关来启动它吗?或者它有一些你可以调用的 API?也许它使用信号量或信号?如果不先确定管道,就无法确定如何通信。
  • 没那么复杂。 =p 我只是没那么聪明。
  • 我没有任何暗示的意思。我只是认为您的其他应用程序已经编写好了,在这种情况下,提出交流建议不会很有帮助。如果您没有要与之交互的 API,那么解释如何使用 API 的答案是无关紧要的。
  • 我不太懂英语。请用拉脱维亚语复述。 :D
  • 感谢谷歌翻译(我否认所有错误):Es tā negribēju, lai norādītu uz kaut ko。 Es tikai domāju, citām jūsu pieteikums bija jau rakstīts, šajā gadījumā tossing no komunikacijas ieteikumi nebūtu ļoti nodeerīga。 Ja jums nav API,kas mijiedarbojas ar,tad atbilde izskaidrotu,kā izmantot vienu,nav nozīmes。

标签: windows delphi process delphi-7


【解决方案1】:

查找进程间通信。一些适合您的轻量级选项可能是:

  • 定义您自己的自定义窗口 留言
  • 使用 WM_COPYDATA

【讨论】:

    【解决方案2】:

    Windows 消息可能是一个解决方案 - 可以在此处找到一篇有趣的文章:http://delphi.about.com/od/windowsshellapi/a/aa020800a.htm

    【讨论】:

    • 这是解决方案。没有理由拒绝投票。补偿,+1。
    • @robrok 你很快就会投反对票。这样做会使我们不那么热衷于回答。如果我是你,我会专注于投票。就我个人而言,我从不对自己的问题投反对票。我把它留给其他人。
    • 编辑答案是什么意思?你问了一个问题,我提供了一个答案,这足以满足你的要求。其中没有代码,但这并不意味着它是错误的。您没有要求提供代码。我链接到的文章将帮助您理解消息传递的主题,这是一个在使用 Delphi 或 Windows 编程时非常值得了解的复杂主题。 EOT。
    • Robrok 的意思是,如果您对答案进行编辑(例如,在其末尾添加 %20),那么他可以将反对票更改为赞成票。 [如果您投反对票并等待 5 分钟,则反对票将被“锁定”,除非编辑了问题/答案,否则您无法将其删除或更改为赞成票。]
    • @Andreas:谢谢,我不知道。似乎我仍然必须阅读更多关于 Stack 是如何工作的信息。 @Robrok:请忽略我在评论中写的任何内容。看来我一定是睡得更多了,我最近有点太紧张了。道歉。
    【解决方案3】:

    发件人:

    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.
    

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

    【讨论】:

    • @AndreasNN,这是教程类型的问题,您的答案包含大量无法突出显示 standard way to declare a message handler 的代码(此外,新引入的消息标识符应该在项目之间真正共享,而不是复制-粘贴,但这是更高级的问题)
    • ...写一本关于技术细节的书的重点。此外,我仍然没有看到我上面的方法有任何真正的实际问题。
    • @Andreas Rejbrand,(我复制粘贴它是因为 SO 无法提供更方便的方式来引用用户的显示名称而没有任何缩短和/或修饰)我不同意,重点是教正确的方式™ 从头开始​​(看this,消息处理方法支持上升到TObject)。这就是 VCL,一个旨在将我们与 Windows(或 Qt)设计隔离开来的库!
    • @user 你不能教授堆栈溢出编程!这是一个问答网站。答案中提供的代码必须被理解为具有说明性。无论如何,安德烈亚斯的回答都很棒。
    • @Kev:你是对的。我很抱歉。这对我来说太过分了。 @David:感谢您恢复我的帖子!我很抱歉变得如此沮丧。
    【解决方案4】:

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

    【讨论】:

    • 你有教程吗?
    猜你喜欢
    • 2010-11-14
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    相关资源
    最近更新 更多