MessageBoxIndirect и CallBack

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Tamplier
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 183
Зарегистрирован: 18.11.2005 (Пт) 13:35
Откуда: Москва

MessageBoxIndirect и CallBack

Сообщение Tamplier » 12.03.2006 (Вс) 20:32

В общем, такая проблема. Использую MessageBoxIndirect (позарез нужна ф-ция CallBack). Вроде, все нормально, но вот досада: управление на CallBack не переходит... Тот же CallBack я использую в SHBrowseForFolder и все нормально, а тут - никак. Ему (MessageBoxIndirect ) что CallBack особенный нужен?
Код:
Код: Выделить всё
Sub CallMsg()
    Dim lpIDList As Long
    Dim udtBI As BrowseInfo
    With udtBI
        .hWndOwner = Form1.hwnd
        .lpfnCallback = GetAddressOfFunction(AddressOf MsgCallBack)
    End With
    SHBrowseForFolder udtBI
    Dim MBP As MSGBOXPARAMS
    With MBP
        .cbSize = Len(MBP)
        .hWndOwner = Form1.hwnd
        .lpszText = "text"
        .lpszCaption = "other text"
        .dwStyle = MB_ICONINFORMATION
        .lpfnMsgBoxCallback = GetAddressOfFunction(AddressOf MsgCallBack)
    End With
    MessageBoxIndirect MBP
End Sub
Public Function GetAddressOfFunction(add As Long) As Long
    GetAddressOfFunction = add
End Function
Public Function MsgCallBack(ByVal hwnd As Long, ByVal uMsg As Long, ByVal lp As Long, ByVal pData As Long) As Long
    On Error Resume Next
    Debug.Print "CallBack Successed " & hwnd & Chr(32) & uMsg
    MsgCallBack = 0
End Function

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

Сообщение tyomitch » 12.03.2006 (Вс) 20:40

Конечно, особенный.

MSDN писал(а):The callback function has the following form:
Код: Выделить всё
VOID CALLBACK MsgBoxCallback(LPHELPINFO lpHelpInfo);

Изображение

Tamplier
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 183
Зарегистрирован: 18.11.2005 (Пт) 13:35
Откуда: Москва

Сообщение Tamplier » 12.03.2006 (Вс) 20:55

