c# - 在 C# 4.0 Winform 中为程序(如 MS Word)仅打开一次文件

标签 c# winforms file

我正在开发一个桌面应用程序(C# 4.0 Winforms),其中一个要求是该程序可以打开多次。但是,我不希望用户能够多次打开给定文档(可能会发生不好的事情)。

基本上,我希望它的功能类似于 MS Word(至少是较新的版本),如果您尝试打开一个已经打开的文档,它会将您带到已经打开该文档的程序的实例。

我大部分时间都花在网络开发上,所以可能有一些我不知道的简单解决方案。

所以我确实有两个不同的需求。

1) 防止文件被多次打开 2) 如果他们尝试再次打开它,请将实例置于前台。

我可以想到几种方法来处理#1,但我很好奇其他人是如何解决这个问题的。

实际上,我真的不知道从哪里开始尝试让 #2 工作,而不制作一些保持打开状态并创建子程序的主表单/流程。 IE 创建另一个窗体来实际控制当前程序主窗体的打开和关闭,因此它更像是“选项卡式”体验,而不是实际的多窗口体验。更像是旧式 MDI(这仍然会留下问题#1)。

这里的任何帮助(要阅读的站点、要查看的命名空间等)将不胜感激。

编辑 - 我看到该内容已被标记为重复项,并且“重复项”位于页面顶部。我的要求之一是该程序必须能够多次打开。你们甚至读过这篇文章吗?其他人可以进来投票重新讨论这个问题吗?

进一步编辑 - 我采用了互斥体的想法,以防止程序多次打开同一文档。我从来没有找到一种简单的方法来确定程序的哪个实例打开了文档并将其放在前面,所以我暂时放弃了,只是弹出一个消息框告诉他们文档已经打开。命名管道对此似乎有点矫枉过正,因为它不完全是我想要做的,并且会涉及大量开销(而且 WCF 并不是世界上最简单的事情),因此任何进一步的帮助将不胜感激。 p>

最佳答案

您正在询问互斥体。在 Windows 中,您可以创建 MUTEX(互斥标志),因此即使进程的第二个实例打开,它也会尝试创建互斥体,然后失败。互斥锁是操作系统范围内的全局变量(某种程度上),用于此目的并用于 IPC/协调。

另一种方法是这样 - 创建一个具有类名的窗口(类如 Windows API 中的类,而不是 C# 或 C++ 中的类),其中嵌入了文档名称,并使用 FindWindow() 函数首先查看此类窗口是否已打开。然后,您可以 SendMessage(HWND) 向该窗口发送一条消息,将其置于前面,因此,如果用户在资源管理器中单击“myfile.doc”并且它已经打开 - 您只需将其置于前面即可。 要查看的 API(从我的大脑内存中,我如何记住这些东西?):

 CreateMutex() / OpenMutex()
 FindWindow() / CreateWindow()
 SendMessage() / PostMessage()
 ShowWindow()/ SetWindowPosition()/BringWinToTop()

关于c# - 在 C# 4.0 Winform 中为程序(如 MS Word)仅打开一次文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14087406/

相关文章:

c# - Entity Framework Core 2.0.0 在不同项目中的迁移

c# - C#面试题

winforms - 未知处理时间的进度条

c# - 动态添加选项卡到 TabControl 容器

c++ - 用C++快速读写文件

php - 文件上传不工作 | PHP

c# - ResourceManager 和不受支持的平台

c# - Protobuf-net 使用接口(interface)和抽象基类创建类型模型

c# - winforms应用程序中的Winforms WebBrowser网页触发事件

通过过滤多个条件重命名 Powershell 文件