Avatar billede tigertool Nybegynder
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!
Avatar billede tigertool Nybegynder
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.
Avatar billede tigertool Nybegynder
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
Avatar billede tigertool Nybegynder
22. september 2004 - 18:25 #3
Nogen der kan hjælpe mig videre?
Avatar billede narrr Nybegynder
22. september 2004 - 19:30 #4
Prøv at skrive et stort Q i stedet for det lille i RegisterHotKey. Det virkede for mig.
Avatar billede tigertool Nybegynder
22. september 2004 - 19:45 #5
Jeg kan desværre ikke få det til at virke :(
Avatar billede tigertool Nybegynder
23. september 2004 - 21:51 #6
Lukker...
Avatar billede tommya Nybegynder
27. september 2006 - 15:03 #7
du skulle måske skrive hvilken linie der er linie 36, og vise os en kopi af din header fil
Avatar billede tommya Nybegynder
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...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester