AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit WndProc

Ein Thema von mischer · begonnen am 9. Jun 2004 · letzter Beitrag vom 10. Jun 2004
Antwort Antwort
Seite 1 von 2  1 2      
mischer

Registriert seit: 9. Jun 2004
10 Beiträge
 
Delphi 5 Professional
 
#1

Problem mit WndProc

  Alt 9. Jun 2004, 09:52
Morgen,

ich hab ein Problem mit der WndProc. Ich hab die überschrieben wie folgt:
Code:
type
  ...
  procedure WndProc(var msg : TMessage); override;
  ...

procedure TForm1.WndProc(var msg : TMessage);
begin
  if (msg.Msg = WM_KeyUP) or (msg.Msg = WM_KeyDown) then showmessage('Key');
//  inherited WndProc(msg);
end; {end function}

  ...
Zur Erklärung: Ich fange F-Tasten Befehle in einem Hook ab, sende diese per
Code:
sendmessage(HWND_BROADCAST, ncode, wparam, lparam);
nach draußen und will die dann mit obenstehender Procedure auffangen.
Jetzt bekomme ich beim Starten des Programms die Meldung 'Win32 Fehler. Code 1411. Klasse nicht vorhanden.'

Was soll das?

Danke für Eure Hilfe

MfG mischer
  Mit Zitat antworten Zitat
mischer

Registriert seit: 9. Jun 2004
10 Beiträge
 
Delphi 5 Professional
 
#2

Re: Problem mit WndProc

  Alt 9. Jun 2004, 10:21
Neuer Versuch:

ich hab die alten Codefragmente gelöscht und hab jetzt folgendes im Hauptprogramm stehen:

Code:
program Hilfe;

uses
  Forms, Windows, Messages, Dialogs,
  FASHilfeSystem in 'FASHilfeSystem.pas' {DorSylv},
  HilfsUnit in 'HilfsUnit.pas';

{$R *.RES}

function WndProc(hWnd: HWND; uMsg: UINT; wParam: wParam; lParam: LParam):
  lresult; stdcall;
begin
  showmessage('WindowProc');
end;

begin
  Application.Initialize;
  Application.Title := ' Hilfe';
  Application.CreateForm(TDorSylv, DorSylv);
  Application.Run;
end.
Aber: Keine Reaktion! Mein Hook sendet die Messages raus aber das Programm interessiert das nicht im Geringsten.

MfG mischer
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Problem mit WndProc

  Alt 9. Jun 2004, 13:21
Deine erste WndProc war eigentlich schon funktionsfähig. Allerdings sollte < inherited WndProc(msg); > nicht als Kommentar da stehen, sondern ganz normal aktiv sein. Ist es das nicht, bekomme ich nämlich auch so eine Meldung:

'Systemfehler. Code: 1411. Klasse ist nicht vorhanden'.


Und zum zweiten Versuch: Für das Einbauen derartiger nicht-Delphi-liken WndProcs braucht man doch zusätzlich auch immer noch eine solche Zeile, wie:

OldWndProcAddr := SetWindowLong(AHandle,GWL_WndProc,integer(@ownWndP roc));
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
mischer

Registriert seit: 9. Jun 2004
10 Beiträge
 
Delphi 5 Professional
 
#4

Re: Problem mit WndProc

  Alt 9. Jun 2004, 13:41
Danke!

und wo?

ich stell mich heute irgendwie wieder extrem braun an glaube ich

mfg mischer
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Problem mit WndProc

  Alt 9. Jun 2004, 14:01
So etwas würde ich überhaupt nicht in die Projektdatei reinschreiben, es denn, es gäbe dafür einen zwingenden Grund. Normalerweise kann man das nämlich auch immer gut in der jeweiligen Mainform unterbringen, und zwar dort z.B. im OnCreate-Eventhandler.


Allerdings auch bei solchen API-gestützten WndProcs gilt eigentlich: Generell sind die Messages in eigenen WndProcs an deren Ende auch immer an die davor an dieser Stelle installierten WndProcs weiterzugeben:

Result := CallWindowProc(Pointer(OldWndProcAddr), hWnd1, uMsg, wP, lP);

...denn sonst würdest du ja dadurch deine Form bzw. Control von allen übrigen Messages (die du z.B. nicht nur abfangen möchtest etc.) völlig abschneiden.
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Problem mit WndProc

  Alt 9. Jun 2004, 14:11
Moin!

