Anonymous
Обрабатывать сообщения Windows в Windows Мауи с помощью WinAPI
Сообщение
Anonymous » 22 окт 2024, 18:54
Необходимо обрабатывать сообщения, отправленные по каналу. В 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
1729612460
Anonymous
Необходимо обрабатывать сообщения, отправленные по каналу. В WPF код обработки сообщений выглядит следующим образом: [code]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; } } [/code] Сообщение приходит, я его обрабатываю. Все работает. Пытаюсь сделать то же самое в Мауи для Windows. Аналогов AddHook и т.п.. нет, делаю через Windows API. [code][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); }); } [/code] Для этих перехватчиков установлен IntPtr: [img]https://i.sstatic. net/h6dHa.png[/img] Я не получил ответа на сообщение. Что я делаю не так? Дескриптор окна беру правильный, проверял через Spy++ Подробнее здесь: [url]https://stackoverflow.com/questions/76040581/handle-windows-message-in-maui-windows-using-winapi[/url]