22. september 2004 - 16:59
Der er
7 kommentarer og
1 løsning
Er det muligt at lave en "global" hotkey?
Jeg har lavet et lille program der kan udføre forskellinge kommandoer når der trykkes på en F-tast. Programmet virker godt nok - men det er bare lidt træls at programmet skal være "aktivt" før man kan bruge F-tasterne! Er der ikke en måde at lave en form for globale hotkeys på (altså hvor programmet kører i baggrunden - og så udfører visse kommandoer når man trykker på en F-tast)
Jeg udvikler programmet til Windows XP Pro og jeg bruger C++Builder 6 som udviklings værktøj!
22. september 2004 - 17:53
#1
Jeg har lige fundet lidt Delphi kode (her på E!) som virker på den måde som jeg gerne vil have. Er der nogen der kan skrive det til C++ kode i stedet?
Koden:
-------------------------------------------------------------------------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
WIN_Q, WIN_T, WIN_Y, WIN_HOME : THandle;
procedure WMHOTKEY(var message: TMessage); message WM_HOTKEY;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
Win_Q := GlobalAddAtom('Min_Win-Q_HotKey');
Win_T := GlobalAddAtom('Min_Win-T_HotKey');
Win_Y := GlobalAddAtom('Min_Win-Y_HotKey');
Win_HOME := GlobalAddAtom('Min_Win-HOME_HotKey');
Registerhotkey(Handle, WIN_Q, MOD_WIN, Ord('Q'));
Registerhotkey(Handle, WIN_T, MOD_WIN, Ord('T'));
Registerhotkey(Handle, WIN_Y, MOD_WIN, Ord('Y'));
Registerhotkey(Handle, WIN_HOME, MOD_WIN, VK_HOME);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
UnRegisterHotkey(Handle, WIN_Q);
UnRegisterHotkey(Handle, WIN_Y);
UnRegisterHotkey(Handle, WIN_T);
UnRegisterHotkey(Handle, WIN_HOME);
GlobalDeleteAtom(WIN_Q);
GlobalDeleteAtom(WIN_Y);
GlobalDeleteAtom(WIN_T);
GlobalDeleteAtom(WIN_HOME);
end;
procedure TForm1.WMHOTKEY(var message: TMessage);
begin
if message.wParam = WIN_Q then ShowMessage('Win-Q')
else if message.wParam = WIN_Y then ShowMessage('Win-Y')
else if message.wParam = WIN_T then ShowMessage('Win-T')
else if message.wParam = WIN_HOME then ShowMessage('Win-HOME');
end;
end.
22. september 2004 - 18:24
#2
Nu er jeg kommet hertil:
-------------------------------------------------------------------------------------
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
THandle Win_Q = GlobalAddAtom("Min_Win-Q_HotKey");
THandle Win_T = GlobalAddAtom("Min_Win-T_HotKey");
RegisterHotKey(Application->Handle, WIN_Q, MOD_WIN, 'q');
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
UnregisterHotKey(Application->Handle, WIN_Q);
UnregisterHotKey(Application->Handle, WIN_T);
GlobalDeleteAtom(WIN_Q);
GlobalDeleteAtom(WIN_T);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::WMHOTKEY(TMessage& Msg)
{
if (Msg.WParamLo = WIN_Q)
{
Label1->Caption = "Q-tasten";
}
}
-------------------------------------------------------------------------------------
Men det virker ikke - og jeg får denne msg under compile:
[C++ Warning] Unit1.cpp(36): W8060 Possibly incorrect assignment
27. september 2006 - 15:04
#8
Hvis de viser sig at være linierne:
THandle Win_Q = GlobalAddAtom("Min_Win-Q_HotKey");
THandle Win_T = GlobalAddAtom("Min_Win-T_HotKey");
så ændre THandle til Handle, hvilket nok er mere korrekt...