![]() |
Fremdes Fenster unverschiebbar (Wie erhalte ich die Events?)
Hallo Leute,
Ich hatte noch nicht allzuviel damit zu tun und bisher nichts brauchbares gefunden. Angenommen ich starte notepad mit CreateProcess und habe dann den Fensterhandle. Ich kann diesen dann mit SetWindowPos, MoveWindow und Co wunderbar verschieben usw. Ich sollt aber nun das Fenster fixieren. Kann ich mich irgendwie auf die Move Events registrieren? Oder gibt es da einen anderen Ansatz? All diese:
Delphi-Quellcode:
beziehen sich doch nur auf meine eigene Applikation?
procedure WMWindowPosChanging(var msg: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING;
procedure WMEnterSizeMove(var Message: TMessage) ; message WM_ENTERSIZEMOVE; procedure WMMove(var Message: TMessage) ; message WM_MOVE; procedure WMExitSizeMove(var Message: TMessage) ; message WM_EXITSIZEMOVE; Danke |
AW: Fremdes Fenster unverschiebbar (Wie erhalte ich die Events?)
Du könntest mit
Delphi-Quellcode:
das Notepad Fenster in deine eigene Anwendung einbetten.
SetParent(NotepadWindowHandle, self.Handle)
|
AW: Fremdes Fenster unverschiebbar (Wie erhalte ich die Events?)
Hallo shmia,
Das bringt eigenartige Effekte wenn aus der externen App dann ein weiteres Fenster geöffnet wird. Es geht konkret um eine Quick And Dirty "Implementierung" eines Mail Clients (Windows Live) in ein Leitsystem welches via Touchscreen bedient wird. Der Mailclient wird über das Programm gelegt exl. Navigation des darunterliegenden Programmes. |
AW: Fremdes Fenster unverschiebbar (Wie erhalte ich die Events?)
![]() Im Zweifel ließe sich mit einem regelmäßigen ![]() |
AW: Fremdes Fenster unverschiebbar (Wie erhalte ich die Events?)
Zitat:
![]() |
AW: Fremdes Fenster unverschiebbar (Wie erhalte ich die Events?)
Die ist jedoch nicht Prozessweit, und müsste für jedes neue Editorfenster neu gemacht werden. Daher hab ich die mal unerwähnt gelassen :)
Es gäbe sonst auch noch ![]() Und wenn man aus dem Editor ein LayeredWindow machte, ginge sogar noch ![]() |
AW: Fremdes Fenster unverschiebbar (Wie erhalte ich die Events?)
Hallo,
ChangeWindowMessageFilterEx wär genau was ich bräuchte. Leider bin ich aber auf XP. |
AW: Fremdes Fenster unverschiebbar (Wie erhalte ich die Events?)
Zitat:
|
AW: Fremdes Fenster unverschiebbar (Wie erhalte ich die Events?)
Laut Doku leider auch erst ab Vista, wenn ich nicht irre. Ansonsten bliebe ggf. noch das Unterschieben einer eigenen WndProc, was ich aber mangels Praxis nicht genauer beschreiben kann. Ich bin mir aber fast sicher, dass sich dazu auch in der DP etwas finden lassen sollte, gehen sollte es an sich ja.
|
AW: Fremdes Fenster unverschiebbar (Wie erhalte ich die Events?)
Zitat:
Zitat:
Und in dem Bereich fehlt auch mir die Praxis. Natürlich könnte ich mit einem Timer die Pos abfragen und dann bei <> wieder setzen. Aber da sträuben sich mir die Haare.. |
AW: Fremdes Fenster unverschiebbar (Wie erhalte ich die Events?)
Ja Ein Hook auf die WndProc sollte dich da ein wenig weiter bringen. Hab mal ebend gesucht, aber nirgends was vernünftiges in Delphi gefunden!
![]() Dann gibs zu Hooks allgemein noch das: ![]() Vllt reicht dir das schon um weiter zu kommen. Zitat:
|
AW: Fremdes Fenster unverschiebbar (Wie erhalte ich die Events?)
Das mit dem globalen Hook (WH_CALLWNDPROC) würde mich ja mal brennend interessieren, allerdings werden nur die Nachrichten vom aufrufenden Programm abgefangen, alle Nachrichten an fremde Fenster kommen nicht an.
Weiß jemand warum? :gruebel: Hook-DLL
Delphi-Quellcode:
GUI:
library HookCallWndProc;
uses Windows, Messages; {$R *.res} type TMyCallBack = procedure( nCode : Integer; WPARAM : WPARAM; LPARAM : LPARAM ); stdcall; var HookHandle : Cardinal = 0; FCallBack : TMyCallBack = nil; function CallWndProcHookProc( nCode : Integer; WPARAM : WPARAM; LPARAM : LPARAM ) : LRESULT; stdcall; begin Result := CallNextHookEx( HookHandle, nCode, WPARAM, LPARAM ); if nCode = HC_ACTION then if Assigned( FCallBack ) then FCallBack( nCode, WPARAM, LPARAM ); end; function InstallHook( aCallBack : TMyCallBack ) : Boolean; stdcall; begin Result := False; if HookHandle = 0 then begin HookHandle := SetWindowsHookEx( WH_CALLWNDPROC, @CallWndProcHookProc, HInstance, 0 ); FCallBack := aCallBack; Result := True; end; end; function UninstallHook : Boolean; stdcall; begin Result := UnhookWindowsHookEx( HookHandle ); FCallBack := nil; HookHandle := 0; end; exports InstallHook, UninstallHook; end.
Delphi-Quellcode:
unit Main.View;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class( TForm ) ListBox1 : TListBox; procedure FormDestroy( Sender : TObject ); procedure FormCreate( Sender : TObject ); private public end; var Form1 : TForm1; implementation type TMyCallBack = procedure( nCode : Integer; WPARAM : WPARAM; LPARAM : LPARAM ); stdcall; function InstallHook( CallBack : TMyCallBack ) : Boolean; stdcall; external 'HookCallWndProc.dll'; function UninstallHook( ) : Boolean; stdcall; external 'HookCallWndProc.dll'; {$R *.dfm} procedure HookCallWndProc( nCode : Integer; WPARAM : WPARAM; LPARAM : LPARAM ); stdcall; var cwps : TCWPStruct; szClass : array [0 .. 80] of Char; begin if nCode = HC_ACTION then begin CopyMemory( @cwps, Pointer( LPARAM ), SizeOf( CWPSTRUCT ) ); GetClassName( cwps.hwnd, szClass, Length( szClass ) - 1 ); case cwps.message of WM_WINDOWPOSCHANGING : begin Form1.ListBox1.ItemIndex := Form1.ListBox1.Items.Add( 'WINDOWSPOSCHANGING ' + szClass ); end; end; end; end; procedure TForm1.FormCreate( Sender : TObject ); begin InstallHook( HookCallWndProc ); end; procedure TForm1.FormDestroy( Sender : TObject ); begin UninstallHook; end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:48 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