Clavier virtuel [Résolu]

Messages postés
3
Date d'inscription
samedi 16 avril 2005
Dernière intervention
10 décembre 2010
- - Dernière réponse : gerdenis
Messages postés
3
Date d'inscription
samedi 16 avril 2005
Dernière intervention
10 décembre 2010
- 10 déc. 2010 à 10:57
Bonjour
Première participation au forum d'un nouveau retraité qui s'initie à la programmation

Je réalise en Delphi un clavier virtuel personnalisé destiné à passer des commandes à des applications Windows standards. J'utilise l'API keybd_event.

Quand l'envoi du paramètre est fait de façon automatique par mon appli. (par un tmer par ex.), tout va bien.
Quand je clique sur le clavier pour faire l'envoi, c'est mon appli. qui devient active. Il n'y a plus d'application destinataire.
Je voudrai avoir un fonctionnement comparable à osk.exe de Windows.

Quelqu'un peut il m'aider?
Merci
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Dernière intervention
3 juin 2016
3
Merci
Salut,
il faut que tu rendes ton application non focalisable. On pourra toujours cliquer sur tes boutons mais le clavier virtuel ne prendra plus la main. Je crois qu'il y a une API pour ça, je sais qu'elle existe pour l'avoir déjà utilisée (et elle fonctionne parfaitement) mais j'ai oublié le nom.

EDIT : je viens de la retrouver, tu surcharges le CreateParams de ta fiche en rajoutant le flag WS_EX_NOACTIVATE :

type
 TMaFiche = class(TForm)
 ...
 protected
  procedure CreateParams(var Params: TCreateParams); override;
 end;

...

implementation

procedure TMaFiche.CreateParams(var Params: TCreateParams);
const
 WS_EX_NOACTIVATE = $8000000;
begin
 Params.ExStyle := Params.ExStyle or WS_EX_NOACTIVATE;
 inherited;
end;


Testé et approuvé

Cordialement, Bacterius !

Merci Bacterius 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de Bacterius
Messages postés
3
Date d'inscription
samedi 16 avril 2005
Dernière intervention
10 décembre 2010
3
Merci
Bonjour,

En fait, le code de Bactérius et mon code de test fonctionne très bien quand on met les instructions dans le bon ordre.

....
procedure Tfrm_Main.CreateParams;
const
WS_EX_NOACTIVATE = $8000000;
begin
inherited;
Params.ExStyle := Params.ExStyle or WS_EX_NOACTIVATE;
end;
....

Merci à tous de l'intérêt que vous avez porté à mon problème.

Merci gerdenis 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de gerdenis
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
0
Merci
Excelent!

applicable aussi je pense à tout TWinControl ...


Composants Cindy pour Delphi
Commenter la réponse de cs_MAURICIO
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
0
Merci
Je ne connaissais pas non plus. Oui ! Excellent !
Commenter la réponse de Caribensila
Messages postés
3
Date d'inscription
samedi 16 avril 2005
Dernière intervention
10 décembre 2010
0
Merci
Bonjour Bactérius,

j'ai testé ta solution qui me plait bien et me parait pertinente.
Malheureusement, je n'ai pas réussi à la faire fonctionner. Ma fenêtre prend toujours le focus.
J'ai fais ne petite appli. de test pour appeler une fenêtre d'aide.
Ci joint ce code. Ai je bien interprété ta réponse.

Merci de jeter un coup d'oeil.
*****************************************
unit Main;

interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
Tfrm_Main = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Déclarations privées }
protected
procedure CreateParams(var Params: TCreateParams); override;
public
{ Déclarations publiques }
end;
var
frm_Main: Tfrm_Main;

implementation
procedure Tfrm_Main.CreateParams;
const
WS_EX_NOACTIVATE = $8000000;
begin
Params.ExStyle := Params.ExStyle or WS_EX_NOACTIVATE;
inherited;
end;
{$R *.dfm}
procedure Tfrm_Main.Button1Click(Sender: TObject);
begin
keybd_event(VK_F1,0,1,0); //touche enfoncé
keybd_event(VK_F1,0,2,0); //touche relevé
end;
end.
Commenter la réponse de gerdenis
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
0
Merci
Salut,

Pas testé et à l'aveuglette :

Essaie de mettre un TSpeedButton (qui ne prend jamais le focus) plutôt qu'un TButton.

(Et regarde la différence entre TGraphicControl et TWinControl.)
Commenter la réponse de Caribensila

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.