Закрепление окна [VB.NET]

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Qb1024, 3 May 2011.

  1. Qb1024

    Qb1024 New Member

    Joined:
    15 Jul 2009
    Messages:
    323
    Likes Received:
    4
    Reputations:
    0
    Некоторые окна могут закрепляться сверху/снизу экрана, при этом они не перекрывают другие окна, а как бы пододвигают их (winamp, JetAudio).
    Как реализовать что то подобное с формой программы и закрепить её слева экрана?
     
  2. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    пишу на шарпе, но на вб не трудно будет перевести. здесь переднее окно получает размер 300х300 при старте программы. для твого случая нужно будет вычесть из размера экрана размер твоей формы.

    Code:
        public partial class Form1 : Form
        {
            [DllImport("user32.dll")]
            static extern IntPtr GetForegroundWindow();
    
            [System.Runtime.InteropServices.DllImport("User32.dll")]
            static extern Boolean SetWindowPos(
                IntPtr hWnd,             
                Int32 hWndInsertAfter,  
                Int32 X,                
                Int32 Y,                
                Int32 cx,               
                Int32 cy,               
                UInt32 uFlags);   
    
            enum WinPosition
            {
                HWND_TOP = 0,
                HWND_BOTTOM = 1,
                HWND_TOPMOST = -1,
                HWND_NOTOPMOST = -2
            }
    
            enum WinFlags
            {
                SWP_NOSIZE = 0x1,            
                SWP_NOMOVE = 0x2,            
                SWP_NOZORDER = 0x4,         
                SWP_NOREDRAW = 0x8,
                SWP_NOACTIVATE = 0x10,
                SWP_SHOWWINDOW = 0x40,       
                SWP_HIDEWINDOW = 0x80,       
                SWP_NOSENDCHANGING = 0x400
            }
    
            public Form1()
            {
            
                InitializeComponent();
                SetWindowPos(GetForegroundWindow(), (Int32)WinPosition.HWND_TOP, 0, 0, 300, 300,
                         (Int32)WinFlags.SWP_SHOWWINDOW | (Int32)WinFlags.SWP_NOMOVE);
            }
        }
    
     
  3. Qb1024

    Qb1024 New Member

    Joined:
    15 Jul 2009
    Messages:
    323
    Likes Received:
    4
    Reputations:
    0
    Немного не понял данного примера, этот код меняет размеры окна только самой программы и всё, но не пододвигает лежащих за ним и вообще никак на них не влияет.
    Причём параметры x и y вообще игнорируются...
     
  4. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    данный пример только основа для дальнейших размышлений. х,у действительно игнорятся, но размер поверх стоящего окна изменяется. x,у не заметил, т.к. окно находилось в углу. посмотрю в чём проблема.

    если твоя программа находится поверх всех , то она и уменьшается. я сделал как в icq. при старте верхнее окно меняет размер. другие, позади стоящие окна не стоит уменьшать, их не видно.

    скомпиль мой код, открой папку с екзешником и стартони его, и увидишь, как окно папки уменьшается.

    если хочешь изменять и другие окна, используй другие функции api. типа EnumDesktopWindows.
     
    #4 BrainDeaD, 4 May 2011
    Last edited: 4 May 2011
  5. Qb1024

    Qb1024 New Member

    Joined:
    15 Jul 2009
    Messages:
    323
    Likes Received:
    4
    Reputations:
    0
    Код рабочий, конвертнул в бейсик, дописал и получил результат.
    Но я хотел получить нечто подобное:
    http://upyourpic.org/images/201104/cgejdopadm.jpg.html
    На скрине видно, что хотя окно оперы полностью развёрнуто, винамп всё равное виден, он не перекрывает окон, а как бы сдвигает границу всех окон чуть-чуть вниз. Также сдвигаются иконки на рабочем столе.
    Тут наверное нужно менять размеры рабочей области explorer.
    С помощью чего можно этого добиться?
     
  6. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    всё, разобрался с позицией окна. просто забыл убрать флаг (Int32)WinFlags.SWP_NOMOVE. удали это из кода и позицию можно будет устанавливать.

    чувак, я не буду писать за тебя код, я дал достаточно информации. я прекрасно понял, что тебе нужно и дал подходящий пример.

    ещё раз алгоритм:
    при старте программы или по таймеру или по кнопке (как тебе угодно) узнаёшь размеры экрана, затем используя мой пример, устанавливаешь для актуально верхнего окна размер, который равен размеру экрана минус размер твоей проги. позиция будет 0, высота твоей проги..
     
    #6 BrainDeaD, 4 May 2011
    Last edited: 4 May 2011
  7. Qb1024

    Qb1024 New Member

    Joined:
    15 Jul 2009
    Messages:
    323
    Likes Received:
    4
    Reputations:
    0
    Ога, кажется понял, нужно только настроить, чтобы она сама себе размеры не меняла и проверяла, развёрнуто ли уже окно или нет, а то разворачиваются все окна на весь экран. Не развёрнутые надо смещать.


    Тогда такой вопрос: чем получить идентификатор текущего окна приложения, чтобы дальше игнорировать его? Не FindWindow же использовать...
     
    #7 Qb1024, 5 May 2011
    Last edited: 5 May 2011
  8. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    this.Handle

    у меня прога уже готова.
    [​IMG]

    но я тебе не дам, тебе же на благо. так ты учишься. на вопросы отвечу с удовольствием.
     
    #8 BrainDeaD, 5 May 2011
    Last edited: 5 May 2011
  9. Qb1024

    Qb1024 New Member

    Joined:
    15 Jul 2009
    Messages:
    323
    Likes Received:
    4
    Reputations:
    0
    А как узнать размеры и координаты окна, а так же развёрнуто ли оно?
     
  10. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    твоего окна? издеваешься?! ты бы гугл и мсдн открыл хоть на минутку. это минимальные основы. учись - не ленись. это всё равно, что продиктовать тебе код. я сказал, код за тебя писать не буду.
     
    #10 BrainDeaD, 5 May 2011
    Last edited: 5 May 2011
  11. Qb1024

    Qb1024 New Member

    Joined:
    15 Jul 2009
    Messages:
    323
    Likes Received:
    4
    Reputations:
    0
  12. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    а почитать, то что открыл?
    или ты думаешь все это наизусть знают? я тоже не знаю. Мы так же читаем доки.

    зачем тебе winapi чтобы узнать параметры твоего окна? у себя в окне можно получить их просто через this.Size, this.Location. Если же это не для твоего окна, а для другого активного, то не понимаю зачем тебе эта информация. ведь тебе нужно только установить размер в соотношении с окном твоей программы. то есть SystemInformation.WorkingArea или Screen.PrimaryScreen.WorkingArea минус размер твоего окна.