![]() |
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 |
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:
Aufruf:
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.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var MessageForm:TForm2; begin MessageForm:=TForm2.Create(nil); Messageform.Label1.Caption:='Meine Meldung'; Messageform.Show; end; |
Re: MessageBox mit timeout in einer Windows Notify DLL
Evtl. hilft dir
![]() |
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:
Zum Projekt hinzugefühgt hab ich Unit2:
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.
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. |
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:
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 !?
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. |
Re: MessageBox mit timeout in einer Windows Notify DLL
Zitat:
Zitat:
Bitte einfach mal selber etwas nachdenken. |
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 |
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. |
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 ! |
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:
Unit2 der Methode 1
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.
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 20:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz