Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi MessageBox mit timeout in einer Windows Notify DLL (https://www.delphipraxis.net/150295-messagebox-mit-timeout-einer-windows-notify-dll.html)

Otto84 13. Apr 2010 07:12


MessageBox mit timeout in einer Windows Notify DLL
 
Hallo zusammen,

ich hoffe ihr könnt mir weiterhelfen :cry: ,

Ich habe eine DLL für das Windows Notify Event geschrieben. Das event Winlogon Notify Event "Startup" startet aus meiner DLL eine bestimmte exportierte Funktion, in dieser Funktion gebe ich eine eine Info aus: "ShowMessage('Text');". Die Funktion wartet natürlich an dieser stelle im Code bis einer auf den "OK" Button drückt und geht dann erst weiter im Code. Ich möchte aber gerne noch ein Timeout für diese Info einstellen nach der diese Nachricht automatisch geschlossen wird und der Code weiter abgearbeitet wird.

Halt jemand eine Idee wie ich das lösen kann ?

Da ich grad erst anfange delphi zu Programmieren bitte beispiele Posten wenn möglich !


Danke,

Otto

sirius 13. Apr 2010 08:12

Re: MessageBox mit timeout in einer Windows Notify DLL
 
Am einfachsten du erstellst ein Formular, auf welches du einen Timer legst, der das Formular dann automatisch schließt.

Edit: Beispiel:
Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm2 = class(TForm)
    Label1: TLabel;
    Timer1: TTimer;
    Button1: TButton; //enabled auf false
    procedure Timer1Timer(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Timer1Timer(Sender: TObject);
begin
  close;
end;

procedure TForm2.FormShow(Sender: TObject);
begin
  timer1.Enabled:=true;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action:=caFree;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  close;
end;

end.
Aufruf:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var MessageForm:TForm2;
begin
  MessageForm:=TForm2.Create(nil);
  Messageform.Label1.Caption:='Meine Meldung';
  Messageform.Show;
end;

ATSV 13. Apr 2010 08:16

Re: MessageBox mit timeout in einer Windows Notify DLL
 
Evtl. hilft dir das hier weiter

Otto84 13. Apr 2010 08:56

Re: MessageBox mit timeout in einer Windows Notify DLL
 
Hallo, danke erstmal für die schnellen Antworten.

Ich probier es erstmal nach der Methode von Sirius, ich bekomme aber einen Fehler beim Compilieren "[DCC Fehler] E1026 Datei nicht gefunden: 'Unit2.dfm'". Hier mein Code:

Delphi-Quellcode:
library Project1;

uses
  Windows,
  Messages,
  SysUtils,
  Variants,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  StdCtrls,
  Registry,
  ShellApi,
  Unit2 in 'Unit2.pas' {$R *.res};

{$R *.res}

 type
   PFNMSGECALLBACK = function (bVerbose: BOOL; lpMessage: PWideChar):
 DWORD; stdcall;
   {$EXTERNALSYM PFNMSGECALLBACK}
   TFnMsgeCallback = PFNMSGECALLBACK;

   PWLX_NOTIFICATION_INFO = ^WLX_NOTIFICATION_INFO;
   {$EXTERNALSYM PWLX_NOTIFICATION_INFO}
   _WLX_NOTIFICATION_INFO = record
     Size: ULONG;
     Flags: ULONG;
     UserName: PWideChar;
     Domain: PWideChar;
     WindowStation: PWideChar;
     hToken: THandle;
     hDesktop: HDESK;
     pStatusCallback: PFNMSGECALLBACK;

end;
{$EXTERNALSYM _WLX_NOTIFICATION_INFO}
WLX_NOTIFICATION_INFO = _WLX_NOTIFICATION_INFO;
{$EXTERNALSYM WLX_NOTIFICATION_INFO}
TWlxNotificationInfo = WLX_NOTIFICATION_INFO;
PWlxNotificationInfo = PWLX_NOTIFICATION_INFO;


var MessageForm:TForm2;

procedure NotifyLogon(pInfo: PWLX_NOTIFICATION_INFO); stdcall;
begin

  MessageForm:=TForm2.Create(nil);
  Messageform.Label1.Caption:='Meine Meldung';
  Messageform.Show;

end;

  exports
   NotifyLogon;

begin
end.
Zum Projekt hinzugefühgt hab ich Unit2:

Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm2 = class(TForm)
    Label1: TLabel;
    Timer1: TTimer;
    Button1: TButton; //enabled auf false
    procedure Timer1Timer(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Timer1Timer(Sender: TObject);
begin
  close;
end;

procedure TForm2.FormShow(Sender: TObject);
begin
  timer1.Enabled:=true;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action:=caFree;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  close;
end;

end.

Otto84 13. Apr 2010 09:04

Re: MessageBox mit timeout in einer Windows Notify DLL
 
Ich habs auch nochmal mit der anderen Methode von ATSV versucht, mit folgendem Code:

Delphi-Quellcode:
library Project1;

uses
  Windows,
  Messages,
  SysUtils,
  Variants,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  StdCtrls,
  Registry,
  ShellApi,
  MpuWinNT in 'MpuWinNT.pas';

{$R *.res}

 type
   PFNMSGECALLBACK = function (bVerbose: BOOL; lpMessage: PWideChar):
 DWORD; stdcall;
   {$EXTERNALSYM PFNMSGECALLBACK}
   TFnMsgeCallback = PFNMSGECALLBACK;

   PWLX_NOTIFICATION_INFO = ^WLX_NOTIFICATION_INFO;
   {$EXTERNALSYM PWLX_NOTIFICATION_INFO}
   _WLX_NOTIFICATION_INFO = record
     Size: ULONG;
     Flags: ULONG;
     UserName: PWideChar;
     Domain: PWideChar;
     WindowStation: PWideChar;
     hToken: THandle;
     hDesktop: HDESK;
     pStatusCallback: PFNMSGECALLBACK;

end;
{$EXTERNALSYM _WLX_NOTIFICATION_INFO}
WLX_NOTIFICATION_INFO = _WLX_NOTIFICATION_INFO;
{$EXTERNALSYM WLX_NOTIFICATION_INFO}
TWlxNotificationInfo = WLX_NOTIFICATION_INFO;
PWlxNotificationInfo = PWLX_NOTIFICATION_INFO;


function MessageBoxTimeOut(hWnd: HWND; lpText: PChar; lpCaption: PChar; uType: UINT;
  wLanguageId: WORD; dwMilliseconds: DWORD): Integer; stdcall;
  external user32 name 'MessageBoxTimeoutA'
function MessageBoxTimeOutA(hWnd: HWND; lpText: PChar; lpCaption: PChar; uType: UINT;
  wLanguageId: WORD; dwMilliseconds: DWORD): Integer; stdcall;
  external user32 name 'MessageBoxTimeoutA'
function MessageBoxTimeOutW(hWnd: HWND; lpText: PWideChar; lpCaption: PWideChar; uType: UINT;
  wLanguageId: WORD; dwMilliseconds: DWORD): Integer; stdcall;
  external user32 name 'MessageBoxTimeoutW'

var
  ret              : DWORD;
  s                : string;

procedure ServerWallLogoff(pInfo: PWLX_NOTIFICATION_INFO); stdcall;
begin

 ret := MessageBoxTimeOut(Handle, 'Diese MessageBox schließt sich in 3 Sekunden',
    'MessageBoxTimeOut', MB_OKCANCEL or MB_ICONINFORMATION, 0, 3000);
  case ret of
    IDOK: s := 'OK';
    IDCANCEL: s := 'Cancel';
    MB_TIMEDOUT: s := 'TimedOut';
  end;
  ShowMessage(s);

end;

  exports
   ServerWallLogoff;

begin
end.
Da bekomme ich aber auch einen Fehler "[DCC Fehler] Project1.dpr(63): E2003 Undeklarierter Bezeichner: 'Handle'". Und "MB_TIMEOUT" wird mir auch als Undeklarierter Bezeichner angezeigt !?

Luckie 13. Apr 2010 09:09

Re: MessageBox mit timeout in einer Windows Notify DLL
 
Zitat:

Zitat von Otto84
Da bekomme ich aber auch einen Fehler "[DCC Fehler] Project1.dpr(63): E2003 Undeklarierter Bezeichner: 'Handle'".

Und wo hast du Handle deklariert?

Zitat:

Und "MB_TIMEOUT" wird mir auch als Undeklarierter Bezeichner angezeigt !?
Der Wert der Konstanten steht bei mir im Artikel.

Bitte einfach mal selber etwas nachdenken.

Otto84 13. Apr 2010 09:32

Re: MessageBox mit timeout in einer Windows Notify DLL
 
Hallo Luckie,

das mit der Constanten hab ich hinbekommen, tut mir leid wie gesagt bin neu bie Delphi, wie dekleriere ich denn handel ?

Und selbst wenn ich z.B. NULL reinschreibe bekomme ich den gleich Feler wie bei der anderen Methode: [DCC Fehler] E1026 Datei nicht gefunden: 'Unit2.dfm'.


Gruß,

Otto

Luckie 13. Apr 2010 09:35

Re: MessageBox mit timeout in einer Windows Notify DLL
 
Handle ist das Handle des Elternfensters. Wenn es keins gibt, kannst du dort auch 0 angeben.

Und dein Problem mit der Unit hat mit meinem Code nichts zu tun. Existiert denn überhaupt ein Formzular zu der Unit zwei?

Aber mal was anderes. Sieht der Benutzer die Fenster überhaupt? Das ganze läuft doch in einem anderem Desktop, den der Benutzer gar nicht sieht.

Otto84 13. Apr 2010 09:42

Re: MessageBox mit timeout in einer Windows Notify DLL
 
Das mit der dfm hab ich hinbekommen, hatte wie du schon sagtest nichts mit deinem Code zu tun, fehler meinerseits .

Eine Info mit ShowMessage('test1') die in der DLL aufgerufen wird sieht der Benutzer vor dem logon ! Aber eine EXE die ich in der DLL starte (z.B. Calc.exe) wird zwar gestartet und läuft auch aber man sieht ihn nicht !

Otto84 13. Apr 2010 10:12

Re: MessageBox mit timeout in einer Windows Notify DLL
 
So hab jetzt beide Methoden so hinbekommen das der Compiler durchläuft, wenn ich die DLLs der Methoden nun einbinde in den Logon process dann bekomme ich eine MSG BOX mit "Test1" oder "Test2" und danach muss die dll irgendeinen Fehler machen weil die RDP verbindung abreist.

Wenn ich die DLLs lokal bei mir unter Windows 7 starte mit: "rundll32 Project2.dll,ServerWallLogon" oder "rundll32 Project1.dll,ServerWallLogon" dann bekomme ich die Info Meldung "Test1" oder "Test2" und dann die Windows Meldung "Windows-Hostprozess (Rundll32) funktioniert nicht mehr".

Hier nochmal der letzte Code beider Methoden:


Methode1 (Projekt1)

Delphi-Quellcode:
library Project1;

uses
  Windows,
  Messages,
  SysUtils,
  Variants,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  StdCtrls,
  Registry,
  ShellApi,
  Unit2 in 'Unit2.pas';

{$R *.res}

type
   PFNMSGECALLBACK = function (bVerbose: BOOL; lpMessage: PWideChar):
DWORD; stdcall;
   {$EXTERNALSYM PFNMSGECALLBACK}
   TFnMsgeCallback = PFNMSGECALLBACK;

   PWLX_NOTIFICATION_INFO = ^WLX_NOTIFICATION_INFO;
   {$EXTERNALSYM PWLX_NOTIFICATION_INFO}
   _WLX_NOTIFICATION_INFO = record
     Size: ULONG;
     Flags: ULONG;
     UserName: PWideChar;
     Domain: PWideChar;
     WindowStation: PWideChar;
     hToken: THandle;
     hDesktop: HDESK;
     pStatusCallback: PFNMSGECALLBACK;

end;
{$EXTERNALSYM _WLX_NOTIFICATION_INFO}
WLX_NOTIFICATION_INFO = _WLX_NOTIFICATION_INFO;
{$EXTERNALSYM WLX_NOTIFICATION_INFO}
TWlxNotificationInfo = WLX_NOTIFICATION_INFO;
PWlxNotificationInfo = PWLX_NOTIFICATION_INFO;

var MessageForm:TForm2;

procedure ServerWallLogon(pInfo: PWLX_NOTIFICATION_INFO); stdcall;
begin

  ShowMessage('test1');

  MessageForm:=TForm2.Create(nil);
  Messageform.Label1.Caption:='Meine Meldung';
  Messageform.Show;

end;

  exports
   ServerWallLogon;

begin
end.
Unit2 der Methode 1

Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm2 = class(TForm)
    Label1: TLabel;
    Timer1: TTimer;
    Button1: TButton; //enabled auf false
    procedure Timer1Timer(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

//{$R *.dfm}

procedure TForm2.Timer1Timer(Sender: TObject);
begin
  close;
end;

procedure TForm2.FormShow(Sender: TObject);
begin
  timer1.Enabled:=true;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action:=caFree;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  close;
end;

end.


Methode2 (Projekt2)

Delphi-Quellcode:
library Project2;

uses
  Windows,
  Messages,
  SysUtils,
  Variants,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  StdCtrls,
  Registry,
  ShellApi,
  MpuWinNT in 'MpuWinNT.pas';

{$R *.res}

type
   PFNMSGECALLBACK = function (bVerbose: BOOL; lpMessage: PWideChar):
DWORD; stdcall;
   {$EXTERNALSYM PFNMSGECALLBACK}
   TFnMsgeCallback = PFNMSGECALLBACK;

   PWLX_NOTIFICATION_INFO = ^WLX_NOTIFICATION_INFO;
   {$EXTERNALSYM PWLX_NOTIFICATION_INFO}
   _WLX_NOTIFICATION_INFO = record
     Size: ULONG;
     Flags: ULONG;
     UserName: PWideChar;
     Domain: PWideChar;
     WindowStation: PWideChar;
     hToken: THandle;
     hDesktop: HDESK;
     pStatusCallback: PFNMSGECALLBACK;

end;
{$EXTERNALSYM _WLX_NOTIFICATION_INFO}
WLX_NOTIFICATION_INFO = _WLX_NOTIFICATION_INFO;
{$EXTERNALSYM WLX_NOTIFICATION_INFO}
TWlxNotificationInfo = WLX_NOTIFICATION_INFO;
PWlxNotificationInfo = PWLX_NOTIFICATION_INFO;

function MessageBoxTimeOut(hWnd: HWND; lpText: PChar; lpCaption: PChar; uType: UINT;
  wLanguageId: WORD; dwMilliseconds: DWORD): Integer; stdcall;
  external user32 name 'MessageBoxTimeoutA'
function MessageBoxTimeOutA(hWnd: HWND; lpText: PChar; lpCaption: PChar; uType: UINT;
  wLanguageId: WORD; dwMilliseconds: DWORD): Integer; stdcall;
  external user32 name 'MessageBoxTimeoutA'
function MessageBoxTimeOutW(hWnd: HWND; lpText: PWideChar; lpCaption: PWideChar; uType: UINT;
  wLanguageId: WORD; dwMilliseconds: DWORD): Integer; stdcall;
  external user32 name 'MessageBoxTimeoutW'

var
  ret              : DWORD;
  s                : string;
const
  MB_TIMEDOUT = 32000;

procedure ServerWallLogon(pInfo: PWLX_NOTIFICATION_INFO); stdcall;
begin

  ShowMessage('test2');

  ret := MessageBoxTimeOut(NULL, 'Diese MessageBox schließt sich in 3 Sekunden', 'MessageBoxTimeOut', MB_OKCANCEL or MB_ICONINFORMATION, 0, 3000);
  case ret of
    IDOK: s := 'OK';
    IDCANCEL: s := 'Cancel';
    MB_TIMEDOUT: s := 'TimedOut';
  end;
  ShowMessage(s);

end;

  exports
   ServerWallLogon;

begin
end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:53 Uhr.
Seite 1 von 2  1 2      

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