问题描述
假设我的程序的一个实例正在运行。它打开了“File1.My”(无论是什么)。
现在用户双击 WinExplorer 'File2.My'。 “我的”扩展名与我的程序相关联,因此将启动第二个实例。我使用 WMcopYDATA 将文件名 ('File2') 从第二个实例传递到第一个实例。第一个实例将接收加载该文件的文件名。第二个实例将自行关闭。
我的问题是 WMcopYDATA 消息可能会在第一个实例显示一个对话框时出现,例如“您确定要将 File1 保存到磁盘吗?”。
当消息到达时,第一个实例将加载 File2 同时 dlg 框显示在屏幕上询问“File1”。
那么,我该如何处理??
- 也许可以将 Load(File2) 放入我在对话框关闭后处理的队列中?
- 或者,也许我应该在模式对话框打开时从消息队列中过滤 WMcopyData?
- 使用某种标志:如果 WMcopyDataReceived_Flag 则 Abort_current_code_after_the_dlgBox
所有 3 个似乎都比必要的复杂。
解决方法
我的问题是 WMCOPYDATA 消息可能会在第一个实例显示一个对话框时出现,例如“您确定要将 File1 保存到磁盘吗?”。
当消息到达时,第一个实例将加载 File2,同时屏幕上会显示 dlg 框,询问“File1”。
这有什么问题?对话框的消息循环仍然会将 WM_COPYDATA
消息分派给正确的窗口消息过程。您应该单独处理每个文件。您的应用是否不允许同时加载多个文件?
那么,我该如何处理??
- 也许可以将 Load(File2) 放入我在对话框关闭后处理的队列中?
如果您不想在对话框运行时加载新文件,那么是的,这就是您必须做的。特别是因为用户可能会在对话框运行时尝试加载多个文件(甚至多次加载同一个文件)。
否则,只需在对话框运行时完全忽略 WM_COPYDATA
消息。也许将另一条消息发送回第二个实例,告诉它 WM_COPYDATA
消息已被忽略,因此它可以通知用户稍后再试。在第二个实例发送 WM_COPYDATA
之后,让它在退出前等待几秒钟,以防这样的回复进来。也许总是发送回复,相应的 ACK 或 NACK,并使第二个实例等待任一回复.
- 或者,也许我应该在模式对话框打开时从消息队列中过滤 WMCopyData?
不,尤其是因为无论如何您都无权进行这种过滤。 WM_COPYDATA
是一个 sent message,而不是一个 posted message,所以消息队列永远不会看到它,但是在消息队列上执行消息检索会自动调度它。
- 使用某种标志:如果 WMCopyDataReceived_Flag 则 Abort_current_code_after_the_dlgbox
我什至不明白你想用它做什么。