Я пытаюсь понять трассировку событий в 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».