Как отослать форму в фон и оставить ее там?

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

X-Cray
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 29.11.2006 (Ср) 11:19
Откуда: Москва!

Как отослать форму в фон и оставить ее там?

Сообщение X-Cray » 01.12.2006 (Пт) 19:58

Ситуация.

Программа состоит из нескольких форм.
Одну из них нужно:
  1. растянуть на полэкрана
  2. повесить на PictureBox картинку
  3. расположить по центру рабочего стола
  4. оставить ее под остальными формами, и не давать фокуса НИКОГДА


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

... а, подскажите пожалуйста, как сделать так, чтобы при щелчке по этой "форме" она не получала фокуса и не выплывала на самый верх? :roll: :oops:


P.S. форма не отображается на панели задач и не доступна из "Alt+TAB", т.е. нужно запретить фокус по щелчку мыши..
P.S.2 при срабатывании "защиты" Z-Index-ы остальных форм не должны меняться. Как было - так и осталось.
Заранее благодарен.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 01.12.2006 (Пт) 20:04

WS_EX_NOACTIVATE?
Изображение

X-Cray
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 29.11.2006 (Ср) 11:19
Откуда: Москва!

Сообщение X-Cray » 01.12.2006 (Пт) 20:09

Да! Спасибо.

На этот форум.. да морфологический поиск.. :)

http://bbs.vbstreets.ru/viewtopic.php?t ... 1aae1ca0c8

X-Cray
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 29.11.2006 (Ср) 11:19
Откуда: Москва!

Сообщение X-Cray » 01.12.2006 (Пт) 20:31

Рано радовался...

Код: Выделить всё

'В модуле
    Public Declare Function SetWindowLong Lib "user32" _
    Alias "SetWindowLongA" _
    (ByVal hwnd As IntPtr, _
    ByVal nIndex As Integer, _
    ByVal wNewWord As Long) As Long

    Public Declare Function CallWindowProc Lib "user32" _
    Alias "CallWindowProcA" _
    (ByVal lpPrevWndFunc As [Delegate], _
    ByVal hwnd As IntPtr, _
    ByVal msg As Integer, _
    ByVal wParam As Integer, _
    ByVal lParam As Long) As Integer

    Public Declare Function GetWindowLong Lib "user32" _
    Alias "GetWindowLongA" _
    (ByVal hwnd As IntPtr, _
    ByVal nIndex As Long) As Long

    Public Const WS_EX_NOACTIVATE As Long = &H8000000&
    Public Const GWL_EXSTYLE = (-20)


'В форме "background"
    Private Sub background_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        SetWindowLong(Me.Handle, GWL_EXSTYLE, GetWindowLong(Me.Handle, GWL_EXSTYLE) + WS_EX_NOACTIVATE)
    End Sub



Не работает-с.. что не так сделал?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.12.2006 (Пт) 21:07

Объявил со типом long, наверное.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

X-Cray
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 29.11.2006 (Ср) 11:19
Откуда: Москва!

Сообщение X-Cray » 01.12.2006 (Пт) 21:13

Нет. Все копилируется, приколы с IntPtr я знаю. Но форма все равно фокусируется при клике.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.12.2006 (Пт) 21:15

GSerg писал(а):Объявил со типом long, наверное.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 07.12.2006 (Чт) 12:21

а если при фокусе на форму, сразу передавать фокус куданить ещё?
например создать скрытую форму
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 07.12.2006 (Чт) 16:36

Код основной формы:
Код: Выделить всё
Imports System.Runtime.InteropServices

Public Class MainForm
    Dim BackgroundForm As New BackForm
    Public Const SWP_NOSIZE As Int32 = &H1
    Public Const SWP_NOMOVE As Int32 = &H2
    Public Const SWP_NOACTIVATE As Int32 = &H10
    Public Const SWP_SHOWWINDOW As Int32 = &H40

    <DllImport("user32.dll", CharSet:=CharSet.Auto, ExactSpelling:=True)> _
    Shared Function SetWindowPos( _
         ByVal hWnd As IntPtr, _
         ByVal hWndInsertAfter As Integer, _
         ByVal x As Integer, _
         ByVal y As Integer, _
         ByVal cx As Integer, _
         ByVal cy As Integer, _
         ByVal flags As Integer) As Boolean
    End Function

    Private Sub MainForm_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim Flags As SWPFlags
        Dim Rect As Rectangle = My.Computer.Screen.WorkingArea
        Dim Pnt As Point = New Point

        BackgroundForm.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedToolWindow
        BackgroundForm.ControlBox = False
        BackgroundForm.Text = ""
        BackgroundForm.ShowInTaskbar = False
        BackgroundForm.StartPosition = FormStartPosition.CenterScreen

        Flags = SWPFlags.SWP_NOMOVE _
             Or SWPFlags.SWP_NOACTIVATE _
             Or SWPFlags.SWP_NOSIZE _
             Or SWPFlags.SWP_SHOWWINDOW

        SetWindowPos(BackgroundForm.Handle, CType(Me.Handle, Integer), 0, 0, 0, 0, Flags)
    End Sub
