Я пытаюсь подписаться на сообщения о событиях Windows / систему обмена сообщениями из ядра c # net через c ++ dll без изменений, используя pinvoke.
У меня проблемы.
Получение дескриптора для моего процесса или создание пустого окна (поддерживает ли .net это).
var hwnd = Process.GetCurrentProcess().Handle;
var hwnd1 = Process.GetCurrentProcess().Handle.ToPointer();
Является ли что-либо из этого действительным, чтобы получить ручку.
Как мне маршалировать этот дескриптор типа c ++ HWND
. IntPtr
кажется очевидным выбором, но он не работает.
Вот что я использую для подписки на события
public class MsgSubscribe : IDisposable
{
private readonly Importer _importer;
[UnmanagedFunctionPointer(CallingConvention.Winapi)]
private delegate Status DMsgSubscribe(uint msgType, uint msgQ, int hwnd, uint msgId);
private static DMsgSubscribe _dMsgSubscribe;
private IntPtr PMsgSubscribe { get; set; }
public bool Available { get; set; }
public MsgSubscribe(Importer importer)
{
_importer = importer;
if (_importer.hCurModule != IntPtr.Zero)
{
PMsgSubscribe = Importer.GetProcAddress(_importer.hCurModule, "MsgSubscribe");
Available = PUlyMsgSubscribe != IntPtr.Zero;
}
}
public Status MsgSubscribe(uint msgType, uint msgQ, int hwnd, uint msgId)
{
Status result = Status.FunctionNotAvailable;
if (Available)
{
_dMsgSubscribe = (DMsgSubscribe)Marshal.GetDelegateForFunctionPointer(PMsgSubscribe, typeof(DMsgSubscribe));
result = _dMsgSubscribe(msgType, msgQ, hwnd, msgId);
}
return result;
}
public void Dispose()
{
}
}
Я пробовал IntPtr
и int
для HWND
сортировки, ни один не работает.
Кроме того, я не уверен, как я должен отлавливать события, основанные на сообщениях окна, в Интернете очень мало всего, если что-либо.
Любая помощь приветствуется.