【问题标题】:How to pass a filename from a second instance of a program to the main instance?如何将文件名从程序的第二个实例传递到主实例?
【发布时间】:2021-02-17 16:47:30
【问题描述】:

假设我的程序的一个实例正在运行。它打开了“File1.My”(不管是什么)。
现在用户双击 WinExplorer 'File2.My'。 “我的”扩展与我的程序相关联,因此将启动第二个实例。我使用 WMCOPYDATA 将文件名('File2')从第二个实例传递给第一个实例。第一个实例将接收文件名加载该文件。第二个实例将自行关闭。

我的问题是 WMCOPYDATA 消息可能会出现,而第一个实例显示一个对话框,如“您确定要将 File1 保存到磁盘吗?”。
当消息到达时,第一个实例将加载 File2屏幕上显示 dlg 框询问“File1”。
那么,我该如何处理呢?

  1. 也许通过将 Load(File2) 放入我在对话框关闭后处理的队列中?
  2. 或者我应该在打开模式对话框时从消息队列中过滤 WMCopyData?
  3. 使用某种标志:如果 WMCopyDataReceived_Flag 然后 Abort_current_code_after_the_dlgbox

这三个似乎都比必要的复杂。

【问题讨论】:

  • 用户打开了第二个文件并期待发生一些事情。如果什么都没做,他们可能会再打开几次,想知道发生了什么。做什么取决于您的应用程序是否可以同时打开多个文件 - 在另一个选项卡中打开 file2 在当今的许多应用程序中很常见。
  • @Brian-Nope。一次只能打开一个文件至关重要!
  • @Brian - 如果文件无法打开,则会向第二个实例发送一条消息,让用户知道。
  • “只有一个实例”的方法有几个缺点,最大的缺点是:当您认为实例已终止但继续运行数小时(直到您检查任务人员)并且您尝试启动一个(即通过双击一个文件)似乎什么都没有发生。一次又一次。
  • 那么您应该在 UI 执行不允许加载新文件的操作时关闭 WMCOPYDATA 消息...这将需要您设置一些标志来检测是否...。

标签: delphi message-queue message


【解决方案1】:

我的问题是 WMCOPYDATA 消息可能会出现,而第一个实例显示一个对话框,如“您确定要将 File1 保存到磁盘吗?”。
当消息到达时,第一个实例将加载 File2,同时屏幕上显示 dlg 框询问“File1”。

这有什么问题?对话框的消息循环仍会将WM_COPYDATA 消息发送到正确的窗口消息过程。您应该单独处理每个文件。您的应用不允许同时加载多个文件吗?

那么,我该如何处理呢?

  1. 也许通过将 Load(File2) 放入我在对话框关闭后处理的队列中?

如果您不想在对话框运行时加载新文件,那么是的,这就是您必须做的。尤其是因为用户可能会在对话框运行时尝试加载多个文件(甚至多次加载同一个文件)。

否则,在对话框运行时完全忽略WM_COPYDATA 消息。也许将另一条消息发送回第二个实例,告诉它WM_COPYDATA 消息被忽略,因此它可以通知用户稍后再试。在第二个实例发送WM_COPYDATA 后,让它在退出前等待几秒钟,以防收到这样的回复。也许总是回复一个回复,相应的 ACK 或 NACK,并让第二个实例等待任何一个回复。

  1. 或者我应该在打开模式对话框时从消息队列中过滤 WMCopyData?

不,尤其是因为您无论如何都无权进行这种过滤。 WM_COPYDATAsent message,而不是 posted message,因此消息队列永远不会看到它,但在消息队列上执行消息检索会自动调度它。

  1. 使用某种标志:如果 WMCopyDataReceived_Flag 然后 Abort_current_code_after_the_dlgbox

我什至不明白你想用它做什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 2019-05-05
    • 1970-01-01
    • 2015-01-21
    • 2020-04-29
    相关资源
    最近更新 更多