Hola Egostar
Gracias por tus respuestas.
Realice una búsqueda para el punto 1. y en la página https://vike.io/es/291208/ encontré la respuesta y lo adapte a mi código y funciono para el pc donde estoy realizando el aplicativo (w8) pero en un w10 donde realizaron pruebas no funciono.
Me puse a revisar y encontré que el osk.exe se encuentra en el system32 independiente de si es de 32 0 64 bits.
Lo que hice fue cambiar la línea:
Result := IncludeTrailingPathDelimiter(S) + 'Sysnative\';
por
Result := IncludeTrailingPathDelimiter(S) + 'System32\';
Por ahora me ha funcionado, debo probar en otros pc's
Dejo aquí la solución del punto 1.
private
{ Private declarations }
class function IsWOW64: Boolean;
implementation
{$R *.DFM}
uses shellapi;
class function TFrmLogin.IsWOW64: Boolean;
type
TIsWow64Process = function( // Type of IsWow64Process API fn
Handle: THandle;
var Res: BOOL
): BOOL; stdcall;
var
IsWow64Result: BOOL; // result from IsWow64Process
IsWow64Process: TIsWow64Process; // IsWow64Process fn reference
begin
// Try to load required function from kernel32
IsWow64Process := GetProcAddress(
GetModuleHandle('kernel32'), 'IsWow64Process'
);
if Assigned(IsWow64Process) then
begin
// Function is implemented: call it
if not IsWow64Process(GetCurrentProcess, IsWow64Result) then
RaiseLastOSError;
// Return result of function
Result := IsWow64Result;
else
// Function not implemented: can't be running on Wow64
Result := False;
procedure TFrmLogin.TecladoEnPantalla(Sender: TObject);
var
path:String;
res : Integer;
function GetSysDir: string;
var
Buf
: array[0..MAX_PATH
] of Char
; Len: UINT;
S: String;
begin
{$IFNDEF WIN64}
if TFrmLogin.IsWOW64 then
begin
Len := GetWindowsDirectory(Buf, MAX_PATH);
if Len = 0 then RaiseLastOSError;
SetString(S, Buf, Len);
Result := IncludeTrailingPathDelimiter(S) + 'System32\';
Exit;
end;
{$ENDIF}
Len := GetSystemDirectory(Buf, MAX_PATH);
if Len = 0 then RaiseLastOSError;
SetString(S, Buf, Len);
Result := IncludeTrailingPathDelimiter(S);
end;
begin
if StrToIntDef(Get_ValorFromIni(ExtractFilePath(Application.ExeName) + '\Configuracion.ini','TECLADO', 'EN_PANTALLA'),0) = 1 then
begin
path := GetSysDir;
path := path + 'osk.exe';
//path := ExtractFileDir(application.ExeName) +'\FreeVK.exe';
res := ShellExecute(self.Handle,'open',Pchar(path),nil,nil,SW_NORMAL);
if res <> 42 then
begin
ShowMessage(path);
RaiseLastOSError;
end;
end;
end;
Ahora me voy a dedicar al punto 2.
Hasta pronto.
Saludo