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

SendMessage & MAJUSCULE

8 réponses
Avatar
darkwall_37
Bonjour,

J'ai besoin d'envoyer des informations =E0 une fen=EAtre tout en ayant la
possibilit=E9 de continuer =E0 utiliser le clavier et/ou la souris.

Le test se fait avec notepad. A l'heure actuelle, cela fonctionne =E0
ceci pr=E8s que toutes les minuscules sont transform=E9es en majuscule,
que les chiffres se transforment en lettre et que les majuscules se
transforment en caract=E8res sp=E9ciaux. Avant j'utilisais keyboard event
et je n'avais pas ce soucis.

Voici la fonction qui me permet de transformer et envoyer les
caract=E8res saisis dans la fen=EAtre.

void Write(HWND Handle, char *Flux, int Size)
{


int i=3D0;
for ( i=3D0 ; i<Size ; i++ )
{
char CurrentLetter =3D Stream
[i];

// Chiffre

if ( '0' =3D=3D CurrentLetter )
{
SendMessage(Handle, WM_CHAR, 0x62, 0);
_sleep(40);
}

else if ( '1' =3D=3D CurrentLetter )
{
SendMessage(Handle, WM_CHAR, 0x61, 0);
_sleep(40);
}

else if ( '2' =3D=3D CurrentLetter )
{
SendMessage(Handle, WM_CHAR, 0x62, 0);
_sleep(40);
}

else if ( '3' =3D=3D CurrentLetter )
{
SendMessage(Handle, WM_CHAR, 0x63, 0);
_sleep(40);
}

else if ( '4' =3D=3D CurrentLetter )
{
SendMessage(Handle, WM_CHAR, 0x64, 0);
_sleep(40);
}

else if ( '5' =3D=3D CurrentLetter )
{
SendMessage(Handle, WM_CHAR, 0x65, 0);
_sleep(40);
}

else if ( '6' =3D=3D CurrentLetter )
{
SendMessage(Handle, WM_CHAR, 0x66, 0);
_sleep(40);
}

else if ( '7' =3D=3D CurrentLetter )
{
SendMessage(Handle, WM_CHAR, 0x67, 0);
_sleep(40);
}

else if ( '8' =3D=3D CurrentLetter)
{
SendMessage(Handle, WM_CHAR, 0x68, 0);
_sleep(40);
}

else if ( '9' =3D=3D CurrentLetter )
{
SendMessage(Handle, WM_CHAR, 0x69, 0);
_sleep(40);
}


// Caract=E8res sp=E9ciaux

else if ( '@' =3D=3D CurrentLetter )
{
keybd_event(VK_MENU,0,0,0);
keybd_event(VK_CONTROL,0,0,0);
keybd_event(0x30,0,0,0);
keybd_event(VK_MENU,0,KEYEVENTF_KEYUP,0);
keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
keybd_event(0x30,0,KEYEVENTF_KEYUP,0);
_sleep(50);

}

else if ( '.' =3D=3D CurrentLetter )
{

keybd_event(VK_SHIFT,0,0,0);
keybd_event(0xBE,0,0,0);
keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
keybd_event(0xBE,0,KEYEVENTF_KEYUP,0);
_sleep(40);
}

// Caract=E8res usels

else {


SendMessage(Handle, WM_CHAR, VkKeyScan
(Stream[i]), 0);
_sleep(40);

}
}

}

Merci d'avance.

8 réponses

Avatar
Sylvain SF
darkwall_37 a écrit :

Le test se fait avec notepad. A l'heure actuelle, cela fonctionne à
ceci près que toutes les minuscules sont transformées en majuscule,
que les chiffres se transforment en lettre et que les majuscules se
transforment en caractères spéciaux.



avec un NotePad ascii (non unicode) je n'observe pas cela.

void Write(HWND Handle, char *Flux, int Size)
{
int i=0;
for ( i=0 ; i<Size ; i++ )
{
char CurrentLetter = Stream[i];

if ( '0' == CurrentLetter )
SendMessage(Handle, WM_CHAR, 0x62, 0);



n'utilisez pas les "scan-codes" VK_NUMPADx ici, mais bien le caractère
lui-même, soit (pour la plupart des lettres testées):

SendMessage(Handle, WM_CHAR, CurrentLetter, 0);

Sylvain.
Avatar
darkwall_37
On 18 juin, 20:10, Sylvain SF wrote:
darkwall_37 a écrit :



> Le test se fait avec notepad. A l'heure actuelle, cela fonctionne à
> ceci près que toutes les minuscules sont transformées en majuscule,
> que les chiffres se transforment en lettre et que les majuscules se
> transforment en caractères spéciaux.

avec un NotePad ascii (non unicode) je n'observe pas cela.

> void Write(HWND Handle, char *Flux, int Size)
> {
>     int i=0;
>     for ( i=0 ; i<Size ; i++ )
>         {
>                char CurrentLetter = Stream[i];

>                   if ( '0' == CurrentLetter )
>                           SendMessage(Handle, WM_CHAR, 0x62, 0);

n'utilisez pas les "scan-codes" VK_NUMPADx ici, mais bien le caractère
lui-même, soit (pour la plupart des lettres testées):

        SendMessage(Handle, WM_CHAR, CurrentLetter, 0);

Sylvain.



Je vous remercie une fois de plus. En remplaçant pour les lettres le
vkkeyscan de la lettre directement par la lettre, j'ai bien la donnée
retranscrite, cependant pour les chiffres j'ai toujours le même
problème. Et comme vous le disiez il ne faut pas utiliser l'unicode
mais l'ascii et les valeur 0x62.. 0x6X sont bien les codes ASCII des
chiffres pourtant.

Cordialement.
Avatar
Sylvain SF
darkwall_37 a écrit :

[..] cependant pour les chiffres j'ai toujours le même
problème. Et comme vous le disiez il ne faut pas utiliser l'unicode
mais l'ascii et les valeur 0x62.. 0x6X sont bien les codes ASCII des
chiffres pourtant.



non, les chiffres '0' à '9' ont les codes 0x30 à 0x39 (les
constantes réservés et non définies VK_0 à VK_9), les constantes
VK_NUMPAD0 à 9 correspondent aux codes d'un clavier numérique seul
(utilisé en complément du clavier non étendu des portables)

Sylvain.
Avatar
darkwall_37
On 18 juin, 23:02, Sylvain SF wrote:
darkwall_37 a écrit :



> [..] cependant pour les chiffres j'ai toujours le même
> problème. Et comme vous le disiez il ne faut pas utiliser l'unicode
> mais l'ascii et les valeur 0x62.. 0x6X sont bien les codes ASCII des
> chiffres pourtant.

non, les chiffres '0' à '9' ont les codes 0x30 à 0x39 (les
constantes réservés et non définies VK_0 à VK_9), les constantes
VK_NUMPAD0 à 9 correspondent aux codes d'un clavier numérique seul
(utilisé en complément du clavier non étendu des portables)

Sylvain.



Je te remercie vraiment pour ton aide, en quelques réponses tu as fait
mieux qu'une dixaine de personne en 2 jours ! @+ & bonne continuation.
Avatar
domi
darkwall_37 wrote:


Je te remercie vraiment pour ton aide, en quelques réponses tu as fait
mieux qu'une dixaine de personne en 2 jours ! @+ & bonne continuation.




Ca confirme le proverbe :-)

http://minilien.com/?AFB1a6EevR
Avatar
Jean Paul
On 19 juin, 01:10, domi wrote:
darkwall_37 wrote:

> Je te remercie vraiment pour ton aide, en quelques réponses tu as fai t
> mieux qu'une dixaine de personne en 2 jours ! @+ & bonne continuation.

Ca confirme le proverbe :-)

http://minilien.com/?AFB1a6EevR



Oui tout à fait. Merci encore.
Avatar
Glav
Petit conseil si je puis me permettre : pour ce genre de conditions
répétées, un switch est plus efficace en performances et moins pénible à
écrire qu'une suite de if :

//---------------------------------------------------

switch(CurrentLetter) {
case '0':
SendMessage(Handle, WM_CHAR, 0x62, 0);
break;

case '1':
SendMessage(Handle, WM_CHAR, 0x61, 0);
break;

case '3':
SendMessage(Handle, WM_CHAR, 0x62, 0);
break;

// caractères usuels
default:
SendMessage(Handle, WM_CHAR, VkKeyScan(Stream[i]), 0);

}
// instruction exécutée dans tous les cas
_sleep(40);

//---------------------------------------------------

voila voila :)


darkwall_37 a écrit :

Je te remercie vraiment pour ton aide, en quelques réponses tu as fait
mieux qu'une dixaine de personne en 2 jours ! @+ & bonne continuation.


Avatar
domi
Glav wrote:
Petit conseil si je puis me permettre : pour ce genre de conditions
répétées, un switch est plus efficace en performances et moins pénible à
écrire qu'une suite de if :



Plus propre et élégant, oui.
Pour la performance, ça dépend du code généré par le compilateur.