Entwickler-Ecke

Windows API - Systemweite Hotkeys kommen immer noch nicht an


Regan - Do 25.01.07 21:15
Titel: Systemweite Hotkeys kommen immer noch nicht an
Hallo,
ich hab in meinem Programm Systemweite Hotkeys reingeschrieben. Leider erkennt mein Programm diese nicht wieder. Hier mal mein Quelltext:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
type
TWMHotkey = record
    Msg: Cardinal;
    idHotKey: Word;
    Modifiers: Integer;
    VirtKey: Integer;
    end;
{...}
  private
    strs: array[0..128] of HSTREAM;
    strc: Integer;
    procedure Error(msg: string);
    procedure WMHotKey(var Msg: TWMHotKey); Message WM_HOTKEY;
    { Private-Deklarationen }
{...}
procedure TForm1.WMHotKey(Var Msg: TWMHotkey);
begin
{hier kommt nichts an}
case Msg.IdHotKey of
    ID: Abspielen(1);
    ID+1: Abspielen(2);
    ID+2: Abspielen(3);
    ID+3: Abspielen(4);
    ID+4: Abspielen(5);
    ID+5: Abspielen(6);
    ID+6: Abspielen(7);
    ID+7: Abspielen(8);
    ID+8: Abspielen(9);
    // Abhängig von der ID wird entschieden, was getan werden soll.
  end;
  inherited;
end;


{...}
procedure TForm1.FormCreate(Sender: TObject);
begin
registerHotKey(handle,1,MOD_CONTROL or MOD_ALT, Ord('1'));
registerHotKey(handle,2,MOD_CONTROL or MOD_ALT, Ord('2'));
registerHotKey(handle,3,MOD_CONTROL or MOD_ALT, Ord('3'));
registerHotKey(handle,4,MOD_CONTROL or MOD_ALT, Ord('4'));
registerHotKey(handle,5,MOD_CONTROL or MOD_ALT, Ord('5'));
registerHotKey(handle,6,MOD_CONTROL or MOD_ALT, Ord('6'));
registerHotKey(handle,7,MOD_CONTROL or MOD_ALT, Ord('7'));
registerHotKey(handle,8,MOD_CONTROL or MOD_ALT, Ord('8'));
registerHotKey(handle,9,MOD_CONTROL or MOD_ALT, Ord('9'));
end;
{...}
procedure TForm1.FormDestroy(Sender: TObject);
begin
  UnregisterHotKey(Handle, 1);
  UnregisterHotKey(Handle, 2);
  UnregisterHotKey(Handle, 3);
  UnregisterHotKey(Handle, 4);
  UnregisterHotKey(Handle, 5);
  UnregisterHotKey(Handle, 6);
  UnregisterHotKey(Handle, 7);
  UnregisterHotKey(Handle, 8);
  UnregisterHotKey(Handle, 9);

end;

Warum kommt da kein Befehl an?


Gausi - Fr 26.01.07 15:47

also bei mir geht das so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
 procedure hotkey(var msg:Tmessage); message WM_HOTKEY;

RegisterHotkey(Form1.handle,1,MOD_CONTROL or MOD_ALT, $BB);  // +
RegisterHotkey(Form1.handle,2,MOD_CONTROL or MOD_ALT, $BD);  // -

procedure TTntForm1.hotkey(var msg:Tmessage);
begin
  case msg.wparam of
    1: begin
       //...Lauter
      end;
    2: begin
       //...Leiser
      end;
   end;
end;


Regan - Fr 26.01.07 15:56

:cry: :cry: :cry: :cry:
Bei mir gehts immer noch nich. Selbst mit deinem Code.Es kommt einfach nichts bei

Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.hotkey(var msg:Tmessage);
begin
ShowMessage(Hy);
end;

an. Nicht mal ansatzweise wird diese Funtkion aufgerufen.


Gausi - Fr 26.01.07 16:07

Was liefert denn Registerhotkey zurück? Wird das überhaupt erfolgreich durchgeführt, oder sind diese Hotkeys schon von anderen Anwendungen belegt, weswegen das dann fehlschlägt?


Regan - Fr 26.01.07 18:28

Das Einstellen der Hotkeys funktioniert perfekt. Die Funtkion liefert true zurück (was ja auch kein wunder is. wer belegt schon den zehnerblock ^^) Allerdings kommt bei TForm1.Hotkeys nichts an. Selbst wenn ich ne ShowmEssage mache, um zu überprüfen, ob die Procedure ausgerufen wird, wird diese ShowmEssage nicht angezeigt. Muss ich villeicht was im uses hinzufügen?


