Код: Выделить всё
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);
});
}
[img]https://i.sstatic. net/h6dHa.png[/img]
Я не получил ответа на сообщение. Что я делаю не так? Дескриптор окна беру правильный, проверял через Spy++
Подробнее здесь: https://stackoverflow.com/questions/760 ... ing-winapi