Mutex类被误解了,而Global mutex则更是如此.
在创建全局互斥锁时使用什么是好的,安全的模式?
一个会起作用的
我使用ClickOnce安装部署了我的C#WinForms应用程序.一切正常(经过大量工作):),但现在我遇到了一个问题:
每当我单击"开始"菜单中的应用程序快捷方式时,都会启动一个新实例.我需要避免这种情况.
我该怎么做才能防止多次发布?
来自MSDN:
返回值true表示已启动新的进程资源.如果StartInfo属性的FileName成员指定的进程资源已在计算机上运行,则不会启动其他进程资源.而是重用正在运行的进程资源并返回false.
尝试这样的事情:
var info = new ProcessStartInfo {FileName = @"CMD"};
var p1 = new Process
{
StartInfo = info
};
var result = p1.Start(); //true
result = p1.Start(); //true
var p2 = new Process
{
StartInfo = info
};
result = p2.Start(); //true
Run Code Online (Sandbox Code Playgroud)
如果我使用FilePath = @"c:\myapp.exe"而不是使用相同的结果CMD.
在什么情况下会返回false?
对不起,标题很难理解.我不确定如何说出来.
我有一个应用程序,只允许每个用户会话运行一个实例.如果用户再次单击以启动应用程序,我希望将该应用程序重点关注.
该窗口可能具有折叠的可见性.
如果它可见,我知道我可以使用
if (IsIconic(hWnd))
{
ShowWindowAsync(hWnd, swRestore);
}
SetForegroundWindow(hWnd);
Run Code Online (Sandbox Code Playgroud)
但是如果窗户折叠了,有没有办法让我把它带回可见的?
我正在寻找在单独的类库项目中定义的窗口(WPF)作为新的单独进程.有没有办法做到这一点?
我需要在新进程中启动第二个项目实例,因为当我以这种方式启动它时会占用内存:
secondProject.WPFWindow win = new secondProject.WPFWindow();
win.Show();
Run Code Online (Sandbox Code Playgroud)
我有一个包含多个项目的解决方案.
现在我通过以下代码运行"应用程序"(此解决方案中构建为dll的其他项目):
secondProject.WPFWindow win = new secondProject.WPFWindow();
win.Show();
Run Code Online (Sandbox Code Playgroud)
我想要在新进程中运行应用程序...通常我会使用Process.Start(),但我不能这样,因为它需要exe文件作为agrument我有(并且想要)DLL.
为了防止用户运行我的应用程序的多个实例,我使用此代码: -
Process[] pArry = Process.GetProcesses();
int nCount = 0;
foreach (Process p in pArry)
{
string ProcessName = p.ProcessName;
ProcessName = ProcessName.ToLower();
if (ProcessName.CompareTo("myApp") == 0)
{
nCount++;
}
}
if (nCount > 1)
{
MessageBox.Show(AppAlreadyRunning,"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
Process.GetCurrentProcess().Kill();
}
Run Code Online (Sandbox Code Playgroud)
但正如我们所知,如果更改exe名称,进程名称会更改.因此,如果用户将"myApp.exe"更改为"UserApp.exe",则此修补程序将无效!有什么出路吗?
我在VS2010中使用C#.谢谢!
如何确保我的应用程序的单个实例,并在尝试打开第二个实例时将焦点设置为它?
我试过了:
public partial class Form1 : Form {
[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
public static extern
IntPtr FindWindow(String lpClassName, String lpWindowName);
[DllImport("USER32.DLL")]
public static extern
Boolean SetForegroundWindow(IntPtr hWnd);
private void Form1_Load(object sender, EventArgs e)
{
bool isRunning = Process.GetProcesses()
.Where(p => p.MainWindowTitle.Contains(Text))
.Count() > 1;
if (isRunning)
{
FocusWindow(Text);
Application.Exit();
}
}
public static void FocusWindow(string title)
{
SetForegroundWindow(FindWindow(null, title));
}
}
Run Code Online (Sandbox Code Playgroud)
这不是关注应用程序.我怎样才能解决这个问题?
我是否检查是否存在另一个具有相同名称的进程?(如果用户没有这样的权限怎么办?)
将文件写入磁盘并在退出前将其删除?(异常终止怎么办?)
这样做的最佳做法是什么?
是否有可能以某种方式从"外部"通知正在运行的进程?
我有一个理论上永远存在的C#程序.我想通知它手动触发一些动作.如果在Windows和Linux(单声道)上可以使用此解决方案,那将是最好的.
编辑:
Task该类来保持活跃状态如何将我的C#winform程序转换为服务程序?
我需要我的程序将像服务一样工作(如监听器)
我只是在C#中创建一个应用程序,但我不喜欢它.我想让应用程序运行一次.现在,如果我的应用程序正在运行,当我再次运行应用程序时,将启动另一个应用程序.我想让应用程序只运行一次,如果你想再次运行应用程序,而不是创建另一个应用程序,而是启动正在运行的应用程序.
谢谢.