AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi MessageBox mit timeout in einer Windows Notify DLL
Thema durchsuchen
Ansicht
Themen-Optionen

MessageBox mit timeout in einer Windows Notify DLL

Offene Frage von "Otto84"
Ein Thema von Otto84 · begonnen am 13. Apr 2010 · letzter Beitrag vom 13. Apr 2010
Antwort Antwort
Seite 1 von 2  1 2      
Otto84

Registriert seit: 13. Apr 2010
7 Beiträge
 
#1

MessageBox mit timeout in einer Windows Notify DLL

  Alt 13. Apr 2010, 07:12
Hallo zusammen,

ich hoffe ihr könnt mir weiterhelfen ,

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
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: MessageBox mit timeout in einer Windows Notify DLL

  Alt 13. Apr 2010, 08:12
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;
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
ATSV

Registriert seit: 8. Aug 2008
95 Beiträge
 
Delphi 7 Professional
 
#3

Re: MessageBox mit timeout in einer Windows Notify DLL

  Alt 13. Apr 2010, 08:16
Evtl. hilft dir das hier weiter
  Mit Zitat antworten Zitat
Otto84

Registriert seit: 13. Apr 2010
7 Beiträge
 
#4

Re: MessageBox mit timeout in einer Windows Notify DLL

  Alt 13. Apr 2010, 08:56
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.
  Mit Zitat antworten Zitat
Otto84

Registriert seit: 13. Apr 2010
7 Beiträge
 
#5

Re: MessageBox mit timeout in einer Windows Notify DLL

  Alt 13. Apr 2010, 09:04
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 !?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: MessageBox mit timeout in einer Windows Notify DLL

  Alt 13. Apr 2010, 09:09
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Otto84

Registriert seit: 13. Apr 2010
7 Beiträge
 
#7

Re: MessageBox mit timeout in einer Windows Notify DLL

  Alt 13. Apr 2010, 09:32
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: MessageBox mit timeout in einer Windows Notify DLL

  Alt 13. Apr 2010, 09:35
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Otto84

Registriert seit: 13. Apr 2010
7 Beiträge
 
#9

Re: MessageBox mit timeout in einer Windows Notify DLL

  Alt 13. Apr 2010, 09:42
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 !
  Mit Zitat antworten Zitat
Otto84

Registriert seit: 13. Apr 2010
7 Beiträge
 
#10

Re: MessageBox mit timeout in einer Windows Notify DLL

  Alt 13. Apr 2010, 10:12
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.
  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 08:32 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