Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[BC++] Form Modal OnTop

Pagina: 1
Acties:
  • 177 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik wil een scherm altijd OnTop hebben.
Met de twee onderstaande methoden kan ik nog steeds met Alt-Tab naar een ander scherm, ook dat wil ik voorkomen, als dat tenminste mogelijk is.

1) frm->ShowModal();
2) SetWindowLong(frm->Handle, GWL_EXSTYLE, WS_EX_TOPMOST);

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik begrijp dat je een modal form wil dat modal is voor alle applicaties en niet alleen binnen je eigen app? Of begrijp ik het verkeerd? Je zult sowieso, althans, uit de blote bol, de topmost moeten combineren met modal; je SetWindowLong reset nu je windowstyle.

[ Voor 107% gewijzigd door RobIII op 04-01-2008 13:02 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
RobIII schreef op vrijdag 04 januari 2008 @ 12:57:
Ik begrijp dat je een modal form wil dat modal is voor alle applicaties en niet alleen binnen je eigen app? Of begrijp ik het verkeerd? Je zult sowieso, althans, uit de blote bol, de topmost moeten combineren met modal; je SetWindowLong reset nu je windowstyle.
Een modal die voor alle applicatie geld komt inderdaad, dat is de bedoeling.
Blijkt dat er met 'DS_SYSMODAL' ook iets gedaan kan worden, maar daar krijg ik het ook nog niet mee voor elkaar.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 16:33
Waarom denk je eigenlijk dat het ueberhaupt zou kunnen?

Ik heb het nog nooit gezien, en ik kan me goed voorstellen dat het expres niet mogelijk is; het is namelijk niet de bedoeling dat een enkel proces andere processen (die misschien wel met andere privileges draaien) user input kan onthouden.

Misschien dat je iets kunt hacken met een hook die je window weer focus geeft als een andere 'm krijgt, maar eigenlijk zou ik liever suggereren dat je de gebruiker de controle over de actieve applicaties laat houden.

Verwijderd

Probeer de parent van dat form is de desktop te maken,
Werkt voor delphi wel, dus zal voor BC++ ook moeten kunnen,
delphi code:
Delphi:
1
2
3
4
5
6
7
8
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do begin
    ExStyle := ExStyle or WS_EX_TOPMOST;
    WndParent := GetDesktopwindow;
  end;
end;

Getest en werkt hier, echter focus kan nog wel veranderd worden met alt-tab maar form blijft "ontop".

Code gejat van: http://delphi.about.com/od/formsdialogs/l/aa073101b.htm

[edit]
Ok, stukje extra code nodig:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure ForceForegroundWindow(hwnd: THandle);
  // (W) 2001 Daniel Rolf
  // http://www.finecode.de
  // rolf@finecode.de
var
  hlp: TForm;
begin
  hlp := TForm.Create(nil);
  try
    hlp.BorderStyle := bsNone;
    hlp.SetBounds(0, 0, 1, 1);
    hlp.FormStyle := fsStayOnTop;
    hlp.Show;
    mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
    mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
    SetForegroundWindow(hwnd);
  finally
    hlp.Free;
  end;
end;


Vervolgens moet je op een of andere manier, (in delphi door Application.OnDeActivate), deze routine aanroepen met de handle van je form.

[ Voor 49% gewijzigd door Verwijderd op 04-01-2008 13:49 ]


  • Icelus
  • Registratie: Januari 2004
  • Niet online

Developer Accused Of Unreadable Code Refuses To Comment


Verwijderd

Topicstarter
Verwijderd schreef op vrijdag 04 januari 2008 @ 13:19:
Probeer de parent van dat form is de desktop te maken,
Werkt voor delphi wel, dus zal voor BC++ ook moeten kunnen,
delphi code:
Delphi:
1
2
3
4
5
6
7
8
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do begin
    ExStyle := ExStyle or WS_EX_TOPMOST;
    WndParent := GetDesktopwindow;
  end;
end;

Getest en werkt hier, echter focus kan nog wel veranderd worden met alt-tab maar form blijft "ontop".

Code gejat van: http://delphi.about.com/od/formsdialogs/l/aa073101b.htm

[edit]
Ok, stukje extra code nodig:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure ForceForegroundWindow(hwnd: THandle);
  // (W) 2001 Daniel Rolf
  // http://www.finecode.de
  // rolf@finecode.de
var
  hlp: TForm;
begin
  hlp := TForm.Create(nil);
  try
    hlp.BorderStyle := bsNone;
    hlp.SetBounds(0, 0, 1, 1);
    hlp.FormStyle := fsStayOnTop;
    hlp.Show;
    mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
    mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
    SetForegroundWindow(hwnd);
  finally
    hlp.Free;
  end;
end;


Vervolgens moet je op een of andere manier, (in delphi door Application.OnDeActivate), deze routine aanroepen met de handle van je form.
Heel hartelijk dank, dit is het resultaat geworden. dat men een ander scherm nog kan aanklikken geeft op zicht niet, als deze popup maar zichtbaar blijft.

code:
1
2
3
4
5
6
7
8
9
10
11
12
  virtual void __fastcall CreateParams(TCreateParams& AParams)
  {
   TForm::CreateParams(AParams);
   AParams.Style = AParams.Style | WS_BORDER;
   AParams.ExStyle = AParams.ExStyle | WS_EX_PALETTEWINDOW | WS_EX_TOPMOST;
  }
  virtual void __fastcall CreateWnd()
  {
   TForm::CreateWnd();
   ::SetParent(Handle, GetDesktopWindow());
   SNDMSG(this->Handle, WM_SETFOCUS, 0, 0);
  }

Verwijderd

En anders kan je nog altijd de volgende functie aanroepen ;)
http://msdn2.microsoft.co...rary/ms646290(VS.85).aspx

(werkt goed, moest bij de 1e keer uitproberen hardware matig computer afsluiten) :)
Pagina: 1