Как в трассировке событий для Windows (ETW) использовать EventSource, чтобы указать на Блокнот и получить элемент меню, выбранный в сеансе ETW? - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь понять трассировку событий в Windows (ETW). Что я хочу сделать, так это зафиксировать, какой пункт меню был выбран в Блокноте. Если я нажму Word Wrap, я хочу, чтобы ETW сообщила мне об этом.

Я просмотрел образцы на GitHub. Одним из производителей событий является демонстрация:

namespace TraceEventSamples
{
    // In these demos, we generate events with System.Diagnostics.Tracing.EventSource and read them with ETWTraceEventSource
    // 
    // Normally the EventSource and the ETWTraceEventSource would be indifferent processes, however, we 
    // don't do this here to make the scenario really easy to run.   The code works in the multi-process case, however.  
    namespace Producer
    {
        [EventSource(Name = "Microsoft-Demos-SimpleMonitor")]     // This is the name of my eventSource outside my program.  
        class MyEventSource : EventSource
        {
            // Notice that the bodies of the events follow a pattern:  WriteEvent(ID, <args>) where 
            //     ID is a unique ID starting at 1 and incrementing for each new event method. and
            //     <args> is every argument for the method.  
            // WriteEvent then takes care of all the details of actually writing out the values complete
            // with the name of the event (method name) as well as the names and types of all the parameters. 
            public void MyFirstEvent(string MyName, int MyId) { WriteEvent(1, MyName, MyId); }
            public void MySecondEvent(int MyId) { WriteEvent(2, MyId); }
            public void Stop() { WriteEvent(3); }

            // Typically you only create one EventSource and use it throughout your program.  Thus a static field makes sense.  
            public static MyEventSource Log = new MyEventSource();

            // You don't need to define this override, but it does show you when your eventSource gets commands, which
            // is helpful for debugging (you know that your EventSource got the command.  
            protected override void OnEventCommand(EventCommandEventArgs command)
            {
                EventGenerator.Out.WriteLine("EventSource Gets command {0}", command.Command);
            }

            // We could add Keyword definitions so that you could turn on some events but not others
            // but we don't do this here to keep it simple.  Thus you either turn on all events or none.  
        }

Это создает события для демонстрации, но как я могу вместо этого связать это с Блокнотом? Можно ли использовать ETW для этого типа ведения журнала, зная, что кто-то щелкнул в меню приложения?

Я просмотрел различные вопросы SO, но они не помогли. Один общий c был: Существует ли (встроенный) поставщик ETW от Microsoft для отслеживания событий жизненного цикла ETW? * C ++ Event Tracing для Windows (ETW) оболочки , но не понял, как это мне помогло.

Это заставляет меня думать, что я не смогу сделать это с управляемым кодом, если бы не написал оригинал program: https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.tracing.eventsource?redirectedfrom=MSDN&view=netcore-3.1

То, что я пытаюсь сделать, это зафиксировать, какой пункт меню выбран, и предпринять действия с моей программой, которая перехватила событие. Причина тому - старая программа VB6. Я не могу делать то, что мне нужно, поэтому мое последнее средство - захватить пункт меню и заставить мое приложение делать то, что я хочу. Я хотел начать с простого notepad.exe.

Пользователь VB6 нажимает «Просмотреть X». Мое приложение C# выполняет «Просмотр Y».

...