AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Nachricht global ausfiltern, noch vor dem Start des Hauptprogrammes

Nachricht global ausfiltern, noch vor dem Start des Hauptprogrammes

Ein Thema von hoika · begonnen am 27. Jun 2016 · letzter Beitrag vom 27. Jun 2016
Antwort Antwort
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#1

Nachricht global ausfiltern, noch vor dem Start des Hauptprogrammes

  Alt 27. Jun 2016, 14:47
Hallo,
bei einem konvertibel NoteBook unter Windows 10 schmiert die DefWndProc in ntdll.dll ab.
Die Message ist immer 581 (WM_POINTERUPDATE), siehe auch dieser Thread.

http://www.delphipraxis.net/189031-m...l-gesucht.html

Wie kann ich die 581 global in meinem Programm ausknippsen.
Da es bereits noch vor dem Erzeugen des Hauptprogrammes passiert war (habe MadExcept-Auszug des Kunden),
müßte das noch vor der DPR passieren.

Ich habe also eine Unit geschrieben, die die erste in der DPR ist,
dann dort ein initialization rein.

Die Ursache des Absturzes will ich später analysieren (ich habe gar kein solches Notebook hier).

Da ich einige Komponenten habe, die die WndProc-Methode überschreiben,
wollte ich das an einer zentralen Stelle machen.

1. Ansatz
Application.OnMessage
ging gar nicht, dank einem ominösen TMultiCaster (unit AppEvnts), der das Application.OnMessage überschreibt.
siehe Ansatz 4

2. Ansatz
Application.HookMainWindow
macht genau das, also nur das MainWindow, sobald ein anderes Fenster/Form seine WndProc überschreibt, geht nix

3. Ansatz
Hooks
The CallWndProc hook procedure can examine the message, but it cannot modify it. After the hook procedure returns control to the system, the message is passed to the window procedure.
geht also auch nicht

4. Ansatz
AppEvents, leider wird die WndProc der Komponente vor der AppEvent-Methode aufgerufen

Was kann ich denn noch tun?

Hier mal mein Code, sieht etwas wild aus wegen den vielen Versuchen.

Delphi-Quellcode:
unit TouchScrollen;

interface

implementation

uses
  Windows, Messages, SysUtils, Forms, IniFiles,
  AppEvnts;

type
  TMessageObject = class
    procedure MyMessage(var Msg: TMsg; var handled: Boolean);
  end;

var
  _LocalIni: TIniFile;
  bKeinTouchScrollen: Boolean;
  MessageObject: TMessageObject;
  AppEvents: TApplicationEvents;

procedure TMessageObject.MyMessage(var Msg: TMsg; var handled: Boolean);
begin
  if Msg.message=581 then
  begin
    if bKeinTouchScrollen then
    begin
      handled := True;
    end;
  end;
end;

(*
function MyWndHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  if bKeinTouchScrollen then
  begin
    if nCode=581 then
    begin
      Result := 0;
      Exit;
    end;
  end;

  Result := CallNextHookEx(FWndHook, nCode, wParam, lParam);
end;
*)


initialization

  MessageObject := nil;

  AppEvents := nil;

  _LocalIni:= TIniFile.Create(ExtractFilePath(Application.ExeName)+'My.Ini');
  try
    bKeinTouchScrollen := _LocalIni.ReadBool('General', 'NoTouchScroll', False);
    if bKeinTouchScrollen then
    begin
      MessageObject := TMessageObject.Create;

      //Application.OnMessage := MessageObject.MyOnGetMessage;
      //Application.HookMainWindow(MessageObject.MyHookFunc);
      //FWndHook := SetWindowsHookEx(WH_CALLWNDPROC, MyWndHook, 0, GetCurrentThreadId());

      //Application.m
      //procedure TMultiCaster.AddAppEvent(AppEvent: TCustomApplicationEvents);
      AppEvents := TApplicationEvents.Create(nil);
      AppEvents.OnMessage := MessageObject.MyMessage;
    end;
  finally
    _LocalIni.Free;
  end;

finalization

  //Application.OnMessage := nil;
  //FreeAndNil(MessageObject);

  //Application.UnHookMainWindow(MessageObject.MyHookFunc);

end.
Heiko

Geändert von hoika (27. Jun 2016 um 14:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.097 Beiträge
 
Delphi 12 Athens
 
#2

AW: Nachricht global ausfiltern, noch vor dem Start des Hauptprogrammes

  Alt 27. Jun 2016, 16:48
Ja, der Erfinder von TApplicationEvents sollte dafür erschossen werden.
Da erfindet der etwas, damit es keine Konflikte mehr gibt und dann produziert das Ding selber Konflikte mit Altcode.


1, 4: Application.OnMessage wird doch vor der Verarbeitung (IsPreProcessMessage/IsHintMsg/IsMDIMsg/IsKeyMsg/IsDlgMsg und TranslateMessage/DispatchMessage) ausgeführt.
Also einfach in Application.OnMessage Handled:=True und/oder Msg.message := WM_NULL; ,
aber ein Blick in TApplication.ProcessMessage zeigt, dass nachher dennoch einige Messages verarbeitet werden, selbst wenn Handled=True.

2: Rausfinden was Msg.Wnd ist und dessen WndProc hooken.

3: Du mußt GetMessage/PeekMessage (WH_GETMESSAGE) hooken und nicht DispatchMessage (WH_CALLWNDPROC).
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (27. Jun 2016 um 17:02 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Nachricht global ausfiltern, noch vor dem Start des Hauptprogrammes

  Alt 27. Jun 2016, 19:20
Hallo,

Ja, der Erfinder von TApplicationEvents sollte dafür erschossen werden.
Da erfindet der etwas, damit es keine Konflikte mehr gibt und dann produziert das Ding selber Konflikte mit Altcode.
hm, ist da mein Code gemeint?

1, 4: Application.OnMessage wird doch vor der Verarbeitung (IsPreProcessMessage/IsHintMsg/IsMDIMsg/IsKeyMsg/IsDlgMsg und TranslateMessage/DispatchMessage) ausgeführt.
Also einfach in Application.OnMessage Handled:=True und/oder Msg.message := WM_NULL; ,
aber ein Blick in TApplication.ProcessMessage zeigt, dass nachher dennoch einige Messages verarbeitet werden, selbst wenn Handled=True.
Klappt eben nicht.
Habe ich doch ausprobiert.


2: Rausfinden was Msg.Wnd ist und dessen WndProc hooken.

3: Du mußt GetMessage/PeekMessage (WH_GETMESSAGE) hooken und nicht DispatchMessage (WH_CALLWNDPROC).
Hook nützt ja nichts, ich will, dass die Nachricht "verschwindet", laut MS kann die Nachtricht aber nicht verändert werden. Oder geht das doch???.


Ich habe auf meine Proc und die WndProc (hier z.B. von WPTools) Breakpoints gesetzt,
am Anfang klappt es, aber sobald die WPTools-WndProc aufgerufen wird, kommt meine Proc
nicht mehr zum Zug. Ich müßte also sämtliche Module, wo WndProc überschrieben wird,
selbst anpassen.
Heiko
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 05:15 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