Бестелесное окно

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Neo_
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 31.03.2008 (Пн) 14:34

Бестелесное окно

Сообщение Neo_ » 31.03.2008 (Пн) 14:40

Подскажите, пожалуйста, возможно ли как-нибудь сделать так, чтоб при нажатии на форму, это нажатие воспринимало окно, находящееся под данным, т.е. окно... Как бы протыкалось насквозь! =) И как это реализовать на VB6 или VB.NET?

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 31.03.2008 (Пн) 15:15

Перечсислить все окна, найти все, в которых находится эта точка, после чего выбрать самое верхнее. Далее, необходимо через координаты верхнего угла найти относительные координаты. после чего перечисляем дочерние окна на предмет совпадения, если надо рекурсивно, и отправляем через SendMessage свой клик
Изображение

Neo_
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 31.03.2008 (Пн) 14:34

Сообщение Neo_ » 31.03.2008 (Пн) 21:40

Спасибо! =)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 31.03.2008 (Пн) 22:08

Во-первых, tag_warning.
Во-вторых, я помню, что есть стиль, установка которого окну придаёт ему подобное поведение. Как назло, забыл, что за стиль.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 31.03.2008 (Пн) 23:02

Хакер, а можешь это где-нибудь посмотреть? Я такого нигде не нахожу. В Appleman'е вроде множество стилей есть, но я такого не нашел..
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Atoman
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 109
Зарегистрирован: 01.02.2008 (Пт) 6:36

Сообщение Atoman » 31.03.2008 (Пн) 23:55

Поковырявшись немного в стилях вот что получилось.

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

Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetLayeredWindowAttributes Lib "user32.dll" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Private Const GWL_EXSTYLE As Long = -20
Private Const WS_EX_LAYERED As Long = &H80000
Private Const WS_EX_TRANSPARENT As Long = &H20&
Private Const LWA_ALPHA As Long = &H2
Private Const HWND_TOPMOST As Long = -1
Private Const SWP_NOMOVE As Long = &H2
Private Const SWP_NOSIZE As Long = &H1

Private Sub Form_Load()
Dim ExStyle As Long
    ExStyle = GetWindowLong(Me.hwnd, GWL_EXSTYLE) Or WS_EX_LAYERED Or WS_EX_TRANSPARENT
    Call SetWindowLong(Me.hwnd, GWL_EXSTYLE, ExStyle)
    Call SetLayeredWindowAttributes(Me.hwnd, 0, 120, LWA_ALPHA)
    Call SetWindowPos(Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
End Sub

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 31.03.2008 (Пн) 23:59

Ага. Оно самое.

Кстати, про него (WS_EX_TRANSPARENT) ещё в теме о часах писали.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Neo_
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 31.03.2008 (Пн) 14:34

Сообщение Neo_ » 01.04.2008 (Вт) 13:39

Спасибо, жалко, в .NET это не работает... :cry:

Atoman
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 109
Зарегистрирован: 01.02.2008 (Пт) 6:36

Сообщение Atoman » 01.04.2008 (Вт) 14:16

Как не работает?
Замени в АПИ объявлении тип Long на Integer,
а в коде Me.hWnd на Me.Handle

-----------------------------------------------------------

Код: Выделить всё
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hWnd As IntPtr, ByVal nIndex As Integer, ByVal dwNewLong As Integer) As Integer

Neo_
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 31.03.2008 (Пн) 14:34

Сообщение Neo_ » 02.04.2008 (Ср) 18:08

УРААА!!!!!!!!!! :D :D :D
Все работает!!! Спасибо большое! =)
Просто сначала, когда я объявлял функции, при попытке их использования вылезала ошибка разбалансировки стека, видимо это все из-за несоответствия типов данных... :oops:

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 02.04.2008 (Ср) 18:10

Это из-за того, что Integer имеет разный размер (2 / 4) в VB / VB.NET
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 03.04.2008 (Чт) 8:37

А я все практикую лечение травами...

Neo_
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 31.03.2008 (Пн) 14:34

Сообщение Neo_ » 03.04.2008 (Чт) 23:51

Да, спасибо! Это, в принципе, тоже самое, что написал Atoman... =)


Вернуться в Visual Basic 1–6

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

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

    TopList