![]() |
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:
Soo.... und woher weiss das fenster jetzt, wo seine Windowproc liegt, nur für den unwahrscheinlichen Fall, dass es tatsächlich Nachrichten bekommt?
FMessageWindowHandle := CreateWindow('','',0,0,0,0,0,HWND_MESSAGE,0,0,nil);
EDIT: ich hab mir jetzt gedacht, machs dir einfach:
Delphi-Quellcode:
gibts da irgendwas zu beachten?
Wnd := TWinControl.CreateParented(HWND_MESSAGE);
Wnd.WindowProc := wndWindowProc; |
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. :) |
Re: Message-Only-Window erzeugen - CreateWindow - Windowproc
Hallo Lukas,
Zitat:
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 |
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: |
Re: Message-Only-Window erzeugen - CreateWindow - Windowproc
Du musst die Struktur für die Fensterklasse füllen und registrieren:
Delphi-Quellcode:
Das Feld lpfnWndProc verweist auf die Fensterprozedur.
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); |
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:
Mit festem Namen und/oder ohne Prüfung ob es schon existeirt, würde es dann wohl so aussehn:
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;
Delphi-Quellcode:
Genaueres konnte man irgenwo unter
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; ![]() |
Re: Message-Only-Window erzeugen - CreateWindow - Windowproc
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:27 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-2025 by Thomas Breitkreuz