Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Message-Only-Window erzeugen - CreateWindow - Windowproc?! (https://www.delphipraxis.net/74699-message-only-window-erzeugen-createwindow-windowproc.html)

DGL-luke 7. Aug 2006 19:57


Message-Only-Window erzeugen - CreateWindow - Windowproc?!
 
Hallo,

ich täte gerne ein Message-Only-Window erzeugen, weil ich innerhalb einer Klasseninstanz mit der Aussenwelt kommunizieren will.

Delphi-Quellcode:
FMessageWindowHandle := CreateWindow('','',0,0,0,0,0,HWND_MESSAGE,0,0,nil);
Soo.... und woher weiss das fenster jetzt, wo seine Windowproc liegt, nur für den unwahrscheinlichen Fall, dass es tatsächlich Nachrichten bekommt?

EDIT: ich hab mir jetzt gedacht, machs dir einfach:

Delphi-Quellcode:
Wnd := TWinControl.CreateParented(HWND_MESSAGE);
Wnd.WindowProc := wndWindowProc;
gibts da irgendwas zu beachten?

DGL-luke 10. Aug 2006 16:12

Re: Message-Only-Window erzeugen - CreateWindow - Windowproc
 
*push*

Hallo,

da ich in einem Projektstadium bin, in dem ich das noch nicht detailliert austesten kann, hätt ich da gern ein statement von jemandem, der sich auskennt. :)

marabu 10. Aug 2006 16:56

Re: Message-Only-Window erzeugen - CreateWindow - Windowproc
 
Hallo Lukas,

Zitat:

Zitat von DGL-luke
... hätt ich da gern ein statement von jemandem, der sich auskennt.

eigentlich dürfte ich jetzt nicht antworten.

Vielleicht hast du momentan eine etwas schiefe Sicht auf die Dinge: du machst aus einem Fenster ein message-only window, indem du ihm das passende parent window zuordnest.

Grüße vom marabu

DGL-luke 10. Aug 2006 18:11

Re: Message-Only-Window erzeugen - CreateWindow - Windowproc
 
Jaa... HWND_MESSAGE. oder?

Die "erste" Frage ist ja eher ein grundsätzliches problem, ich habe keine ahnung, wie ich dem fenster eine windowproc verpasse. Mit SetWindowLog(Handle, GWL_WNDPROC, @WndProc) kanns ja nicht gehen, nach der erzeugung wird ja gleich WM_CREATE gesendet, und da muss ich auch sofort drauf reagieren können.

PS: Deine Kenntnisse reichen mir voll und ganz. Immer diese Tiefstaplerei hier... :roll:

Luckie 2. Jun 2007 01:13

Re: Message-Only-Window erzeugen - CreateWindow - Windowproc
 
Du musst die Struktur für die Fensterklasse füllen und registrieren:
Delphi-Quellcode:
var
  wc               : TWndClassEx = (
    cbSize: SizeOf(TWndClassEx);
    Style: CS_HREDRAW or CS_VREDRAW;
    lpfnWndProc: @WndProc;
    cbClsExtra: 0;
    cbWndExtra: 0;
    hbrBackground: COLOR_BTNFACE + 1;
    lpszMenuName: nil;
    lpszClassName: ClassName;
    hIconSm: 0;
    );
  msg              : TMsg;
begin
  InitCommonControls;

  wc.hInstance := hInstance;
  wc.hIcon := LoadIcon(0, IDI_APPLICATION);
  wc.hCursor := LoadCursor(0, IDC_ARROW);

  RegisterClassEx(wc);
  hApp := CreateWindowEx(0, CLASSNAME, APPNAME, WS_OVERLAPPEDWINDOW or WS_VISIBLE or WS_SYSMENU or WS_MINIMIZEBOX or
    WS_MAXIMIZEBOX or WS_SIZEBOX, Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), WINDOWWIDTH, WINDOWHEIGHT, 0, 0,
    hInstance, nil);
Das Feld lpfnWndProc verweist auf die Fensterprozedur.

