Clavier virtuel [Résolu]

gerdenis 3 Messages postés samedi 16 avril 2005Date d'inscription 10 décembre 2010 Dernière intervention - 9 déc. 2010 à 10:33 - Dernière réponse : gerdenis 3 Messages postés samedi 16 avril 2005Date d'inscription 10 décembre 2010 Dernière intervention
- 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
Bacterius 3869 Messages postés samedi 22 décembre 2007Date d'inscription 3 juin 2016 Dernière intervention - 9 déc. 2010 à 11:24
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

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de Bacterius
Meilleure réponse
gerdenis 3 Messages postés samedi 16 avril 2005Date d'inscription 10 décembre 2010 Dernière intervention - 10 déc. 2010 à 10:57
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

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de gerdenis
cs_MAURICIO 2233 Messages postés mardi 10 décembre 2002Date d'inscription 15 décembre 2014 Dernière intervention - 9 déc. 2010 à 15:12
0
Merci
Excelent!

applicable aussi je pense à tout TWinControl ...


Composants Cindy pour Delphi
Commenter la réponse de cs_MAURICIO
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 9 déc. 2010 à 19:52
0
Merci
Je ne connaissais pas non plus. Oui ! Excellent !
Commenter la réponse de Caribensila
gerdenis 3 Messages postés samedi 16 avril 2005Date d'inscription 10 décembre 2010 Dernière intervention - 10 déc. 2010 à 00:57
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
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 10 déc. 2010 à 02:02
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.