Regan - Mi 31.01.07 16:38

hat jemand anderes villeicht Lösungsvorschläge oder andere Lösungen?


Karlson - Fr 02.02.07 22:29

Du belegst nicht den 10er-Block!

Die Konstanten für den Zehnerblock lauten VK_Numpad0...VK_Numpad9


Regan - Sa 03.02.07 10:40

user profile iconKarlson hat folgendes geschrieben:
Du belegst nicht den 10er-Block!

Die Konstanten für den Zehnerblock lauten VK_Numpad0...VK_Numpad9

OK. Quellcode geändert:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
unit nippel;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, MPlayer, mmsystem, ExtCtrls, Bass, jpeg, ImgList, inifiles, registry, ActiveX,  ShlOBJ,ShellAPI, CoolTrayIcon, ComCtrls;

type
  TWMHotkey = record
    Msg: Cardinal;
    idHotKey: Word;
    Modifiers: Integer;
    VirtKey: Integer;
    end;

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
{...}
    procedure FormCreate(Sender: TObject);
    procedure Abspielen(Buttonno:Integer);
  private
    strs: array[0..128] of HSTREAM;
    strc: Integer;
    procedure Error(msg: string);

    { Private-Deklarationen }
  public
    procedure SlotsEinstellen();
        procedure hotkey(var msg:Tmessage); message WM_HOTKEY;
    { Public-Deklarationen }
  end;

  const
CSIDL_APPDATA = $001A;

var
  Form1: TForm1;


implementation

uses info, einstellungen;

{$R *.dfm}
{...}
procedure TForm1.hotkey(var msg:Tmessage);
begin
ShowMessage('Hy'); //hier kommt nichts an
Abspielen(msg.WParam);
Abspielen(msg.LParam);
Abspielen(msg.Result);
inherited;
end;

procedure TForm1.FormCreate(Sender: TObject);
var iniko:Tinifile;
f:PChar;
ok: longbool;
begin
ok:=RegisterHotkey(Form1.handle,1,MOD_CONTROL or MOD_ALT, VK_NUMPAD1);
if ok then ShowMessage('1 Eingerichtet!'); 
  ok:=RegisterHotKey(Form1.Handle, 2, MOD_CONTROL or MOD_ALT, VK_NUMPAD2);
  if ok then ShowMessage('2 Eingerichtet!');
  ok:=RegisterHotKey(Form1.Handle, 3, MOD_CONTROL or MOD_ALT, VK_NUMPAD3);
  if ok then ShowMessage('3 Eingerichtet!');
  ok:=RegisterHotKey(Form1.Handle, 4, MOD_CONTROL or MOD_ALT, VK_NUMPAD4);
  if ok then ShowMessage('4 Eingerichtet!');
  ok:=RegisterHotKey(Form1.Handle, 5, MOD_CONTROL or MOD_ALT, VK_NUMPAD5);
  if ok then ShowMessage('5 Eingerichtet!');
  ok:=RegisterHotKey(Form1.Handle, 6, MOD_CONTROL or MOD_ALT, VK_NUMPAD6);
  if ok then ShowMessage('6 Eingerichtet!');
  ok:=RegisterHotKey(Form1.Handle, 7, MOD_CONTROL or MOD_ALT, VK_NUMPAD7);
  if ok then ShowMessage('7 Eingerichtet!');
  ok:=RegisterHotKey(Form1.Handle, 8, MOD_CONTROL or MOD_ALT, VK_NUMPAD8);
  if ok then ShowMessage('8 Eingerichtet!');
  ok:=RegisterHotKey(Form1.Handle, 9, MOD_CONTROL or MOD_ALT, VK_NUMPAD9);
  if ok then ShowMessage('9 Eingerichtet!');
  (*
 Mod_control mod_shift mod_Alt
  *)

//Bei allen kommt true heraus (also die Messagebox wird angezeigt
  strc := 0;    // stream count
{...}
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  UnregisterHotKey(Handle, 1);
  UnregisterHotKey(Handle, 2);
  UnregisterHotKey(Handle, 3);
  UnregisterHotKey(Handle, 4);
  UnregisterHotKey(Handle, 5);
  UnregisterHotKey(Handle, 6);
  UnregisterHotKey(Handle, 7);
  UnregisterHotKey(Handle, 8);
  UnregisterHotKey(Handle, 9);
