Имейте пункт контекстного меню, передавайте параметры службе Windows, в то время как это работает - PullRequest
1 голос
/ 06 февраля 2011

У меня есть простая служба Windows, называемая, скажем, «MyService», построенная с использованием WCF, которая при запуске добавляет запись реестра в «HKEY_CLASSES_ROOT \ Folder \ Shell \ {ContextMenuEntryName}», таким образом позволяя меню правой кнопки мыши в любом месте окна иметьзапись с именем: {ContextMenuEntryName}.Целью, выполняемой при нажатии на эту запись, является другая программа, например "{Path} \ serviceclient.exe% 1".«% 1» дает мне путь к папке Windows, в которую было вызвано это контекстное меню.Затем эта программа принимает это значение и передает его моей службе, создав прокси службы и вызвав ее метод.

Код WindowsService для его метода OnStart выглядит следующим образом:

    protected override void OnStart(string[] args)
    {            
            if (_serviceHost != null)
            {
                _serviceHost.Close();
            }

            // Add registry entry for context menu option                             System.IO.Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
            string contextMenuCommandPath =
                Environment.CurrentDirectory.Substring(0, Environment.CurrentDirectory.IndexOf("MyService")) +
                "serviceclient\\bin\\Debug\\serviceclient.exe %1";
            _contextMenu.AddContextMenu(ContextMenuName, contextMenuCommandPath, "Folder");
            _contextMenu.AddContextMenu(ContextMenuName, contextMenuCommandPath, "*");

            // Create a ServiceHost for the CalculatorService type and 
            // provide the base address.
            _serviceHost = new ServiceHost(typeof(MyService));

            // Open the ServiceHostBase to create listeners and start 
            // listening for messages.
            _serviceHost.Open();           
    }

После добавления ссылки на службу «MyService» файл serviceclient.exe имеет следующий код:

        // Instantiate service proxy
        var myServiceClient = new MyService.MyServiceClient();
        // Execute monitor target based on path specified (or default).
        myServiceClient .Monitor(args.Length > 0 ? args[0] : string.Empty);

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

Возможно ли, чтобы пункт контекстного меню непосредственно передавал информацию службе Windows в WCF во время ее работы?

Ответы [ 2 ]

1 голос
/ 06 февраля 2011

На первый взгляд не похоже, но это сложный вопрос. См. Создание обработчиков контекстного меню .

0 голосов
/ 07 февраля 2011

Если вы внедрили сервер именованных каналов внутри службы Windows, возможно, вы могли бы отправить данные пути к файлу непосредственно из команды контекстного меню с помощью чего-то вроде:

echo %1 > \\.\pipe\{pipe-name}

Однако вы не можете использовать стандартную WCF NetNamedPipeBinding для реализации конвейерного сервера, поскольку все требования протокола .NET включены в эту привязку, поэтому вам придется сделать это либо с помощью классы System.IO.Pipes или написать собственный транспорт WCF, который просто получает необработанные сообщения из канала.

...