mirror of
https://github.com/goatcorp/Dalamud.git
synced 2026-01-03 14:23:40 +01:00
parent
5dbed370f8
commit
26835467ea
2 changed files with 120 additions and 88 deletions
|
|
@ -62,6 +62,7 @@ namespace Dalamud.Interface.Internal
|
|||
private readonly SwapChainVtableResolver address;
|
||||
private readonly Hook<DispatchMessageWDelegate> dispatchMessageWHook;
|
||||
private readonly Hook<SetCursorDelegate> setCursorHook;
|
||||
private Hook<ProcessMessageDelegate> processMessageHook;
|
||||
private RawDX11Scene? scene;
|
||||
|
||||
private Hook<PresentDelegate>? presentHook;
|
||||
|
|
@ -97,6 +98,8 @@ namespace Dalamud.Interface.Internal
|
|||
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
|
||||
private delegate IntPtr DispatchMessageWDelegate(ref User32.MSG msg);
|
||||
|
||||
[UnmanagedFunctionPointer(CallingConvention.ThisCall)]
|
||||
private delegate IntPtr ProcessMessageDelegate(IntPtr hWnd, uint msg, ulong wParam, ulong lParam, IntPtr handeled);
|
||||
/// <summary>
|
||||
/// This event gets called each frame to facilitate ImGui drawing.
|
||||
/// </summary>
|
||||
|
|
@ -217,6 +220,7 @@ namespace Dalamud.Interface.Internal
|
|||
this.presentHook?.Dispose();
|
||||
this.resizeBuffersHook?.Dispose();
|
||||
this.dispatchMessageWHook.Dispose();
|
||||
this.processMessageHook?.Dispose();
|
||||
}).Wait();
|
||||
|
||||
this.scene?.Dispose();
|
||||
|
|
@ -920,10 +924,15 @@ namespace Dalamud.Interface.Internal
|
|||
Log.Verbose($"Present address 0x{this.presentHook!.Address.ToInt64():X}");
|
||||
Log.Verbose($"ResizeBuffers address 0x{this.resizeBuffersHook!.Address.ToInt64():X}");
|
||||
|
||||
var wndProcAddress = sigScanner.ScanText("E8 ?? ?? ?? ?? 80 7C 24 ?? ?? 74 ?? B8");
|
||||
Log.Verbose($"WndProc address 0x{wndProcAddress.ToInt64():X}");
|
||||
this.processMessageHook = Hook<ProcessMessageDelegate>.FromAddress(wndProcAddress, this.ProcessMessageDetour);
|
||||
|
||||
this.setCursorHook.Enable();
|
||||
this.presentHook.Enable();
|
||||
this.resizeBuffersHook.Enable();
|
||||
this.dispatchMessageWHook.Enable();
|
||||
this.processMessageHook.Enable();
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -944,16 +953,18 @@ namespace Dalamud.Interface.Internal
|
|||
this.isRebuildingFonts = false;
|
||||
}
|
||||
|
||||
private unsafe IntPtr ProcessMessageDetour(IntPtr hWnd, uint msg, ulong wParam, ulong lParam, IntPtr handeled)
|
||||
{
|
||||
var ime = Service<DalamudIME>.GetNullable();
|
||||
var res = ime?.ProcessWndProcW(hWnd, (User32.WindowMessage)msg, (void*)wParam, (void*)lParam);
|
||||
return this.processMessageHook.Original(hWnd, msg, wParam, lParam, handeled);
|
||||
}
|
||||
|
||||
private unsafe IntPtr DispatchMessageWDetour(ref User32.MSG msg)
|
||||
{
|
||||
if (msg.hwnd == this.GameWindowHandle && this.scene != null)
|
||||
{
|
||||
var ime = Service<DalamudIME>.GetNullable();
|
||||
var res = ime?.ProcessWndProcW(msg.hwnd, msg.message, (void*)msg.wParam, (void*)msg.lParam);
|
||||
if (res != null)
|
||||
return res.Value;
|
||||
|
||||
res = this.scene.ProcessWndProcW(msg.hwnd, msg.message, (void*)msg.wParam, (void*)msg.lParam);
|
||||
var res = this.scene.ProcessWndProcW(msg.hwnd, msg.message, (void*)msg.wParam, (void*)msg.lParam);
|
||||
if (res != null)
|
||||
return res.Value;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue