Ver Mensaje Individual
  #2  
Antiguo 23-09-2005
rounin rounin is offline
Miembro
 
Registrado: sep 2005
Posts: 43
Reputación: 0
rounin Va por buen camino
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 [-]
{************* HookDef.pas **************}
 
 unit HookDef;
 
 interface
 
 const
   NConTildeMappingName: PChar = 'n_con_tilde';
 
 type
   PNConTildeData = ^TNConTildeData;
   TNConTildeData = record
     hHook: Longint;
   end;
 
 implementation
 
 end.
 
 {*************** Hook.dll ****************}
 
 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
     // wParam = chCharCode, lParam = lKeyData
     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;
 
 {
 function InstallHook: PGlobalHookData; stdcall; external 'hook.dll';
 function UninstallHook: Boolean; stdcall; external 'hook.dll';
 }
 
 begin
   DLLProc:= @DLLEntryPoint;
   DLLEntryPoint(DLL_PROCESS_ATTACH);
 end.
 
 {*******************************************}

Última edición por dec fecha: 23-09-2005 a las 11:03:55. Razón: ¡¡Encerrad el código fuente entre las etiquetas [DELPHI] ... [/DELPHI]!!
Responder Con Cita