end;

{...}

end.

Es funktioniert trotzdem nicht.


Karlson - Sa 03.02.07 20:05

In deinem Code befindet sich kein Fehler. Genauso wie du das machst funktioniert es bei mir.

Der Fehler liegt folglich bei dir. Vielleicht drückst du falsch (auch sicher alt und strg?).

Versuche mal einfach ord('A') anstelle von VK_Numpad.


Regan - Sa 03.02.07 21:23

user profile iconKarlson hat folgendes geschrieben:
In deinem Code befindet sich kein Fehler.

Das ist schön.
user profile iconKarlson hat folgendes geschrieben:
Genauso wie du das machst funktioniert es bei mir.

Aber bei mir und bei meinen Kumpels funktioniert es nicht.
user profile iconKarlson hat folgendes geschrieben:
Der Fehler liegt folglich bei dir.

Aber wo?
user profile iconKarlson hat folgendes geschrieben:
Vielleicht drückst du falsch (auch sicher alt und strg?).

Jep. Ganz sicher. Ich trinke nur zu Geburtstagen Alkohol.
user profile iconKarlson hat folgendes geschrieben:
Versuche mal einfach ord('A') anstelle von VK_Numpad.

Hab ich gemcht. Es geht nicht. Das Problem ist ja: Es wird gar nicht erst die Funktion Hotkey aufgerufen. Also diese Showmessage('Hy') kommt erst gar nicht.


Karlson - Sa 03.02.07 23:23

Irgendeine aggressive Firewall am laufen?

Probier das Programm aus. Versuch ob du einen Hotkey registrieren kannst.


Regan - So 04.02.07 14:00

user profile iconKarlson hat folgendes geschrieben:
Irgendeine aggressive Firewall am laufen?

Ich hab grad mal alles deaktiviert und trotzdem funktioniert es nicht. Und außerdem funktioniert Gausi's Nemp ohne Fehler.
user profile iconKarlson hat folgendes geschrieben:
Probier das Programm aus. Versuch ob du einen Hotkey registrieren kannst.

und wie?


Karlson - So 04.02.07 17:20

Programm Runterladen, in das Editfeld einen Buchstaben eintragen, auf Registrieren drücken. Dann STRG+ALT+Buchstabe drücken und im Memo nachschauen ob der Key angekommen ist.

achja: Und wenn du es nicht für nötig hälst einen freundlicheren Ton anzuschlagen kannste selber gucken wie du es hinbekommst :roll:


Regan - Mo 05.02.07 18:00

user profile iconKarlson hat folgendes geschrieben:
Programm Runterladen, in das Editfeld einen Buchstaben eintragen, auf Registrieren drücken. Dann STRG+ALT+Buchstabe drücken und im Memo nachschauen ob der Key angekommen ist.

achja: Und wenn du es nicht für nötig hälst einen freundlicheren Ton anzuschlagen kannste selber gucken wie du es hinbekommst :roll:

OK. OK. Ich werd mich versuchen wieder zu beruhigen. Ich nehm alles zurück, was irgendwie beleidigend klingen könnte.
Also. Ich hab mir dein Programm runtergeladen und ... du musst da was verwechselt haben. Ich find das Programm zwar auch cool, aber es hilft mir irgendiwe nicht weiter.
Ich geb dir auch noch n paar infos zum system:
Windows XP Service Pack 2
Borland Delphi 2005 Personal
Jedi Code Library installiert

Soll ich dir vielleicht mal meinen Projekt Ordner anhängen?


Karlson - Mo 05.02.07 19:15

Ui. Tut mir sehr leid. Mein Fehler! Die waren beide auf dem Desktop unter Project1.exe, die richtige wäre aber project2.exe gewesen.

Natürlich war ich auch schon so schlau und habe mein Desktop aufgeräumt...Ich schreibs heute abend nocheinmal neu.


Regan - Mo 05.02.07 19:17

user profile iconKarlson hat folgendes geschrieben:
Ui. Tut mir sehr leid. Mein Fehler! Die waren beide auf dem Desktop unter Project1.exe, die richtige wäre aber project2.exe gewesen.

Natürlich war ich auch schon so schlau und habe mein Desktop aufgeräumt...Ich schreibs heute abend nocheinmal neu.

