показать другую форму - PullRequest
0 голосов
/ 12 января 2011

Я хочу показать окна другого приложения, если оно скрыто. Более конкретно, я хочу показать главное окно уже запущенного приложения, если пользователь попытается запустить его снова. Я уже реализовал мониторинг повторных запусков приложений. Попытка сделать как в здесь , но не удалось. Думаю сделать это с помощью удаленного взаимодействия, но я понимаю, что это не лучшая практика, хотя в этом случае мне не нужно беспокоиться о Windows API.

Ответы [ 3 ]

0 голосов
/ 12 января 2011

Еще один довольно простой способ сделать это - использовать событие Windows, представленное в .NET как класс System.Threading.EventWaitHandle.

Создать поток в приложении, все, что он делает, это ожидает именованного события,Когда событие сигнализируется, этот поток будет использовать Form.BeginInvoke, чтобы появилось главное окно, и вернется к ожиданию события.

Из нового экземпляра приложения вам нужно будет только сигнализироватьevent.

Это требует немного меньше работы, чем использование каналов.

Обратите внимание, что в любом случае (с использованием каналов, окон или событий) вам всегда приходится иметь дело с разрешениями.

Например, если UAC включен, а существующий экземпляр приложения запущен с правами администратора, новый экземпляр не сможет отправить ему сообщение, чтобы показать окно, если вы не уверены, что установили правильные разрешения (например, натруба или событие, каким бы ни был ваш метод) заранее.

0 голосов
/ 12 января 2011

Я уже реализовал это с помощью удаленного взаимодействия, но я рассмотрю другие способы сделать это, когда у меня будет больше свободного времени Вот как я это сделал: В классе формы имеем:

        public Main()
    {
        InitializeComponent();            
        this.ShowFromFormShower = new FormShower.ShowFromFormShowerDelegate(this.ShowFromFormShower1);
        FormShower.Register(this);
    }

    private void ShowFromFormShower1()
    {            
        this.Show();
        this.WindowState = FormWindowState.Normal;
        this.BringToFront();            
    }
    public PKW.FormShower.ShowFromFormShowerDelegate ShowFromFormShower;

Также необходимо создать класс удаленного взаимодействия:

    public class FormShower : MarshalByRefObject
{     
    /// <summary>
    /// For remote calls.
    /// </summary>
    public void Show()
    {
        if (FormShower.m == null)
            throw new ApplicationException("Could not use remoting to show Main form because the reference is not set in the FormShower class.");
        else
            FormShower.m.Invoke(FormShower.m.ShowFromFormShower);
    }
    private const int PortNumber = 12312;
    private static Main m = null;
    public delegate void ShowFromFormShowerDelegate();
    internal static void Register(Main m)
    {
        if (m == null) throw new ArgumentNullException("m");
        FormShower.m = m;
        ChannelServices.RegisterChannel(new TcpChannel(FormShower.PortNumber), false);            
        RemotingConfiguration.RegisterActivatedServiceType(typeof(FormShower));
    }
    internal static void CallShow()
    {
        TcpClientChannel c = new TcpClientChannel();
        ChannelServices.RegisterChannel(c, false);
        RemotingConfiguration.RegisterActivatedClientType(typeof(FormShower), "tcp://localhost:"+PortNumber.ToString());
        FormShower fs = new FormShower();
        fs.Show();
    }
}

Таким образом, если пользователь пытается запустить приложение во второй раз, приложение запускает метод FormShower.CallShow.

0 голосов
/ 12 января 2011

Это довольно хакерский способ делать вещи.Я бы посоветовал использовать именованные каналы (System.IO.Pipes) для сигнализации о первой копии вашего приложения.Первая копия, после получения сигнала, активирует само окно.И не беспокойтесь ни о каких разрешениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...