Einzelnen Beitrag anzeigen

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