Das ist nett. Ich hab jetzt sogar eine Übergangslösung gefunden. Wenn das Fenster offen ist, dann benutze ich einfach OnKeyUp. Leider ist das nicht systemweit.


Karlson - Mi 07.02.07 00:36

So.

Ich hab dir die Anwendung nochmal schnell zusammengeklickt.

Einfach einen gewünschten Buchstaben ins Editfeld eintragen (es geht nur a biz z).
Auf Registrieren klicken und dann die Tastenkombination drücken.

Wenn in der Listbox daraufhin [EMPFANGEN] steht kopierst du dir einfach den Code in deine Anwendung rüber:

Die Anwendung umfasst nur ein paar Zeilen Code, daher ist das so schneller wie das ganze Projekt hochzuladen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
procedure TForm1.WMHotkey(var msg: TMessage);
begin
 if msg.WParam=1 then
  listbox1.Items.add('[EMPFANGEN]');
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
 case Key of
  'a'..'z' : key:=char(integer(key)-32);
  'A'..'Z', char(VK_BACK):;
  else key:=#0;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var b : boolean;
begin
 listbox1.Items.Add('[REG]'+
                   BoolToStr(
                   RegisterHotKey(handle, 1, MOD_CONTROL or MOD_ALT, ord(edit1.text[1])),
                   true));
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 UnregisterHotKey(handle, 1);
end;


(Forward vom Handler nicht vergessen).


Regan - Mi 07.02.07 18:36

user profile iconKarlson hat folgendes geschrieben:

(Forward vom Handler nicht vergessen).

Was ist der Forward vom Handler?
Ich hab es jetzt mal ausprobiert und es geht trotzdem nicht. Ich hab dir mal die Anwendung drangehangen.


JayEff - Mi 07.02.07 18:52

user profile iconRegan hat folgendes geschrieben:
user profile iconKarlson hat folgendes geschrieben:

(Forward vom Handler nicht vergessen).

Was ist der Forward vom Handler?

Der Handler ist im OI unter Ereignisse der Eintrag dort. Verknüpfst du das Ereignis mit der Prozedur, hast du den Handler forwarded (wenn ich mich nicht irre ^^)

Hast du es mit einer neuen Tastenkombination bereits versucht?

und woher kommt bei dir das "inherited" ? Meine TForm1 hat keine prozedure WMHotkey... (Meine Prozedur heist WMhotkey, nicht hotkey.) Ausserdem glaube ich, mich zu erinnern, dass die prozedur privat deklariert werden muss... also

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
type TForm1
{...}
    Private
        Procedure WmHotkey(Var Msg: TMessage); Message WM_HOTKEY;
{...}
End;


Karlson - Mi 07.02.07 19:09

Lad mal bitte dein komplettes Projekt hoch. Mit dem Installer kann ich nichts anfangen.


Regan - Do 08.02.07 19:05

user profile iconJayEff hat folgendes geschrieben:
user profile iconRegan hat folgendes geschrieben:
user profile iconKarlson hat folgendes geschrieben:

(Forward vom Handler nicht vergessen).

Was ist der Forward vom Handler?

Der Handler ist im OI unter Ereignisse der Eintrag dort. Verknüpfst du das Ereignis mit der Prozedur, hast du den Handler forwarded (wenn ich mich nicht irre ^^)

Hmm... Das hab ich nicht gemacht.
user profile iconJayEff hat folgendes geschrieben:
Hast du es mit einer neuen Tastenkombination bereits versucht?

Ja. Aber ich möchte trotzdem das Numpad nehmen.
user profile iconJayEff hat folgendes geschrieben:
und woher kommt bei dir das "inherited" ? Meine TForm1 hat keine prozedure WMHotkey... (Meine Prozedur heist WMhotkey, nicht hotkey.) Ausserdem glaube ich, mich zu erinnern, dass die prozedur privat deklariert werden muss... also

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
type TForm1
{...}
    Private
        Procedure WmHotkey(Var Msg: TMessage); Message WM_HOTKEY;
{...}
End;

Dsa hab ich schon geändert. Hatte bloß nicht den quelltext aktuallisiert.

Ich hab jetzt das Projekt mal angehängt.


JayEff - Do 08.02.07 19:21

user profile iconRegan hat folgendes geschrieben:

user profile iconJayEff hat folgendes geschrieben:
Hast du es mit einer neuen Tastenkombination bereits versucht?

