May be it's simpler to install a global hook on messages and
and replace Win+n on n con tilde inside WM_CHAR processing?
Something like this:
Código Delphi
[-]
unit HookDef;
interface
const
NConTildeMappingName: PChar = 'n_con_tilde';
type
PNConTildeData = ^TNConTildeData;
TNConTildeData = record
hHook: Longint;
end;
implementation
end.
library hook;
uses
Windows,
Messages,
HookDef in 'HookDef.pas';
type
PGlobalHookData = ^TGlobalHookData;
TGlobalHookData = TNConTildeData;
var
HookMappingName: PChar absolute NConTildeMappingName;
var
Data: PGlobalHookData;
hMapping: THandle;
const
N_CON_TILDE = $F1;
N_MAYUSC_CON_TILDE = $D1;
VK_WIN = $5B;
function HookProc(nCode, wParam, lParam: Longint): Longint; stdcall;
var
RemovalFlag: Longint absolute wParam;
Msg: PMsg absolute lParam;
WinKey_State: Byte;
begin
if nCode = HC_ACTION then
begin
if (Msg.message = WM_CHAR) then
begin
WinKey_State := GetKeyState(VK_WIN);
if (WinKey_State and $80) > 0 then
begin
if (Msg^.wParam = Ord('n')) then Msg^.wParam := N_CON_TILDE;
if (Msg^.wParam = Ord('N')) then Msg^.wParam := N_MAYUSC_CON_TILDE;
end;
end;
end;
Result := CallNextHookEx(Data^.hHook, nCode, wParam, lParam);
end;
function InstallHook: PGlobalHookData; stdcall;
begin
Data^.hHook := SetWindowsHookEx(WH_GETMESSAGE, @HookProc, HInstance, 0);
if Data^.hHook <> 0 then
Result := Data
else
Result := nil;
end;
function UninstallHook: Boolean; stdcall;
begin
Result := UnhookWindowsHookEx(Data^.hHook);
Data^.hHook := 0;
end;
procedure OpenGlobalData;
begin
hMapping := CreateFileMapping(INVALID_HANDLE_VALUE, nil,
PAGE_READWRITE, 0, SizeOf(TGlobalHookData), HookMappingName);
if hMapping = 0 then Exit;
Data:= MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalHookData));
if Data = nil then CloseHandle(hMapping);
end;
procedure CloseGlobalData;
begin
UnmapViewOfFile(Data);
CloseHandle(hMapping);
end;
procedure DLLEntryPoint(dwReason: DWord); register;
begin
case dwReason of
DLL_PROCESS_ATTACH: OpenGlobalData;
DLL_PROCESS_DETACH: CloseGlobalData;
end;
end;
exports
InstallHook,
UninstallHook;
begin
DLLProc:= @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.