Work on handling inputs

We still need to intercept SharpDX inputs
This commit is contained in:
2024-11-09 03:41:25 -05:00
parent 303b765940
commit ed8d307843
2 changed files with 24 additions and 35 deletions

View File

@@ -22,8 +22,8 @@ internal class ImGuiHandler : IDisposable
public static RenderTargetView? Rtv; public static RenderTargetView? Rtv;
public ImGuiIOPtr Io { get; private set; }
private readonly IRootRenderComponent _renderHandler = new RenderHandler(); private readonly IRootRenderComponent _renderHandler = new RenderHandler();
private static bool _init;
public unsafe void Init(nint windowHandle, Device1 device, DeviceContext deviceContext) public unsafe void Init(nint windowHandle, Device1 device, DeviceContext deviceContext)
{ {
@@ -31,17 +31,18 @@ internal class ImGuiHandler : IDisposable
CreateContext(); CreateContext();
Io = GetIO(); var io = GetIO();
var path = Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "CringeLauncher", "imgui.ini"); var path = Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "CringeLauncher", "imgui.ini");
Io.NativePtr->IniFilename = AnsiStringMarshaller.ConvertToUnmanaged(path); io.NativePtr->IniFilename = AnsiStringMarshaller.ConvertToUnmanaged(path);
Io.ConfigWindowsMoveFromTitleBarOnly = true; io.ConfigWindowsMoveFromTitleBarOnly = true;
Io.ConfigFlags |= ImGuiConfigFlags.DockingEnable | ImGuiConfigFlags.ViewportsEnable; io.ConfigFlags |= ImGuiConfigFlags.DockingEnable | ImGuiConfigFlags.ViewportsEnable;
ImGui_ImplWin32_Init(windowHandle); ImGui_ImplWin32_Init(windowHandle);
ImGui_ImplDX11_Init(device.NativePointer, deviceContext.NativePointer); ImGui_ImplDX11_Init(device.NativePointer, deviceContext.NativePointer);
_init = true;
} }
public void HookWindow(HWND windowHandle) public void HookWindow(HWND windowHandle)
@@ -79,10 +80,26 @@ internal class ImGuiHandler : IDisposable
} }
[UnmanagedCallersOnly(CallConvs = [typeof(CallConvStdcall)])] [UnmanagedCallersOnly(CallConvs = [typeof(CallConvStdcall)])]
private static int WndProcHook(HWND hWnd, int msg, nint wParam, nint lParam) private static unsafe int WndProcHook(HWND hWnd, int msg, nint wParam, nint lParam)
{ {
var hookResult = ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam); var hookResult = ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam);
return hookResult == 0 ? CallWindowProc(_wndproc, hWnd, msg, wParam, lParam) : hookResult;
if (hookResult != 0)
return hookResult;
var io = GetIO();
if (!_init)
return CallWindowProc(_wndproc, hWnd, msg, wParam, lParam);
//todo: block GetKeyStatesAsync or something related, find mouse input code in sharpDx
var blockMessage = (msg is >= 256 and <= 265 && io.WantTextInput)
|| (msg is >= 512 and <= 526 && io.WantCaptureMouse);
if (!blockMessage)
Console.WriteLine($"{msg} - M:{io.WantCaptureMouse}, K:{io.WantTextInput}");
return blockMessage ? hookResult : CallWindowProc(_wndproc, hWnd, msg, wParam, lParam);
} }
[DllImport("USER32.dll", ExactSpelling = true, EntryPoint = "CallWindowProcW")] [DllImport("USER32.dll", ExactSpelling = true, EntryPoint = "CallWindowProcW")]

View File

@@ -21,32 +21,4 @@ public class RenderHookPatch
{ {
ImGuiHandler.Instance?.HookWindow((HWND)__instance.Handle); ImGuiHandler.Instance?.HookWindow((HWND)__instance.Handle);
} }
[HarmonyPatch]
public static class RenderMessagePatches
{
[HarmonyTargetMethods]
private static IEnumerable<MethodInfo> TargetMethods()
{
yield return AccessTools.Method(typeof(MyGameForm), nameof(MyGameWindow.WndProc));
yield return AccessTools.Method(typeof(RenderForm), "WndProc");
}
[HarmonyPrefix]
private static bool WndProcPrefix(MyGameForm __instance, ref Message m)
{
if (ImGuiHandler.Instance is not { } handler)
return true;
if (m.Msg is >= 256 and <= 265)
return !handler.Io.WantTextInput;
if (__instance.ShowCursor && m.Msg is >= 512 and <= 526)
return !handler.Io.WantCaptureMouse;
return true;
}
}
} }