Ja. Aber ich möchte trotzdem das Numpad nehmen.
Is klar, die frage war mehr, hat es damit funktioniert, oder nicht? Denn wenn es funktioniert hat, können wir den teil mit RegisterHotkey als fehlerhaft ansehen, wenn nicht, dann ist es vielleicht eher der teil des Codes, der das hotkey registriert.


Regan - Do 08.02.07 21:00

user profile iconJayEff hat folgendes geschrieben:
user profile iconRegan hat folgendes geschrieben:

user profile iconJayEff hat folgendes geschrieben:
Hast du es mit einer neuen Tastenkombination bereits versucht?

Ja. Aber ich möchte trotzdem das Numpad nehmen.
Is klar, die frage war mehr, hat es damit funktioniert, oder nicht? Denn wenn es funktioniert hat, können wir den teil mit RegisterHotkey als fehlerhaft ansehen, wenn nicht, dann ist es vielleicht eher der teil des Codes, der das hotkey registriert.

Ich möchte das nochmal klarstellen:
Das Registrieren der Hoteys funktioniert. Alle Funktionen liefern "true" zurück. Allerdings kommt bei dem Programm an sich nichts an.

Und noch was: wie Forwarde ich den handler? Kannst du mir vielleicht nen screenshot zeigen oder code oder ne Beschreibung, wo ich das eintragen soll?


JayEff - Do 08.02.07 21:04

Stell dir vor, du hast einen Button1 auf deinem Formular. Nun kopierst du einen Quellcode in deine Unit wie

Delphi-Quelltext
1:
2:
3:
4:
Procedure TForm1.Button1Click(Sender: TObject);
Begin
    showmessage('hallo!');
End;

und das, ohne auf den Button zu doppel-klicken. beim ausführen und auf den Button klicken wird nix passieren, da Button1.onClick nicht mit der Prozedur verknüpft ist.
Doppelklickst du nun auf den Button, wird etwas wie Button1.onClick := Button1Click(Sender: TObject); ausgeführt und der Handler ist mit der Methode verknüpft.


Regan - Do 08.02.07 21:10

user profile iconJayEff hat folgendes geschrieben:
Stell dir vor, du hast einen Button1 auf deinem Formular. Nun kopierst du einen Quellcode in deine Unit wie

Delphi-Quelltext
1:
2:
3:
4:
Procedure TForm1.Button1Click(Sender: TObject);
Begin
    showmessage('hallo!');
End;

und das, ohne auf den Button zu doppel-klicken. beim ausführen und auf den Button klicken wird nix passieren, da Button1.onClick nicht mit der Prozedur verknüpft ist.
Doppelklickst du nun auf den Button, wird etwas wie Button1.onClick := Button1Click(Sender: TObject); ausgeführt und der Handler ist mit der Methode verknüpft.

OK Hab ich verstanden. und wie soll ich nun die TWMHotkey verknüpfen?


JayEff - Do 08.02.07 21:17

Damit hatte die sache nix zu tun. vielmehr wollte Karlson damit sagen, dass du, wenn du seinen code benutzt, die onKeyPress etc. Methoden verknüpfen sollst... Das ist also eher off topic.

Gut, nehmen wir an, das registrieren funktioniert perfekt, obwohl es mir nicht ausreicht, dass die funktionen true sagen.
Dann muss der code in deiner WMHotkey Prozedur liegen. benutz mal ganz genau meine, 1:1 kopiert

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
{...}
    Private
        Procedure WmHotkey(Var Msg: TMessage); Message WM_HOTKEY;
{...}
Procedure TForm1.WmHotkey(Var Msg: TMessage);
Begin
    showmessage('Eine WM_HOTKEY-Nachricht kam an!');
End;


Regan - Do 08.02.07 21:20

Hab ich gemacht. Die Funktion wird nicht aufgerufen.

user profile iconJayEff hat folgendes geschrieben:
Damit hatte die sache nix zu tun. vielmehr wollte Karlson damit sagen, dass du, wenn du seinen code benutzt, die onKeyPress etc. Methoden verknüpfen sollst... Das ist also eher off topic.

Kannst du dir nich lieber meinen code angucken. Dann siehst du ja den Fehler.


JayEff - Do 08.02.07 21:25

Ja kann ich. Fehler gefunden. Auf den ersten Blick :roll:
Dein code:

Delphi-Quelltext
1:
2:
3:
4:
5:
  private
    strs: array[0..128] of HSTREAM;
    strc: Integer;
    procedure Error(msg: string);
    procedure WMHotkey(var msg: TMessage);

