Adler_lug
@Adler_lug

Как в запущенной ранее программе открыть новую ссылку в имеющемся WebBrowser через командную строку?

Нужно в моей программе, в WebBrowser открывать ссылки, передаваемые сторонней программой через командную стороку, т.е к примеру "My.exe google.com", но что бы моя программа не запускалась каждый раз снова, а страница обновлялась в имеющемся WebBrowser уже запущенной My.exe.
Запрет запуска второго экземпляра программы реализовал так:
C#
[STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            SingleInstanceApplication.Run(new Form1(), StartupNextInstanceHandler);
        }
        static void StartupNextInstanceHandler(object sender, StartupNextInstanceEventArgs e)
        {
         // не совсем понимаю надо ли это мне и что тут должно быть   
        }

public class SingleInstanceApplication : WindowsFormsApplicationBase
    {
        private SingleInstanceApplication()
        {
            base.IsSingleInstance = true;
        }
 
        public static void Run(Form f, StartupNextInstanceEventHandler startupHandler)
        {
            SingleInstanceApplication app = new SingleInstanceApplication();
            app.MainForm = f;
            app.StartupNextInstance += startupHandler;
            app.Run(Environment.GetCommandLineArgs());
        }
    }


Дальше:
C#
public Form1()
        {
            SetBrowserFeatureControl(); // прописываются ключи в реестр 
 
            InitializeComponent();
            webBrowser1.ScriptErrorsSuppressed = true;
 
            string[] arg = Environment.GetCommandLineArgs();
            
 
            string login;
            string password;
            if (arg.Length == 2)
            {
                if (CheckURL(@arg[1]))
                {
                    webBrowser1.Navigate(@arg[1]);
                    MessageBox.Show("Должна открыться новая страница " + @arg[1]); // debug
                }
            }
// дальше другой код
        }

Если программу с параметром запускать первый раз (соответственно с параметром командой строки), то все хорошо, страница открывается, но если повторно попробовать запустить (передав ей новый адрес в качестве параметра), то страница не обновляется. При этом сообщение "Должна открыться новая страница " отображается с нужным новым адресом, т.е. до этого места доходит, но webBrowser1.Navigate не отрабатывает.

Не пойму что не так и в какую сторону смотреть...
  • Вопрос задан
  • 658 просмотров
Решения вопроса 1
Adler_lug
@Adler_lug Автор вопроса
Разбрался уже. Надо было сделать так (остальной код прежний):
static void StartupNextInstanceHandler(object sender, StartupNextInstanceEventArgs e)
        {
            SingleInstanceApplication sia = (SingleInstanceApplication)sender;
            Form1 f = (Form1)sia.ApplicationContext.MainForm;
            if (e.CommandLine.Count == 2)
            {
                string link = e.CommandLine[1];
                if (f.CheckURL(link))
                {
                    f.webBrowser1.Navigate(link);
                }
            }
        }

Нечто похожее пробовал, но не правильно. Ключевое в этом:
SingleInstanceApplication sia = (SingleInstanceApplication)sender;
Form1 f = (Form1)sia.ApplicationContext.MainForm;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
petermzg
@petermzg
Самый лучший программист
Вам нужно не запрет запуска второго экземпляра делать, а отслеживать уже запущенный экземпляр.

При повторном запуске с параметрами, программа проверяет запущен ли еще экземпляр, если запущен, то передает в него нужные параметры и завершает работу.
Для передачи параметров изучайте межпроцессное взаимодействие (Именованные каналы, сокеты, оконные сообщения windows, разделяемые файлы и т.д.)
Ответ написан
Комментировать
AlexXYZ
@AlexXYZ
O Keep Clear O
Если вы сделаете в своей программе внедрённый web-сервер и настроите у него простой обработчик url-параметров, то через эти параметры сможете передать ей любой url, чтобы его запустить в вашей программе.
1. Вот на вскидку народ обсуждает embedded web-сервера на c#: https://stackoverflow.com/questions/4268814/embedd...
2. Клиентом для вашей программы может быть любой браузер, в котором вы в качестве параметра укажете желаемый url, или напишите простого клиента на любом языке, чтобы только послать запрос. Для проверки работоспособности вашего внедрённого web-сервера можно использовать fiddler2.
Можно эти два свойства объедениям и в одной программе.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы