2010-11-06 40 views
4

Est-ce que je peux l'utiliser comme ça pour plusieurs événements?Comment puis-je gérer un raccourci clavier lorsque mon programme n'est pas actif?

unit Unit4; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, Clipbrd; 

type 
    TForm4 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    procedure WMHotkey(var Message: TWMHotKey); message WM_HOTKEY; 
    procedure FormDestroy(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form4: TForm4; 

implementation 

const 
    MY_ID = 123; 
    MY_ID1 = 123; 
    MY_ID2 = 123; 

{$R *.dfm} 

procedure TForm4.FormCreate(Sender: TObject); 
begin 
    RegisterHotKey(Handle, MY_ID, MOD_CONTROL, ord('1')); 
    RegisterHotKey(Handle, MY_ID1, MOD_CONTROL, ord('2')); 
    RegisterHotKey(Handle, MY_ID2, MOD_CONTROL, ord('3')); 
end; 

procedure TForm4.FormDestroy(Sender: TObject); 
begin 
    UnregisterHotKey(Handle, MY_ID); 
    UnregisterHotKey(Handle, MY_ID1); 
    UnregisterHotKey(Handle, MY_ID2); 
end; 

procedure TForm4.WMHotkey(var Message: TWMHotKey); 
begin 
    if Message.HotKey = MY_ID then 
    begin 

    if not AttachThreadInput(GetCurrentThreadId, GetWindowThreadProcessId(GetForegroundWindow), true) then 
     RaiseLastOSError; 

    try 
     Clipboard.AsText := 'text1'; 
     SendMessage(GetFocus, WM_PASTE, 0, 0); 
    finally 
     AttachThreadInput(GetCurrentThreadId, GetWindowThreadProcessId(GetForegroundWindow), false); 
    end; 

    if Message.HotKey = MY_ID1 then 
    begin 

    if not AttachThreadInput(GetCurrentThreadId, GetWindowThreadProcessId(GetForegroundWindow), true) then 
     RaiseLastOSError; 

    try 
     Clipboard.AsText := 'text2'; 
     SendMessage(GetFocus, WM_PASTE, 0, 0); 
    finally 
     AttachThreadInput(GetCurrentThreadId, GetWindowThreadProcessId(GetForegroundWindow), false); 
    end; 

    if Message.HotKey = MY_ID2 then 
    begin 

    if not AttachThreadInput(GetCurrentThreadId, GetWindowThreadProcessId(GetForegroundWindow), true) then 
     RaiseLastOSError; 

    try 
     Clipboard.AsText := 'text3'; 
     SendMessage(GetFocus, WM_PASTE, 0, 0); 
    finally 
     AttachThreadInput(GetCurrentThreadId, GetWindowThreadProcessId(GetForegroundWindow), false); 
    end; 

    end; 
end; 

end; 
end; 
end. 
+0

Copie possible de: http://stackoverflow.com/questions/4118148/action-event-outside-delphi-app – jachguate

Répondre

5

Utilisez la fonction RegisterHotKey. Si vous voulez que l'application soit invisible, vous pouvez vouloir tous les détails dans my answer to a similar question.

Essayez ceci:

unit Unit4; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, Clipbrd; 

type 
    TForm4 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    procedure WMHotkey(var Message: TWMHotKey); message WM_HOTKEY; 
    procedure FormDestroy(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form4: TForm4; 

implementation 

const 
    MY_ID = 123; 

{$R *.dfm} 

procedure TForm4.FormCreate(Sender: TObject); 
begin 
    RegisterHotKey(Handle, MY_ID, MOD_CONTROL, ord('1')); 
end; 

procedure TForm4.FormDestroy(Sender: TObject); 
begin 
    UnregisterHotKey(Handle, MY_ID); 
end; 

procedure TForm4.WMHotkey(var Message: TWMHotKey); 
begin 
    if Message.HotKey = MY_ID then 
    begin 

    if not AttachThreadInput(GetCurrentThreadId, GetWindowThreadProcessId(GetForegroundWindow), true) then 
     RaiseLastOSError; 

    try 
     Clipboard.AsText := 'This is my own text!'; 
     SendMessage(GetFocus, WM_PASTE, 0, 0); 
    finally 
     AttachThreadInput(GetCurrentThreadId, GetWindowThreadProcessId(GetForegroundWindow), false); 
    end; 

    end; 
end; 

end. 

Bien sûr, vous aurez besoin d'utiliser cette approche et le modifier de sorte qu'il convient à votre cas particulier. (Autrement dit, vous voulez probablement quelque chose de plus qu'une application qui imprime "Ceci est mon propre texte!" Sur Ctrl + 1, mais rien d'autre.)

+0

pouvez-vous me donner un exemple s'il vous plaît? – andrei

+0

disons quand j'appuie sur ctrl + 1 le mot delphi apparaît sur chaque application Windows, comme Microsoft Word ou alors – andrei

+0

@andrei: Je donne maintenant un exemple de cette chose même. Mais il ne semble pas fonctionner dans Word 2010 au moins (mais Notepad fonctionne bien). –

2

Pour compléter la réponse d'Andreas, vous pouvez utiliser la fonction RegisterHotKey en combinaison avec le message Windows WM_HOTKEY.

essayer ce code

type 
    TForm17 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
    private 
    { Private declarations } 
    HotKey1 : Integer; 
    HotKey2 : Integer; 
    procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY; 
    public 
    { Public declarations } 
    end; 

var 
    Form17: TForm17; 

implementation 

{$R *.dfm} 

{ TForm17 } 

procedure TForm17.FormCreate(Sender: TObject); 
const 
    MOD_CONTROL = $0002;//0x0002 
begin 
    // Register Ctrl + 1 hotkey 
    HotKey1 := GlobalAddAtom('Hotkey1'); 
    RegisterHotKey(Handle, HotKey1, MOD_CONTROL, Ord('1')); 
    // Register Ctrl + 2 hotkey 
    HotKey2 := GlobalAddAtom('Hotkey2'); 
    RegisterHotKey(Handle, HotKey2, MOD_CONTROL, Ord('2')); 
end; 

procedure TForm17.FormDestroy(Sender: TObject); 
begin 
    //unregister the hotkeys 
    UnRegisterHotKey(Handle, HotKey1); 
    GlobalDeleteAtom(HotKey1); 
    UnRegisterHotKey(Handle, HotKey2); 
    GlobalDeleteAtom(HotKey2); 
end; 

procedure TForm17.WMHotKey(var Msg: TWMHotKey); 
begin 
    if Msg.HotKey = HotKey1 then 
    begin 
    ShowMessage('Ctrl + 1 was pressed'); 
    //do your stuff 
    end 
    else 
    if Msg.HotKey = HotKey2 then 
    begin 
    ShowMessage('Ctrl + 2 was pressed'); 
    //do your stuff 
    end; 
end; 
1

Comme d'autres ont suggéré, il est fonction RegisterHotKey. Toutefois, une implémentation correcte de l'application que vous souhaitez concevoir nécessite un hook clavier et une injection de DLL dans l'application.

Je vous recommande de jeter un oeil à l'application TypePilot. Il vous permet de taper ou de copier/coller n'importe quel texte avec certains raccourcis que vous tapez. Par exemple. vous pouvez taper "thnk" et cela sera remplacé par "merci" par l'application.

+0

Pourquoi? Je pense qu'il pourrait suffire d'obtenir le handle de la fenêtre active et d'envoyer un message de collage? – Remko

+1

Coller le message va coller le contenu du presse-papiers. Si vous pensez que vous allez remplacer le contenu du presse-papiers par votre texte, collez votre texte et replacez les données dans le presse-papiers, détrompez-vous: il n'est pas nécessaire que le presse-papier contente les données. Il est possible de mettre une référence aux données dans le presse-papiers, et vous ne pourrez pas les sauvegarder correctement. –