Clavier visuel OSK
Le
Bertrand Lenoir-Welter

Bonjour à tous
J'essaie de lancer le clavier visuel sous Win7-64 depuis une appli 32
bits, avec CreateProcess(0,"C:\Windows\System32\Osk.exe",) mais je
n'obtiens qu'une pop-up "Impossible de démarrer le clavier visuel". Si
j'ai bien compris, on ne peut pas lancer un utilitaire 64 bits depuis
une appli 32 bits, mais je suppose que ce n'est pas le cas ici ?
Tout tuyau bienvenu, merci d'avance.
J'essaie de lancer le clavier visuel sous Win7-64 depuis une appli 32
bits, avec CreateProcess(0,"C:\Windows\System32\Osk.exe",) mais je
n'obtiens qu'une pop-up "Impossible de démarrer le clavier visuel". Si
j'ai bien compris, on ne peut pas lancer un utilitaire 64 bits depuis
une appli 32 bits, mais je suppose que ce n'est pas le cas ici ?
Tout tuyau bienvenu, merci d'avance.
vers le répertoire d'installation de mon appli, je peux le lancer à cet
endroit sans problème. Une explication ?
message de news: 4eb7d952$0$30756$
Ils en parlent là :peut-etre
http://blog.delphi-jedi.net/2010/11/29/how-to-run-the-onscreenkeyboard/
Ok, merci. Mais j'ai résolu le problème en faisant une copie locale de
OSK.EXE. Les voies de Microsoft sont parfois tortueuses.
Ok, mais ca manque un peu d'élégance ...
Quelle est la valeur retournée par ShellExecute ?
0 The operating system is out of memory or resources.
ERROR_FILE_NOT_FOUND The specified file was not found.
ERROR_PATH_NOT_FOUND The specified path was not found.
ERROR_BAD_FORMAT The .exe file is invalid (non-Win32® .exe or error
in .exe image).
SE_ERR_ACCESSDENIED The operating system denied access to the
specified file.
SE_ERR_ASSOCINCOMPLETE The file name association is incomplete or
invalid.
SE_ERR_DDEBUSY The DDE transaction could not be completed because
other DDE transactions were being processed.
SE_ERR_DDEFAIL The DDE transaction failed.
SE_ERR_DDETIMEOUT The DDE transaction could not be completed because
the request timed out.
SE_ERR_DLLNOTFOUND The specified dynamic-link library was not
found.
SE_ERR_FNF The specified file was not found.
SE_ERR_NOASSOC There is no application associated with the given file
name extension.
SE_ERR_OOM There was not enough memory to complete the operation.
SE_ERR_PNF The specified path was not found.
SE_ERR_SHARE A sharing violation occurred.
Si je tape "osk.exe" dans une console DOS
ca marche bien depuis n'importe quel répertoire.
( vu que osk.exe est dans le chemin des commandes )
Tu utilises quels paramètres pour ShellExecute ?
As-tu essayé ceci :
ShellExecute( hwnd, "open", "c:\windows\system32\osk.exe", NULL, "c:
\windows\system32\", SW_SHOWNORMAL );
Ou encore cela :
ShellExecute( hwnd, "open", "osk.exe", NULL,
"repertoire_de_ton_programme", SW_SHOWNORMAL );
Si tu créées un batch dans le répertoire de ton programme
( genre toto.bat ) dans lequel tu écris l'unique ligne
osk.exe
ou peut-être
c:windowssystem32osk.exe
et que tu appelles ce batch depuis ton programme,
est-ce que ca marche ?
Si ça marche, c'est élégant. C'est pas pour la place qu'occupe le
programme en question.
CreateProcess et ShellExecute ne retournent pas d'erreur. Le programme
OSK.EXE monte en mémoire, son icone est dans la barre des tâches, mais
il affiche une pop-up "Impossible de démarrer le clavier visuel".
Le batch est en effet une solution.
Merci
| Ok, mais ca manque un peu d'élégance ...
Il ne suffit pas que ca marche pour que ce soit élégant :
on peut toujours faire tourner un truc par la force brute,
mais c'est mieux de minimiser les ressources pour un même résultat.
Mais ca reste incohérent d'avoir deux copies du même exécutable.
Si une mise à jour de Windows modifie osk.exe et/ou rend obsolète
(voire inutilisable) celui que tu as copié dans ton répertoire,
ca t'oblige à le copier de nouveau, et seulement
après t'être rendu compte que ca ne marchait plus.
Le batch supprime déja ce problème,
mais il y a sûrement mieux à faire.
| Quelle est la valeur retournée par ShellExecute ?
Ok.
Disons que ca évite une copie brutale
de l'exécutable, mais c'est juste un test.
Est-ce que tu lances ton programme avec des droits admin ?
( j'ai eu ce genre de problème avec un de mes softs qui accédait à la
base de registres sous Win7 alors que ca marchait bien sous WinXP )
As-tu essayé ceci ?
ShellExecute( hwnd, "open", "c:\windows\system32\osk.exe",
NULL, "c:\windows\system32", SW_SHOWNORMAL );
Ce n'est pas de la force brute, c'est juste que je n'ai pas d'autre
solution et que j'ai besoin de faire tourner ce truc. Mon appli doit
marcher sur un écran tactile et j'ai pas envie de réinventer la roue. Un
simple CopyFile, c'est quand même pas si vilain.
Sauf qu'il y a une copie qui marche et une qui marche pas. Je vais pas
passer des heures avec ça.
Je fais un CopyFile au lancement du programme. Comme ça, il est à jour.
Au demeurant, je n'ai pas vraiment besoin de le voir évoluer. Tel qu'il
est, il remplit parfaitement son office.
Le batch ne marche pas : même message d'erreur. Je suppose que le
ShellExecute lancé par mon appli reste en 32 bits.
Oui.
Oui, j'avais fait ça après avoir essayé CreateProcess. Même problème.
As-tu essayé d'ajouter un manifest gérant le mode de compatibilité ?
Je sais même pas ce que c'est. Mais bon, la solution consistant à faire
une copie locale d'OSK.EXE au lancement de l'appli marche bien. C'est
efficace à défaut d'être canonique.
Merci pour les réponses, en tout cas.