End Class


Код формы которую ты хочешь сделать недоступной:
Код: Выделить всё
Public Class BackForm
    Private Const WM_MOUSEACTIVATE As Integer = &H21
    Private Const MA_NOACTIVATE = 3

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        If m.Msg = WM_MOUSEACTIVATE Then
            m.Result = New IntPtr(MA_NOACTIVATE)
            Return
        End If
        MyBase.WndProc(m)
    End Sub
End Class
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

X-Cray
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 29.11.2006 (Ср) 11:19
Откуда: Москва!

Сообщение X-Cray » 09.12.2006 (Сб) 19:52

Все оказалось еще проще

Нужно было всего лишь залепить формой рабочий стол ...

В модуль:

Код: Выделить всё

Public Declare Function GetDesktopWindow Lib "user32" () As Integer
Public Declare Function SetParent Lib "user32" (ByVal HwndChild As Integer, ByVal HwndNewParent As Integer) As Integer
Public Declare Ansi Function FindWindowExA Lib "user32" (ByVal hwndP As Integer, ByVal hwndCH As Integer, ByVal cl As String, ByVal text As String) As Integer


В форму

Код: Выделить всё

        Dim DisplayRect As Rectangle = Screen.GetBounds(Point.Empty)

        Me.Width = DisplayRect.Width
        Me.Height = DisplayRect.Height
        Me.Top = DisplayRect.Top
        Me.Left = DisplayRect.Left

  Dim hwnd As Integer = GetDesktopWindow
        Dim hwnd2 As Integer
        Dim hwnd1 As Integer = FindWindowExA(hwnd, 0, "Progman", "Program Manager")
        hwnd2 = FindWindowExA(hwnd1, 0, "SHELLDLL_DefView", vbNullString)
        SetParent(Me.Handle.ToInt32, hwnd2)
Последний раз редактировалось X-Cray 09.12.2006 (Сб) 20:01, всего редактировалось 2 раз(а).

X-Cray
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 29.11.2006 (Ср) 11:19
Откуда: Москва!

Сообщение X-Cray » 09.12.2006 (Сб) 19:54

P.S. не пишите больше нигде про intPtr... не надо.

Есть Me.Handle.ToInt32 давно в .NET

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 09.12.2006 (Сб) 22:32

А чем тебе IntPtr насолил ?
Тебе GSerg про него ничего не говорил, он говорил про то, что ты вместо Integer всадил Long при обьявлении функции.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

X-Cray
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 29.11.2006 (Ср) 11:19
Откуда: Москва!

Сообщение X-Cray » 09.12.2006 (Сб) 23:59

К GSerg-у никаких претензий, ни в коем случае.

Просто почему-то нигде не применяется ToInt, ведь с ним не нужно декларации переписывать.

Или я не прав и чего-то страшного не знаю? :oops:

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 10.12.2006 (Вс) 1:00

IntPtr наглядней. Но это уж как тебе больше нравится. А для деклараций я использую ApiViewer 2004, там обьявляется как IntPtr, так что ничего исправлять не надо.
То как ты решил проблему не приветствуется в .Net
Все это можно реализовать без применения API.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

X-Cray
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 29.11.2006 (Ср) 11:19
Откуда: Москва!

Сообщение X-Cray » 10.12.2006 (Вс) 10:08

А как лучше?
Я в .NET совсем недавно, подскажите плз.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 10.12.2006 (Вс) 12:49

Код: Выделить всё
Public Class Mainform
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        BackForm.Show()
    End Sub
End Class


Код: Выделить всё
Public Class BackForm
    Private Const WM_MOUSEACTIVATE As Integer = &H21
    Private Const MA_NOACTIVATE = 3

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        If m.Msg = WM_MOUSEACTIVATE Then
            m.Result = New IntPtr(MA_NOACTIVATE)
            Return
        End If
        MyBase.WndProc(m)
    End Sub

    Private Sub BackForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.SendToBack()
        Me.WindowState = FormWindowState.Maximized
    End Sub
End Class


как видишь ни одного обьявления API
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

X-Cray
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 29.11.2006 (Ср) 11:19
Откуда: Москва!

Сообщение X-Cray » 10.12.2006 (Вс) 13:04

Премного благодарен!

А то, что другие окна при перемещении над окном формы подтормаживают и оставляют шлейф перерисовки - это нормально?

Или можно избавиться и от этого?

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 10.12.2006 (Вс) 14:32

У меня такая фигня возникает когда открыта Студия.
Сверни ее и запусти релиз - должно быть все нормально.
Если нет - то скорее всего ты что то намудрил. Но это уже надо смотреть твой код.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

X-Cray
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 29.11.2006 (Ср) 11:19
Откуда: Москва!

Сообщение X-Cray » 10.12.2006 (Вс) 14:53

Без студии стало лучше. Еще раз спасибо!

*ушел курить мануалы :roll: *


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 58

    TopList