mein Code:

Delphi-Quelltext
1:
2:
  private
        Procedure WmHotkey(Var Msg: TMessage); Message WM_HOTKEY;

Fällt dir was auf? :roll:


Regan - Do 08.02.07 21:32

OK Hab ich eingefügt. außerdem:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.FormCreate(Sender: TObject);
var iniko:Tinifile;
f:PChar;
i:Integer;
begin
RegisterHotkey(Form1.handle,1,MOD_CONTROL or MOD_ALT, VK_NUMPAD1);
RegisterHotkey(Form1.handle,2,MOD_CONTROL or MOD_ALT, VK_NUMPAD2);
RegisterHotkey(Form1.handle,3,MOD_CONTROL or MOD_ALT, VK_NUMPAD3);
RegisterHotkey(Form1.handle,4,MOD_CONTROL or MOD_ALT, VK_NUMPAD4);
RegisterHotkey(Form1.handle,5,MOD_CONTROL or MOD_ALT, VK_NUMPAD5);
RegisterHotkey(Form1.handle,6,MOD_CONTROL or MOD_ALT, VK_NUMPAD6);
RegisterHotkey(Form1.handle,7,MOD_CONTROL or MOD_ALT, VK_NUMPAD7);
RegisterHotkey(Form1.handle,8,MOD_CONTROL or MOD_ALT, VK_NUMPAD8);
RegisterHotkey(Form1.handle,9,MOD_CONTROL or MOD_ALT, VK_NUMPAD9);
RegisterHotkey(Form1.handle,10,MOD_CONTROL or MOD_ALT, VK_NUMPAD0);
{...}

Hast du jetzt mal compiliert? Also bei kommt nichts an.


JayEff - Do 08.02.07 21:49

Habe per SendMessage(Handle, WM_HOTKEY, 1, 0); die Nachricht bekommen. Es liegt definitiv am registrieren der Hotkeys, warum, kann ich dir nicht sagen. Ich spiel noch ein bisschen rum.


Regan - Do 08.02.07 21:54

user profile iconJayEff hat folgendes geschrieben:
Habe per SendMessage(Handle, WM_HOTKEY, 1, 0); die Nachricht bekommen.

Also kommen sie bei dir auch nicht an?
user profile iconJayEff hat folgendes geschrieben:
Es liegt definitiv am registrieren der Hotkeys, warum, kann ich dir nicht sagen. Ich spiel noch ein bisschen rum.

OK.


JayEff - Do 08.02.07 21:59

user profile iconRegan hat folgendes geschrieben:
user profile iconJayEff hat folgendes geschrieben:
Habe per SendMessage(Handle, WM_HOTKEY, 1, 0); die Nachricht bekommen.

Also kommen sie bei dir auch nicht an?

Doch, die Nachricht WM_HOTKEY, manuell gesendet, kommt an. Das problem ist, dass die Tastenkombination wohl keine WM_HOTKEY sendet. Sehr seltsam.

Edit: Argh! :cry: ich gebs auf. Ich find keine Fehler -.-


Karlson - Fr 09.02.07 02:15

Regan, vorhin schreibst du noch es würde allgemein kein Hotkey ankommen.
Jetzt stellt sich heraus das die Prozedur wohl doch so funktioniert wie beschrieben, wenn du eine andere Kombination registrierst als VK_Numpad.

Weiterhin gibst du in deinen Eingangspostings folgenden Code an:


Delphi-Quelltext
1:
2:
3:
[...]
    procedure WMHotKey(var Msg: TWMHotKey);Message WM_HOTKEY;
[...]


Schaut man sich deinen Quellcode an stellt sich heraus dass du das gehighlightete eben doch nicht drin stehen hast

Ich gehe mal davon aus das dass der Grund war warum bei dir grundsätzlich keine Hotkeys angekommen sind.

Das ärgerliche ist dass wir uns nicht über 2 Seiten hätten unterhalten müssen wenn du beim posten hier ein wenig sorgfältiger vorgegangen wärst.

Ehrlich gesagt habe ich das spezielle Problem mit VK_numpad nicht wahrgenommen, da ich davon ausgegangen bin das bei dir RegisterHotkey allgemein nicht so funktioniert wie es funktionieren sollte. (In wirklichkeit hat es aber die ganze Zeit geklappt, nur eben nicht mit den von dir präferierten Hotkeys, oder es hätte die ganze Zeit geklappt wenn der Code in deiner Anwendung so ausgesehen hätte wie der den du hier gepostet hast).

Egal, ich bin nicht darauf aus mich zu streiten. Außerdem muss ich mich leider aus der Diskussion verabschieden, ich habe einen Laptop der über keinen Numblock verfügt, kann ergo nichts testen.


viel erfolg noch und
gruss


JayEff - Fr 09.02.07 13:08

Leider stimmt das so nicht, wie du das sagst, Karlson. Ich habe das komplette projekt übernommen, bearbeitet und andere Tastencodes versucht. Abgesehen davon, dass die RegisterHotkey-Funktion true zurückgibt, klappt garnichts. Die WM_HOTKEY Nachricht wird durch keine Tastenkombination gesendet. Egal, ob ich eine benutze, die mein anderes Programm erfolgreich registrieren konnte, oder einfach nach dem Zufallsprinzip welche ausprobiere.
Kurios: Per SendMessage wird die WM_HOTKEY-Prozedur ausgelöst.
user profile iconKarlson hat folgendes geschrieben:
Außerdem muss ich mich leider aus der Diskussion verabschieden, ich habe einen Laptop der über keinen Numblock verfügt, kann ergo nichts testen.

Du kannst gern versuchen, andere Hotkeys zu registrieren, da auch das nicht funktioniert :(


zuma - Fr 09.02.07 13:25

evtl. mal alle inherited auskommentieren ?
inherited lässt alle methoden 'ererben',
daher werden die Hotkeys evtl. vom vererbenden Objekt
überlagert (z.b. abfangen/umleiten).
Falls man aber ererben will/muss, einfach vor dem
inherited den code schreiben, könnte helfen.


JayEff - Fr 09.02.07 13:26

Wie Regan bereits gesagt hat, ist diese Zeile nicht mehr vorhanden. Ausserdem, wäre sie noch da und würde ein Problem verursachen, so dürfte SendMessage(Handle, WM_HOTKEY, 0, 0) nicht die Prozedur auslösen.


Karlson - Fr 09.02.07 18:21

user profile iconJayEff hat folgendes geschrieben:
Leider stimmt das so nicht, wie du das sagst, Karlson. Ich habe das komplette projekt übernommen, bearbeitet und andere Tastencodes versucht. Abgesehen davon, dass die RegisterHotkey-Funktion true zurückgibt, klappt garnichts. Die WM_HOTKEY Nachricht wird durch keine Tastenkombination gesendet. Egal, ob ich eine benutze, die mein anderes Programm erfolgreich registrieren konnte, oder einfach nach dem Zufallsprinzip welche ausprobiere.
Kurios: Per SendMessage wird die WM_HOTKEY-Prozedur ausgelöst.
user profile iconKarlson hat folgendes geschrieben:
Außerdem muss ich mich leider aus der Diskussion verabschieden, ich habe einen Laptop der über keinen Numblock verfügt, kann ergo nichts testen.

Du kannst gern versuchen, andere Hotkeys zu registrieren, da auch das nicht funktioniert :(


Werf mal das CoolTrayIcon raus. Ich kann in seinem Code problemlos Hotkeys registrieren und die kommen auch an.


JayEff - Fr 09.02.07 19:59

user profile iconKarlson hat folgendes geschrieben:
Werf mal das CoolTrayIcon raus. Ich kann in seinem Code problemlos Hotkeys registrieren und die kommen auch an.

Nachdem du das CTI rausgeworfen hast? Echt? Du meinst, daran lags im endeffekt? das ist seltsam, da ich selbst schon 2 anwendungen mit CTI und hotkeys zum laufen gebracht, und deren code 1:1 in sein programm kopiert habe :gruebel:


Karlson - Fr 09.02.07 20:27

Ich weiss nicht 100%ig das es an CTR liegt.

Aber ich hab die Komponente nicht daher wurden die Deklarationen bei mir automatisch entfernt.

Bei mir funktioniert das Hotkeymachen problemlos, bei euch nicht.

Abgesehen davon das ich D6, Regan D2005 und du D7 benutzen haben wir ansonsten wohl keine Unterschiede.

Daher gehe ich davon aus, das es irgendeinen konflikt gibt. Welchen oder Warum, keine Ahnung. Aber irgendwo daran muss es liegen.


JayEff - Fr 09.02.07 20:38

Tut mir leid, am CTR scheint es nicht zu liegen - Ich habe es entfernt und dennoch keine Hotkey-Nachrichten erhalten.
Was kann da nur schief gehen :gruebel:


Karlson - Fr 09.02.07 20:46

So, ich lad mir jetzt nochmal Regans Projekt runter, füg meinen Hotkey-Code an einer X-beliebigen Stelle ein (und schmeisse Regans Hotkey-versuche raus) und lads dann hoch. Einmal das Projekt mit den QCs und dann noch mal eine kompilierte EXE.

Wenn du es bei dir dann wieder nicht klappt wenn du das Projekt selbst kompilierst, aber mit der kompilierten EXE schon, dann liegt es an irgendeiner Komponente o.ä.

Wenn es bei dir sowohl mit dem Kompiliertem QC als auch mit der EXE nicht klappt liegt es irgendwelchen Einstellungen des OS / Firewall / Virenscanner... die auftreten weil in dem Projekt noch irgendwas drin vorkommt (was auch immer).

Ich editier den Dateianhang dann hierein.


Also, wie gesagt mit EXE und QC getrennt versuchen.

Auf den Button1 klicken (der Hotkey wird registriert).

Wenn ihr dann STRG+ALT+A drückt sollte sich der Hintergrund rot färben.

Ich habe folgendes entfernt:

1.) Regans Hotkeyrecord (nicht der Grund, hab ich schon ausprobiert)
2.) TCoolTrayIcon (hab ich nicht)
3.) XPManifest (hab ich auch nicht)
4.) Das Hintergrundbild (auf Geschwindikeitsgründen)

