SendMessage & MAJUSCULE

Le
darkwall_37
Bonjour,

J'ai besoin d'envoyer des informations à une fenêtre tout en ayant la
possibilité de continuer à utiliser le clavier et/ou la souris.

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. Avant j'utilisais keyboard event
et je n'avais pas ce soucis.

Voici la fonction qui me permet de transformer et envoyer les
caractères saisis dans la fenêtre.

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


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

// Chiffre

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

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

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

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

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

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

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

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

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

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


// Caractères spéciaux

else if ( '@' == 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 ( '.' == 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ères usels

else {


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

}
}

}

Merci d'avance.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Sylvain SF
Le #19595241
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.
darkwall_37
Le #19595991
On 18 juin, 20:10, 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.



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.
Sylvain SF
Le #19596121
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.
darkwall_37
Le #19596391
On 18 juin, 23:02, 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.



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.
domi
Le #19596581
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
Jean Paul
Le #19596671
On 19 juin, 01:10, domi
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.
Glav
Le #19603851
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.


domi
Le #19605761
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.
Publicité
Poster une réponse
Anonyme