Обрабатывать сообщения Windows в Windows Мауи с помощью WinAPIC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Обрабатывать сообщения Windows в Windows Мауи с помощью WinAPI

Сообщение Anonymous »

Необходимо обрабатывать сообщения, отправленные по каналу. В WPF код обработки сообщений выглядит следующим образом:

Код: Выделить всё

public partial class MainWindow: Window
{
public MainWindow() {
InitializeComponent();

this.SourceInitialized += new EventHandler(OnSourceInitialized);
}
void OnSourceInitialized(object sender, EventArgs e) {
HwndSource source = (HwndSource) PresentationSource.FromVisual(this);
source.AddHook(new HwndSourceHook(HandleMessages));
}
private static IntPtr HandleMessages(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) {
//Handle messages here
if (msg == 49900) {
Debug.WriteLine(wParam);
Debug.WriteLine(lParam);
}

return System.IntPtr.Zero;
}
}
Сообщение приходит, я его обрабатываю. Все работает.
Пытаюсь сделать то же самое в Мауи для Windows. Аналогов AddHook и т.п.. нет, делаю через Windows API.

Код: Выделить всё

[DllImport("user32.dll", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
static extern IntPtr SetWindowsHookEx(int hookType, HookProc lpfn, IntPtr hMod, IntPtr dwThreadId);

private static IntPtr SetHook(HookTypes typeOfHook, HookProc callBack, bool onThread = true)
{
//IntPtr hInstance = LoadLibrary("User32");
ProcessModule module = Process.GetCurrentProcess().MainModule;
IntPtr hModule = GetModuleHandle(module.ModuleName);

using(Process currentProcess = Process.GetCurrentProcess())
using(ProcessModule currentModule = currentProcess.MainModule) {
if (onThread)
return SetWindowsHookEx((int) typeOfHook, callBack, 0, GetCurrentThreadId());
else
return SetWindowsHookEx((int) typeOfHook, callBack, hModule, 0);
//return SetWindowsHookEx((int)typeOfHook, callBack, GetModuleHandle(currentModule.ModuleName), 0);
}
}

private static IntPtr HookCallback(IntPtr hwnd, uint message, IntPtr wParam, IntPtr lParam)
{
// Handle
if (hwnd.ToInt32() == 49900) {
Debug.WriteLine($ "{hwnd}{message} - {lParam} - {wParam}");
}

//_action?.Invoke(message);

return IntPtr.Zero;
}

public static void RegisterWindowMessage(string lpString, Action < string > action)
{
_action = action;
_msg = RegisterWindowMessage(lpString.ToString());

HoockProc = new HookProc(HookCallback);
/*
ProcessModule module = Process.GetCurrentProcess().MainModule;
IntPtr hModule = GetModuleHandle(module.ModuleName);*/

MainThread.BeginInvokeOnMainThread(() => {
var WH_MSGFILTER = SetHook(HookTypes.WH_MSGFILTER, HoockProc);
var WH_CALLWNDPROC = SetHook(HookTypes.WH_CALLWNDPROC, HoockProc);
var WH_CALLWNDPROCRET = SetHook(HookTypes.WH_CALLWNDPROCRET, HoockProc);
var WH_KEYBOARD = SetHook(HookTypes.WH_KEYBOARD, HoockProc);
var WH_KEYBOARD_LL = SetHook(HookTypes.WH_KEYBOARD_LL, HoockProc, false);
var WH_MOUSE = SetHook(HookTypes.WH_MOUSE, HoockProc);
var WH_MOUSE_LL = SetHook(HookTypes.WH_MOUSE_LL, HoockProc, false);
var WH_JOURNALRECORD = SetHook(HookTypes.WH_JOURNALRECORD, HoockProc, false); //
var WH_JOURNALPLAYBACK = SetHook(HookTypes.WH_JOURNALPLAYBACK, HoockProc, false); //
var WH_FOREGROUNDIDLE = SetHook(HookTypes.WH_FOREGROUNDIDLE, HoockProc);
var WH_SYSMSGFILTER = SetHook(HookTypes.WH_SYSMSGFILTER, HoockProc, true); //
var WH_GETMESSAGE = SetHook(HookTypes.WH_GETMESSAGE, HoockProc);
var WH_CBT = SetHook(HookTypes.WH_CBT, HoockProc);
var WH_HARDWARE = SetHook(HookTypes.WH_HARDWARE, HoockProc);
var WH_DEBUG = SetHook(HookTypes.WH_DEBUG, HoockProc);
var WH_SHELL = SetHook(HookTypes.WH_SHELL, HoockProc);
});

}
Для этих перехватчиков установлен IntPtr:
[img]https://i.sstatic. net/h6dHa.png[/img]

Я не получил ответа на сообщение. Что я делаю не так? Дескриптор окна беру правильный, проверял через Spy++

Подробнее здесь: https://stackoverflow.com/questions/760 ... ing-winapi
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Система Windows Обработка итерация и фильтрация с помощью ProcessID - ntquerysysteminformation winapi windows
    Anonymous » » в форуме C#
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Система Windows Обработка итерация и фильтрация с помощью ProcessID - ntquerysysteminformation winapi windows
    Anonymous » » в форуме C#
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Система Windows Обработка итерация и фильтрация с помощью ProcessID - ntquerysysteminformation winapi windows
    Anonymous » » в форуме C#
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Управление панелью задач в Windows из Java с помощью FFM и winapi
    Anonymous » » в форуме JAVA
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Управление панелью задач в Windows из Java с помощью FFM и winapi
    Anonymous » » в форуме JAVA
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»