From 6064bfec538038fd1e1ccf4da54fa859241f98fa Mon Sep 17 00:00:00 2001 From: Pavel Perminov Date: Wed, 26 Sep 2012 19:14:19 +0000 Subject: Current line of development release (344 rev. truncated adjusted copy) git-svn-id: http://svn.miranda-ng.org/main/trunk@1669 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/Chess4Net/NonMainFormStayOnTopUnit.pas | 74 ++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 plugins/Chess4Net/NonMainFormStayOnTopUnit.pas (limited to 'plugins/Chess4Net/NonMainFormStayOnTopUnit.pas') diff --git a/plugins/Chess4Net/NonMainFormStayOnTopUnit.pas b/plugins/Chess4Net/NonMainFormStayOnTopUnit.pas new file mode 100644 index 0000000000..47ded58c89 --- /dev/null +++ b/plugins/Chess4Net/NonMainFormStayOnTopUnit.pas @@ -0,0 +1,74 @@ +//////////////////////////////////////////////////////////////////////////////// +// All code below is exclusively owned by author of Chess4Net - Pavel Perminov +// (packpaul@mail.ru, packpaul1@gmail.com). +// Any changes, modifications, borrowing and adaptation are a subject for +// explicit permition from the owner. + +unit NonMainFormStayOnTopUnit; + +// Inclusion of this unit enables all non-main forms with FormStyle = fsStayOnTop +// to stay on top even if application is deactivated + +interface + +implementation + +uses + Forms, SysUtils, Classes, Messages, Windows; + +type + TApplicationObjSubclasser = class + private + m_NewObj, m_OldObj: pointer; + procedure FWndProc(var Message: TMessage); + public + constructor Create; + destructor Destroy; override; + end; + +var + g_ApplicationObjSubclasserInstance: TApplicationObjSubclasser = nil; + +//////////////////////////////////////////////////////////////////////////////// +// TApplicationObjSubclasser + +constructor TApplicationObjSubclasser.Create; +begin + inherited Create; + + m_NewObj := Classes.MakeObjectInstance(FWndProc); + m_OldObj := Pointer (SetWindowLong(Application.Handle, GWL_WNDPROC, + Cardinal(m_NewObj))); +end; + + +destructor TApplicationObjSubclasser.Destroy; +begin + SetWindowLong(Application.Handle, GWL_WNDPROC, Cardinal(m_OldObj)); + Classes.FreeObjectInstance(m_NewObj); + + inherited; +end; + + +procedure TApplicationObjSubclasser.FWndProc(var Message: TMessage); +begin + Message.Result := CallWindowProc (m_OldObj, Application.Handle, + Message.Msg, Message.wParam, Message.lParam); + + case Message.Msg of + WM_ACTIVATEAPP: + begin + if (not TWMActivateApp(Message).Active) then + Application.RestoreTopMosts; + end; + end; +end; + +initialization + g_ApplicationObjSubclasserInstance := TApplicationObjSubclasser.Create; + +finalization + FreeAndNil(g_ApplicationObjSubclasserInstance); + +end. \ No newline at end of file -- cgit v1.2.3