Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Clavier visuel OSK

11 réponses
Avatar
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.

10 réponses

1 2
Avatar
Bertrand Lenoir-Welter
J'ajoute que c'est pareil avec ShellExecute(), mais si je copie OSK.EXE
vers le répertoire d'installation de mon appli, je peux le lancer à cet
endroit sans problème. Une explication ?
Avatar
Laurent
"Bertrand Lenoir-Welter" a écrit dans le
message de news: 4eb7d952$0$30756$
Bonjour à tous

J'essaie de lancer le clavier visuel sous Win7-64 depuis une appli 32
bits, avec CreateProcess(0,"C:WindowsSystem32Osk.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.



Ils en parlent là :peut-etre
http://blog.delphi-jedi.net/2010/11/29/how-to-run-the-onscreenkeyboard/
Avatar
Bertrand Lenoir-Welter
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.
Avatar
Jean-Christophe
On 7 nov, 18:51, Bertrand Lenoir-Welter

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:windowssystem32osk.exe", NULL, "c:
windowssystem32", SW_SHOWNORMAL );

Ou encore cela :
ShellExecute( hwnd, "open", "osk.exe", NULL,
"repertoire_de_ton_programme", SW_SHOWNORMAL );
Avatar
Jean-Christophe
On 7 nov, 18:51, Bertrand Lenoir-Welter

résolu le problème en faisant une copie locale de OSK.EXE.



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 ?
Avatar
Bertrand Lenoir-Welter
Ok, mais ca manque un peu d'élégance ...



Si ça marche, c'est élégant. C'est pas pour la place qu'occupe le
programme en question.


Quelle est la valeur retournée par ShellExecute ?



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
Avatar
Jean-Christophe
On 7 nov, 14:30, Bertrand Lenoir-Welter

| Ok, mais ca manque un peu d'élégance ...

Si ça marche, c'est élégant.



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.


C'est pas pour la place qu'occupe le programme en question.



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 ?

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, mai s
il affiche une pop-up "Impossible de démarrer le clavier visuel".



Ok.


Le batch est en effet une solution.



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:windowssystem32osk.exe",
NULL, "c:windowssystem32", SW_SHOWNORMAL );
Avatar
Bertrand Lenoir-Welter
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.



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.


Mais ca reste incohérent d'avoir deux copies du même exécutable.



Sauf qu'il y a une copie qui marche et une qui marche pas. Je vais pas
passer des heures avec ça.


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.



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 supprime déja ce problème,
mais il y a sûrement mieux à faire.



Le batch ne marche pas : même message d'erreur. Je suppose que le
ShellExecute lancé par mon appli reste en 32 bits.


Est-ce que tu lances ton programme avec des droits admin ?



Oui.


As-tu essayé ceci ?
ShellExecute( hwnd, "open", "c:windowssystem32osk.exe",
NULL, "c:windowssystem32", SW_SHOWNORMAL );



Oui, j'avais fait ça après avoir essayé CreateProcess. Même problème.
Avatar
JPEG61
Bonjour,
As-tu essayé d'ajouter un manifest gérant le mode de compatibilité ?
Avatar
Bertrand Lenoir-Welter
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.
1 2