Praca na wielu ekranach

0

Witam,

przeszukałem sporo materiałów w sieci na temat działania aplikacji na wielu monitorach, ale nie znalazłem tam rozwiązania na mój problem.

Mam okno główne programu, które uruchamia się na monitorze, który wcześniej wybraliśmy z Combobox z ustawień programu (załadowałem tam listę dostępnych monitorów).

procedure TfrmSettings.GetMonitors;
var
  i: integer;
  Item: TJvImageItem;
begin
  set_main_DefaultStartAppMonitor.Items.Clear;
  for I := 0 to Screen.MonitorCount -1 do
  begin
    Item := set_main_DefaultStartAppMonitor.Items.Add;
    Item.ImageIndex := 0;
    Item.Text := GetMonitorName(i);
    //Item.Text := 'Ekran ' + IntToStr(i + 1);
  end;
end;

function GetMonitorName(MonitorIndex: integer) : string;
var
  MonitorInfo: TMonitorInfoEx;
begin
  MonitorInfo.cbSize := SizeOf(MonitorInfo);
  if not GetMonitorInfo(Screen.Monitors[MonitorIndex].Handle, @MonitorInfo) then
    RaiseLastOSError
  else
    Result := MonitorInfo.szDevice;
end;

Załóżmy, że pracuję na 2 ekranach:

1 Ekran
Program główny (Full screen)

2 Ekran
Inne otwarte aplikacje

Mam założonego globalnego hooka na myszkę i chcę obsłużyć taką oto funkcję:

function MouseHookProc(Code : integer; WParam : WPARAM; LParam : LPARAM) : LRESULT; stdcall;
var
  HookStruct : PMOUSEHOOKSTRUCT;
  Monitor: TMonitor;
begin
  HookStruct := Pointer(LParam);
  case Code of
    HC_ACTION :
      begin
        pt := HookStruct.Pt; // współrzędne kursora
        Monitor := Screen.MonitorFromPoint(pt); // Zwraca index monitora nad którym znajduje się kursor


        {  GÓRNY PASEK NAWIGACJI NAGRYWANIA }
        { Jeżeli najedziemy na górną krawędź ekranu to wysuwa się okno nawigacyjne na całą szerokość ekranu }
        if (pt.Y <= 0) and not Assigned(frmRecordMenuNavigator) then
        begin
          Application.CreateForm(TfrmRecordMenuNavigator, frmRecordMenuNavigator);
          frmRecordMenuNavigator.Show;
        end
        else
          if Assigned(frmRecordMenuNavigator) then
          begin
            if (pt.Y > frmRecordMenuNavigator.Height) then
              frmRecordMenuNavigator.Close
            else
              exit; // Jeśli kursor w obszarze menu to nie nagrywamy akcji
          end;
...

Powyższy kod działa tylko z ekranem głównym.

Problemem jest to, że chciałbym, aby to okno nawigacyjne pokazywało się na górze ekranu, na którym aktualnie znajduje się kursor.
How to do it?

0

Może to Cię jakoś nakieruje:

form1.Left := monitor.Left;  
form1.Top := monitor.Top;
form1.Show;

regards.

dodanie znacznika <code class="delphi"> - furious programming

1 użytkowników online, w tym zalogowanych: 0, gości: 1