himitsu 2. Jun 2007 06:36

Re: Message-Only-Window erzeugen - CreateWindow - Windowproc
 
Oder man nimmt den dafür vorgesehenen Klassen-Typen. :angel:

Seit Windows 2000 gibt es den Typ "Message" und davor sollte man laut MS einfach ein "STATIC" hierfür mißbrauchen.

Hier mal 'nen Auszug daraus, wie ich ein derartiges Fenster erzeuge:
Delphi-Quellcode:
Procedure InstallGlobalMessageWindow;
  Var PID: THandle;
    PIDS: packed Array[1..16] of AnsiChar;
    VI: TOSVersionInfoA;
    WindowType: Array[1..8] of AnsiChar;

  Begin
    VI.OSVersionInfoSize := SizeOf(TOSVersionInfoA);
    If GetVersionExA(VI) and (VI.MajorVersion >= 5) Then
      WindowType := 'Message'#0 Else WindowType := 'STATIC'#0#0;
    PID := GetCurrentProcessID;
    PIDS := 'UCC_GMW????????'#0;
    IntToHexChars(PAnsiChar(@PIDS) + 7, LongInt(PID));
    GlobalUCCMessageWindow := FindWindowA(@WindowType, @PIDS);
    If GlobalUCCMessageWindow = 0 Then Begin
      GlobalUCCMessageWindow := CreateWindowExA(0, @WindowType, @PIDS, WS_POPUP, 0, 0, 0, 0, 0, 0, PID, nil);
      If GlobalUCCMessageWindow = 0 Then BasicError(@SGlobalUCCMessageWindowCanNotCreate);
    End;
  End;
Mit festem Namen und/oder ohne Prüfung ob es schon existeirt, würde es dann wohl so aussehn:
Delphi-Quellcode:
Procedure InstallGlobalMessageWindow;
  Var VI: TOSVersionInfoA;
    WindowType: String;

  Begin
    VI.OSVersionInfoSize := SizeOf(TOSVersionInfoA);
    If GetVersionExA(VI) and (VI.MajorVersion >= 5) Then
      WindowType := 'Message' Else WindowType := 'STATIC';
    GlobalUCCMessageWindow := FindWindowA(PChar(WindowType), 'myMessageWindow');
    If GlobalUCCMessageWindow = 0 Then Begin
      GlobalUCCMessageWindow := CreateWindowExA(0, PChar(WindowType), 'myMessageWindow',
        WS_POPUP, 0, 0, 0, 0, 0, 0, GetCurrentProcessID, nil);
      If GlobalUCCMessageWindow = 0 Then BasicError(@SGlobalUCCMessageWindowCanNotCreate);
    End;
  End;

Procedure InstallGlobalMessageWindow;
  Var VI: TOSVersionInfoA;
    WindowType: String;

  Begin
    VI.OSVersionInfoSize := SizeOf(TOSVersionInfoA);
    If GetVersionExA(VI) and (VI.MajorVersion >= 5) Then
      WindowType := 'Message' Else WindowType := 'STATIC';
    GlobalUCCMessageWindow := CreateWindowExA(0, PChar(WindowType), 'myMessageWindow',
      WS_POPUP, 0, 0, 0, 0, 0, 0, GetCurrentProcessID, nil);
    If GlobalUCCMessageWindow = 0 Then BasicError(@SGlobalUCCMessageWindowCanNotCreate);
  End;
Genaueres konnte man irgenwo unter Hier im Forum suchenCreateWindowEx nachlesen, von wo ich es (glaub ich jedenfalls) auch mal her hatte.

Apollonius 2. Jun 2007 09:50

Re: Message-Only-Window erzeugen - CreateWindow - Windowproc
 
Zitat:

ich täte gerne ein Message-Only-Window erzeugen
Ist allocateHWND denn nicht genau das gesuchte (klar, als Parameter gibts ein TMessage, aber das ist ja nicht wichtig)?


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:29 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