在.NET(而不是Windows窗体或控制台)下使用C#和WPF ,创建只能作为单个实例运行的应用程序的正确方法是什么?
我知道这与一些叫做互斥的神秘事物有关,我很少能找到一个不愿意停下来解释其中一个是什么的人.
代码还需要通知已经运行的实例用户尝试启动第二个,并且如果存在任何命令行参数,也可以传递.
有人可以显示如何检查程序的另一个实例(例如test.exe)是否正在运行,如果是,则停止加载应用程序(如果有现有实例).
我有一个Windows程序,里面有两个2个窗口:
hwnd (main interface)
hwnd2 (toplevel window, no parent, created by hwnd)
Run Code Online (Sandbox Code Playgroud)
当我双击hwnd时,我需要hwnd2弹出并显示一些数据,所以我使用这个函数将hwnd2带到顶部:
BringWindowToTop(hwnd2);
Run Code Online (Sandbox Code Playgroud)
hwnd2被带到了顶峰,但有一点奇怪.当我再次点击hwnd2时,hwnd(主界面)会自动再次弹出.我试图使用以下函数来解决这个问题,但它们没有工作.
SetWindowPos(hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
//doesn't work
BringWindowToTop(hwnd2); //This is the function brings hwnd2 to top
SetForegroundWindow(hwnd2); //doesn't work
SetWindowPos(hwnd2, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
//doesn't work
SetWindowPos(hwnd2, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
// hwnd2 "always" on top, not what I want
SetActiveWindow(hwnd2); // doesn't work too (for replying to Magnus Skog, thanks)
SwitchToThisWindow(hwnd2, TRUE);// …Run Code Online (Sandbox Code Playgroud) 我有一个处理.net(proc.MainWindowHandle)中另一个进程的主窗口.如何最大化.net内部的窗口?
我在 C# 中为 Internet Explorer 开发了一个工具栏,用于从外部应用程序发送和接收 URL。它在 IE6 中运行良好,但我想在新版本 (IE7) 中利用标签式浏览,但我在那里遇到了障碍。似乎在 IE7 中,每个选项卡都计为一个单独的实例,因此是我的工具栏的一个单独实例。
对于我的一生,我找不到一种方法让单个实例出现在单个 IE 窗口中的每个选项卡上。我所能做的就是注册为 ROT 的 com 对象,并让每个实例进行通信并镜像所有其他实例,但这似乎不必要地复杂。有没有人找到解决方法?
WPF应用程序是否可以检查应用程序的任何其他实例是否正在运行?我正在创建一个应该只有一个实例的应用程序,当用户再次尝试打开它时,它会提示"另一个实例正在运行"的消息.
我猜我必须检查进程日志以匹配我的应用程序名称,但我不知道如何去做.
我已经限制我的C#windows应用程序只允许一次运行一个实例,使用这个问题如何强制C#.net应用程序在Windows中只运行一个实例?
它运行良好,并且不允许同时运行多个应用程序实例.
问题是如果用户试图打开应用程序的第二个实例,我希望当前活动的实例能够出现在前面.
我工作的问题似乎解决了这个问题,但它对我不起作用.
我认为这是因为我的应用程序不符合允许该方法的标准:SetForegroundWindow
工作.
我的问题是,我怎样才能做到这一点.我的代码如下:
using System ;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace RTRFIDListener_Client
{
static class Program
{
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
bool createdNew = true;
using (Mutex mutex = new Mutex(true, "RTRFIDListener_Client", out createdNew))
{
if (createdNew)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frm_Main());
}
else
{
Process current …Run Code Online (Sandbox Code Playgroud) 我只是在C#中创建一个应用程序,但我不喜欢它.我想让应用程序运行一次.现在,如果我的应用程序正在运行,当我再次运行应用程序时,将启动另一个应用程序.我想让应用程序只运行一次,如果你想再次运行应用程序,而不是创建另一个应用程序,而是启动正在运行的应用程序.
谢谢.