@TStringList: Wenn er es überschreibt, wird das eh gemacht, weil am Ende der Procedure sollte man ein Inherited Aufruf machen...

@other: Wieso stört es hier keinen, das er die WndProc() einfach so in die Projektdatei schreibt? Wer soll die denn aufrufen? Welche WndProc überschreibt er? Wo wird die WndProc irgendwo zugewiesen? So lange sie nicht in einer von TWinControl (oder vielleicht jüngeren Klasse) abgeleiteten Klasse definiert ist und die Original WndProc() überschreibt, wird diese doch überhaupt nicht aufgerufen oder sehe ich das jetzt falsch? Ansonsten gibt es IMHO noch die Möglichkeit die Application WndProc über die Application Instanz zu überschreiben, aber auch das wird hier nicht gemacht ...

Bitte klärt mich auf, wie der Code funktionieren soll (was er anscheinend ja wohl soll, weil es sagt bisher keiner was dagegen...)

MfG
Muetze1
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Problem mit WndProc

  Alt 9. Jun 2004, 14:25
Hätte man die Forensuche bemüht, hätte man diesen Beitrag von mir gefunden: http://www.delphipraxis.net/internal...ct.php?t=27193
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Problem mit WndProc

  Alt 9. Jun 2004, 14:43
@Muetze1

Ich bin von dem ausgegangen, was er in seinen ersten beiden Posts diesbezüglich angegeben hat. Und dort hatte er das eben nuneinmal nur als Comment formuliert und das zweite mal gar nicht, daher...

Und alles restliche an Notwendigkeit ergibt sich ja mehr oder weniger aus dieser Zeile

OldWndProcAddr := SetWindowLong(AHandle,GWL_WndProc,integer(@ownWndP roc));

auch von selbst.
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
mischer

Registriert seit: 9. Jun 2004
10 Beiträge
 
Delphi 5 Professional
 
#9

Re: Problem mit WndProc

  Alt 9. Jun 2004, 14:48
Hi Muetze1,

Wie du sicher schon bemerkt hast bin ich noch ein ziemlicher Delphi-Trollel

Also folgendes: Ich will mit einem Programm ein Anderes steuern (Mouse bewegen, Clicks ausführen, ...). Das funktioniert soweit wunderbar per Buttons. Jetzt wollte ich noch, daß sich das Programm per Tasten steuern läßt und hab dazu einen Tastaturhook gebaut und eingebunden. (Was soweit auch funktioniert, ich hab messageboxen in den Hook eingebaut und die kommen an den richtigen stellen *freu*)
Code:
function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
//es ist ebenfalls moeglich die Bearbeitung an eine Bedingung zu knuepfen
//it's possible to call CallNextHookEx conditional only.
  Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
  case nCode < 0 of
    TRUE: exit; //wenn code kleiner 0 wird nix gemacht
                //if code smaller 0 nothing has to be done
    FALSE:
      begin
        // Taste F1 gedrückt
        if (wparam = 112) and (lparam < 0) then begin
          // nix
        end;
        // Taste F2 gedrückt
        if (wparam = 113) and (lparam < 0) then begin
          sendmessage(HWND_BROADCAST, ncode, wparam, lparam);
        end;
        // Taste F3 gedrückt
        if (wparam = 114) and (lparam < 0) then begin
          sendmessage(HWND_BROADCAST, ncode, wparam, lparam);
        end;
        // Taste F4 gedrückt
        if (wparam = 115) and (lparam < 0) then begin
          showmessage('F4 gedrückt');
          sendmessage(HWND_BROADCAST, ncode, wparam, lparam);
        end;
//Hier kann jetzt alles bearbeitet werden
//Here one can work with the parameters
      end;
  end;
end;
Und wie du siehst schicke ich anschließend die Message an Broadcast wieder raus.

Nun hätte ich gern, daß diese Messages in meinem Programm das KeyUp-/KeyDown-Ereignis auslösen. Funktioniert auch, aber eben nur wenn das Fenster aktiv ist - isses aber im Normalfall nicht.

Jetzt habe ich versucht mit Code wie im 1. post nachzulesen diese Messages aufzufangen, aber genau da habe ich offensichtlich meinen Bug drin. Ich hoffe das war ausführlich genug und bedanke mich schon jetzt für jedwede Mühe.

MfG mischer
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Problem mit WndProc

  Alt 9. Jun 2004, 15:08
Schon den Thread auf den ich verlinkt habe angekuckt?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:11 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