Bin mal gespannt was jetzt rauskommt!


Regan - Fr 09.02.07 22:40

Also. ich hab mal ausprobiert. Es ändert sich nihts, wenn ich den QC oder die EXE nehme.

Also folgendes passiert:
Wenn das Porgramm offen ist, dann ändert sich beim drücken der Tastenkobination (egal welche ich nehme) die Farbe. Minimiere ich aber das Programm und drücke dann die Tastenkombination (was ich ja eigentlich will) dann ändert sich nichts.

Ich weiß jetzt an was es liegt: bass.dll

Wenn ich die nämlich rausnehme funktioniert das Ganze. Ihr könnts ja mal ausprobieren.

Da stellt sich für mich die Frage: Wie soll das jetzt weitergehen? Wie mach ich n Programm mit dem ich Musik abspielen will und gleichzeitig Hotkeys empfangen kann.


Karlson - Fr 09.02.07 22:43

Das hat ja gedauert...wenigstens ham wirs jetzt. Spricht etwas dagegen einen TMediaplayer zu benutzen, anstelle der Bass.dll?


Regan - Fr 09.02.07 22:46

http://www.delphi-forum.de/viewtopic.php?p=414759#414759
Ja. Außerdem möchte ich die Nippelbar noch video-fähig machen und da dachte ich, dass die bass.dll sehr geeignet wäre.


JayEff - Fr 09.02.07 22:56

Videos? Bass.dll? :shock: Das wäre mir neu. Wie auch immer, eines meiner Programme enthält die Bass.dll und die Hotkeys funktionieren :gruebel:


Regan - Mi 14.02.07 16:58

Pass mal auf. Ich hab mal seit Montag n bissl probiert und habe folgendes festgestellt:

1. Die Hotkeys funktionieren nicht. Egal, ob ichs mit Karlsons Programm mache oder mit meinem. (ich weiß, dass ich mich damit widerspreche, aber lest mal weiter)
2. Wenn ich, beim meiner NBar Str+Alt+Vk_Numpad1 registriere und dann Karlsons NBar aufrufe(meine ist schon weider geschlossen), dann funktionieren die bei mir eingestellten HKEys bei Karlsons Nippelbar (KNbar), aber nicht seine, die ich dann registriert habe. Starte ich KNBar und danach meine, dann passiert nichts. Auch kann ich die bass.dll rausnehmen und reinnehmen. es passiert gar nichts.

user profile iconJayEff hat folgendes geschrieben:
Videos? Bass.dll? :shock: Das wäre mir neu. Wie auch immer, eines meiner Programme enthält die Bass.dll und die Hotkeys funktionieren :gruebel:

Ich hab keine Ahnung. :nixweiss:

Darum: ich lass es sein. Dann lass ich halt die Hotkeys raus. :cry: :cry: :bawling:
Trotzdem Danke an alle die mir geholfen haben.