VOID CALLBACK MsgBoxCallback(LPHELPINFO lpHelpInfo);
А хендла у него нет что ли? Мне просто надо манипуляцию одну с ним проводить, а времени писать свой MsgBox нет :(

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

Сообщение tyomitch » 12.03.2006 (Вс) 20:58

Какая связь между наличием у него хендла -- и этим каллбаком, который вызывается, когда пользователь просит справку?
:-? :roll:
Изображение

Tamplier
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 183
Зарегистрирован: 18.11.2005 (Пт) 13:35
Откуда: Москва

Сообщение Tamplier » 13.03.2006 (Пн) 16:59

дело в том, что я не занл, что CallBack у него наступает только тогда, когда юзер справку вызывает. Вот и подумал, что его можно использовать... А выхода никакого нет кроме создания своего nsgbox'а?

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 13.03.2006 (Пн) 17:07

Tamplier
Смотря что тебе надо сделать с месаджбоксом
Есть ещё хуки....
Если всё делать своими ручками, они скоро отвалятся !

Tamplier
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 183
Зарегистрирован: 18.11.2005 (Пт) 13:35
Откуда: Москва

Сообщение Tamplier » 13.03.2006 (Пн) 17:21

Мне в скин его надо облачить... А толку? Все равно код не выполняется, пока MsgBox торчит :(

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 13.03.2006 (Пн) 17:22

Tamplier
Хук позволяет поменять иконку в месаджбоксе....не наводит на мысли :roll:
Если всё делать своими ручками, они скоро отвалятся !

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

Сообщение tyomitch » 13.03.2006 (Пн) 19:17

Tamplier писал(а):дело в том, что я не занл, что CallBack у него наступает только тогда, когда юзер справку вызывает.

Вообще-то читать справку полезнее, чем действовать методом тыка, но кто ж идёт простым путём...

Tamplier писал(а):А выхода никакого нет кроме создания своего nsgbox'а?

Выход есть: поставить таймер, из обработчика таймера мучать месседжбокс.
Примера на VB под рукой нет, но можешь посмотреть на ftp://cs.usu.edu.ru/Util/Tiger2/src/
Там я в обычный месседжбокс добавляю гиперссылки 8-)


2Kovu: хуки здесь вообще не при чём.
Изображение

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 13.03.2006 (Пн) 19:24

tyomitch Почему, ведь в процедуре хука можно поменять офрмление messageboxа :roll:
Если всё делать своими ручками, они скоро отвалятся !

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

Сообщение tyomitch » 13.03.2006 (Пн) 19:52

Угу, а ещё можно расхакать user32.dll и исправить там шаблон месседжбокса. Кто ж идёт простым путём?
Изображение

Tamplier
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 183
Зарегистрирован: 18.11.2005 (Пт) 13:35
Откуда: Москва

Сообщение Tamplier » 13.03.2006 (Пн) 20:13

а хендл ловить через FindWindowEx?

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

Сообщение tyomitch » 13.03.2006 (Пн) 20:30

Я ищу через EnumThreadWindows(GetCurrentThreadId) + GetClassLong(GCW_ATOM) + GetWindow(GW_OWNER)
Это, конечно, не 100% гарантия, но всё же намного лучше, чем FindWindowEx.
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 13.03.2006 (Пн) 20:56

А почему бы не использовать свое окно, подделав его под MessageBox? ИМХО, правильнее это будет.
Lasciate ogni speranza, voi ch'entrate.

Tamplier
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 183
Зарегистрирован: 18.11.2005 (Пт) 13:35
Откуда: Москва

Сообщение Tamplier » 14.03.2006 (Вт) 8:21

alibek писал(а):А почему бы не использовать свое окно, подделав его под MessageBox? ИМХО, правильнее это будет.

правильнее конечно. Но у меня вряд ли будет время писать его. Мне проект скоро сдавать... :(
Мне просто надо манипуляцию одну с ним проводить, а времени писать свой MsgBox нет

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.03.2006 (Вт) 8:53

Tamplier писал(а):Но у меня вряд ли будет время писать его. Мне проект скоро сдавать... :(

Ты уже потратил уже несколько дней на вопросы.
За это время MsgBox можно написать несколько раз.
Lasciate ogni speranza, voi ch'entrate.

Tamplier
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 183
Зарегистрирован: 18.11.2005 (Пт) 13:35
Откуда: Москва

Сообщение Tamplier » 14.03.2006 (Вт) 15:14

Ты уже потратил уже несколько дней на вопросы. За это время MsgBox можно написать несколько раз.

дклдо в том, что у меня не только эта проблема. И не только проект.

EnumThreadWindows(GetCurrentThreadId) + GetClassLong(GCW_ATOM) + GetWindow(GW_OWNER)

А чем FindWindow не подходит?

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

Сообщение tyomitch » 14.03.2006 (Вт) 15:29

Tamplier писал(а):
EnumThreadWindows(GetCurrentThreadId) + GetClassLong(GCW_ATOM) + GetWindow(GW_OWNER)

А чем FindWindow не подходит?

Не даёт гарантии, что найдёшь именно своё окно.
Мало ли может оказаться окон с таким заголовком?


И ещё чисто человеческая просьба: укороти подпись вдвое, а?
Изображение

Tamplier
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 183
Зарегистрирован: 18.11.2005 (Пт) 13:35
Откуда: Москва

Сообщение Tamplier » 14.03.2006 (Вт) 15:52

логично, тока в Ex еще, кажется, надо указывать хендл родителя... Это должно спасти...

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

Сообщение GSerg » 14.03.2006 (Вт) 16:34

Tamplier
Чуть более официально повторю человеческую просьбу Тёмыча.
Укороти подпись втрое, а?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Tamplier
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 183
Зарегистрирован: 18.11.2005 (Пт) 13:35
Откуда: Москва

Сообщение Tamplier » 15.03.2006 (Ср) 18:55

логично, тока в Ex еще, кажется, надо указывать хендл родителя... Это должно спасти...

Так что, поможет это условие?

Tamplier
Хук позволяет поменять иконку в месаджбоксе....не наводит на мысли

А можно поподробнее про хуки? (поиск ничего не дал ни хук, ни hook)


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

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

Сейчас этот форум просматривают: AhrefsBot, Google-бот, Majestic-12 [Bot] и гости: 18

    TopList