Clavier virtuel

Résolu
gerdenis Messages postés 3 Date d'inscription samedi 16 avril 2005 Statut Membre Dernière intervention 10 décembre 2010 - 9 déc. 2010 à 10:33
gerdenis Messages postés 3 Date d'inscription samedi 16 avril 2005 Statut Membre 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

6 réponses

Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
9 déc. 2010 à 11:24
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 !
3
gerdenis Messages postés 3 Date d'inscription samedi 16 avril 2005 Statut Membre Dernière intervention 10 décembre 2010
10 déc. 2010 à 10:57
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.
3
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
9 déc. 2010 à 15:12
Excelent!

applicable aussi je pense à tout TWinControl ...


Composants Cindy pour Delphi
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
9 déc. 2010 à 19:52
Je ne connaissais pas non plus. Oui ! Excellent !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gerdenis Messages postés 3 Date d'inscription samedi 16 avril 2005 Statut Membre Dernière intervention 10 décembre 2010
10 déc. 2010 à 00:57
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.
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
10 déc. 2010 à 02:02
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.)
0
Rejoignez-nous