Как получить форму из MainWindowHandle? - PullRequest
1 голос
/ 22 мая 2009

У меня есть программа, которая позволяет запускать только один экземпляр. Я использую этот код

bool createdNew = true;
using(Mutex mutex = new Mutex(true, "MobilePOSServer", out createdNew))
{
    if(createdNew)
    {

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MainForm());
    }
    else
    {
        Process current = Process.GetCurrentProcess();
        foreach(Process proc in Process.GetProcessesByName(current.ProcessName))
        {
            if(proc.Id != current.Id)
            {
                SetForegroundWindow(proc.MainWindowHandle);
            }
        }
    }
}

Что я хочу сделать, так это обработать аргументы командной строки для вызова некоторых методов start и stop в моей winForm winform. Я могу получить начало просто отлично. Но запуск приложения из нового окна командной строки и попытка вызова метода не работают. Я могу заставить окно выйти вперед. Есть ли способ, как я могу получить мою форму из ручки?

Или лучший способ сделать это?

Ответы [ 3 ]

2 голосов
/ 22 мая 2009
2 голосов
/ 22 мая 2009

Вы не сможете получить ссылку на саму форму, нет - этот объект существует в другом процессе.

Если вы хотите иметь возможность контролировать другой процесс, ему нужно будет предоставить своего рода «удаленный доступ» (где «удаленный» в данном случае означает «вне процесса», а не «на другом компьютере»). «). Это может быть с помощью удаленного взаимодействия .NET, WCF или вашего собственного простого протокола, основанного на сокетах, именованных каналах и т. Д. Однако, это может быть немного трудновато - так что взвесите, сколько вы действительно хотите эта функция, прежде чем вы начнете вкладывать в нее слишком много работы.

1 голос
/ 22 мая 2009

Если методы, которые вы хотите выполнить в удаленном приложении, просты, вы также можете использовать SendMessage / PostMessage, чтобы отправить сообщение Windows другому приложению и инициировать выполнение операций.

Если вам действительно нужно больше взаимодействия с другим экземпляром, чем с простым триггером, мне придется пойти с ответом Джона, и я выберу WCF с именованными каналами. По его словам, это будет более сложное решение, и вы должны подумать, насколько важна эта функция для приложения.

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