Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi WM_Hotkey und WndProc - Error : Ungültiges Fensterhandle !?! (https://www.delphipraxis.net/55457-wm_hotkey-und-wndproc-error-ungueltiges-fensterhandle.html)

Assun 21. Okt 2005 11:39


WM_Hotkey und WndProc - Error : Ungültiges Fensterhandle !?!
 
Hi !

Edit //

Also der error is nur weg und es lässt sich kompilieren...

jedoch kommt nun beim start des Programmes der error "ungültiges Fensterhandle" und das Prog killt sich selbst wieder :(

hier mein kompletter Code :

Delphi-Quellcode:
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, XPMan, ComCtrls, jpeg, ExtCtrls, Menus, ButtonComps;

type
  TForm1 = class(TForm)
    Image1: TImage;
    ImageButton1: TImageButton;
    ImageButton2: TImageButton;
    ImageButton3: TImageButton;
    Bezeichnung: TEdit;
    Aktion: TEdit;
    Aktion2: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure ImageButton2Click(Sender: TObject);
    procedure ImageButton1Click(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private

  public
    procedure WMHotKey(var msg: TMessage); message WM_HOTKEY;
    procedure WndProc(var mymsg: TMessage); override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  MY_MENU_ID = 999;

procedure TForm1.WndProc(var mymsg: TMessage);
var
  hMenu       : THandle;
begin
  // Unnötige Systemmenü-Punkte entfernen
  hMenu := GetSystemMenu(Handle, False);
  if hMenu <> 0 then
  begin
    if not DeleteMenu(hMenu, 6, MF_BYPOSITION) then
      ShowMessage(SysErrorMessage(GetLastError));
    DrawMenuBar(hMenu);
  end;
end;


// Auf die HotKeys reagieren
procedure TForm1.WMHotKey(var msg: TMessage);
begin
  Case msg.WParam of
    01: ShowMessage('F1');
    02: ShowMessage('F2');
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
// HotKeys registrieren
RegisterHotKey(Handle,01,0,vk_F1);
RegisterHotKey(Handle,02,0,vk_F2);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
// HotKeys wieder freigeben
UnregisterHotKey(Handle,01);
UnregisterHotKey(Handle,02);
end;




procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
Form1.Perform(WM_SYSCOMMAND, $F012, 0);
end;

procedure TForm1.ImageButton1Click(Sender: TObject);
begin
Application.Terminate;
end;

procedure TForm1.ImageButton2Click(Sender: TObject);
begin
Application.Minimize;
end;


end.

Chewie 21. Okt 2005 11:42

Re: WM_Hotkey und WndProc vertragen sich nicht !?!?
 
Dein Fehler ist wohl, dass du die Methoden nur deklariert, aber nicht definiert hast.

Assun 21. Okt 2005 12:01

Re: WM_Hotkey und WndProc vertragen sich nicht !?!?
 
:gruebel: und was genau bedeutet das ?

sry ich habs nicht so mit diesen Begriffen ;-)

jim_raynor 21. Okt 2005 12:06

Re: WM_Hotkey und WndProc vertragen sich nicht !?!?
 
Irgendwo in deinem Sourcecode musst du auch
Delphi-Quellcode:
procedure TForm1.WndProc(var mymsg: TMessage);
begin
  ...
end;
haben. Ansonsten, wenn du nur die Hotkeys abfangen möchtest, brauchst du die WndProc nicht überschreiben.

Assun 21. Okt 2005 13:44

Re: WM_Hotkey und WndProc - Error : Ungültiges Fensterhandle
 
Hi !

Edit //

Also der error is nur weg und es lässt sich kompilieren...

jedoch kommt nun beim start des Programmes der error "ungültiges Fensterhandle" und das Prog killt sich selbst wieder :(

hier mein kompletter Code :

Delphi-Quellcode:
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, XPMan, ComCtrls, jpeg, ExtCtrls, Menus, ButtonComps;

type
  TForm1 = class(TForm)
    Image1: TImage;
    ImageButton1: TImageButton;
    ImageButton2: TImageButton;
    ImageButton3: TImageButton;
    Bezeichnung: TEdit;
    Aktion: TEdit;
    Aktion2: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure ImageButton2Click(Sender: TObject);
    procedure ImageButton1Click(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private

  public
    procedure WMHotKey(var msg: TMessage); message WM_HOTKEY;
    procedure WndProc(var mymsg: TMessage); override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  MY_MENU_ID = 999;

procedure TForm1.WndProc(var mymsg: TMessage);
var
  hMenu       : THandle;
begin
  // Unnötige Systemmenü-Punkte entfernen
  hMenu := GetSystemMenu(Handle, False);
  if hMenu <> 0 then
  begin
    if not DeleteMenu(hMenu, 6, MF_BYPOSITION) then
      ShowMessage(SysErrorMessage(GetLastError));
    DrawMenuBar(hMenu);
  end;
end;


// Auf die HotKeys reagieren
procedure TForm1.WMHotKey(var msg: TMessage);
begin
  Case msg.WParam of
    01: ShowMessage('F1');
    02: ShowMessage('F2');
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
// HotKeys registrieren
RegisterHotKey(Handle,01,0,vk_F1);
RegisterHotKey(Handle,02,0,vk_F2);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
// HotKeys wieder freigeben
UnregisterHotKey(Handle,01);
UnregisterHotKey(Handle,02);
end;




procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
Form1.Perform(WM_SYSCOMMAND, $F012, 0);
end;

procedure TForm1.ImageButton1Click(Sender: TObject);
begin
Application.Terminate;
end;

procedure TForm1.ImageButton2Click(Sender: TObject);
begin
Application.Minimize;
end;


end.

PS : der Systemmenü Code ist übrigends von Luckie ;-)

Aber es geht wie gesagt nicht wirklich :(

Assun 22. Okt 2005 15:26

Re: WM_Hotkey und WndProc - Error : Ungültiges Fensterhandle
 
Weis jemand Rat ? :duck:

SirThornberry 22. Okt 2005 15:32

Re: WM_Hotkey und WndProc - Error : Ungültiges Fensterhandle
 
das ganze dürfte aber nix mit dem Hotkey zu tun haben sondern eher damit das du jedes mal wenn eine Message für deine Klasse ankommt das Menüitem löschen willst. Es reicht doch wenn du das ein einzige mal machst (und nicht jedes mal wenn irgend eine message an dein programm kommt)

Nogge 25. Nov 2005 14:51

Re: WM_Hotkey und WndProc - Error : Ungültiges Fensterhandle
 
Hallo Assun,
SirThornberry hat recht. Außerdem musst du unbedingt ein inherited in die erste Zeile deiner
Delphi-Quellcode:
procedure TForm1.WndProc(var mymsg: TMessage);
schreiben, sonst wird keine einzige Nachricht weitergeleitet. Dadurch beendet sich dein Programm beim Start sofort, weil es keine Nachricht erhält.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz