Важная информация
Показано с 1 по 5 из 5

Тема: Помогите написать хук для установки минимального размера окна (WinAPI)

  1. #1 Помогите написать хук для установки минимального размера окна (WinAPI) 
    Новичок
    Регистрация
    16.08.2011
    Сообщений
    17
    Сказал(а) спасибо
    5
    Поблагодарили 0 раз(а) в 0 сообщениях
    И снова здравствуйте.

    Есть такая проблема. Имеем программу (код которой изменить не можем) с возможностью подключения внешних DLL.
    У программы есть окно, у которого не установлен минимальный размер. Делается он просто - через модифицирование структуры MINMAXINFO, указатель на которую присылается вместе с уведомлением WM_GETMINMAXINFO. Однако модифицировать программу нельзя, так как, повторюсь, исходников её нету, а следовательно и нету доступа к WinProc() функции окна. Установить его средствами самой программы тоже нельзя. А минимальный размер нужен.
    Прознал, что обработку уведомления чужого окна можно реализовать через хук, размещённый в подключаемой DLL. Вроде бы идеальный вариант.
    Однако мне никак не удаётся его реализовать. Причём дело навряд ли в программе, к которой я его подключаю - он не работает и на другой, тестовой программе, которая только создаёт одно окно.
    Может кто-нибудь помочь с его написанием? Сейчас там что-то вроде этого (код на FreeBASIC):

    Код FreeBASIC:
    WinHook = SetWindowsHookEx( WH_GETMESSAGE, @GetMsgProc, NULL, GetCurrentThreadId() )
    Код FreeBASIC:
    Function _
    GetMsgProc _
    ( nCode AS Integer, wParam AS WPARAM, lParam AS LPARAM ) _
    AS LRESULT
     
      If Cast( PMSG, lParam )->message = WM_GETMINMAXINFO Then
        Dim AS PMINMAXINFO LimInfo = Cast( PMINMAXINFO, Cast( PMSG, lParam )->lParam )
        LimInfo->ptMinTrackSize.x = 320
        LimInfo->ptMinTrackSize.y = 200
      End If
     
      Return CallNextHookEx( WinHook, nCode, wParam, lParam )
     
    End Function

    Заранее благодарен.
    Ответить с цитированием  
     

  2. #2  
    Профи Аватар для stabud
    Регистрация
    05.01.2013
    Сообщений
    768
    Сказал(а) спасибо
    319
    Поблагодарили 339 раз(а) в 268 сообщениях
    Записей в блоге
    6
    Привет!

    С помощью хука это вряд ли удастся

    Я конечно могу ошибаться, но вот что я думаю по этому поводу. Правом что-то изменять в приложении может пользоваться только хук WH_GETMESSAGE , но в данной процедуре сообщения WM_GETMINMAXINFO не поймать. Это сообщение ловится только при установке хука WH_CALLWNDPROC . Но данный хук не имеет привилегий что-то изменять. В нем можно поймать сообщения , прочитать какие то данные и пожалуй на этом все.

    Однако , если программа поддерживает плагины, то есть твоя DLL будет из нее загружаться, то в этой DLL можно сабклассировать процедуру сообщений и все должно работать.
    Ответить с цитированием  
     

  3. 2 пользователя(ей) сказали cпасибо:

    >Quiet Snow< (24.02.2014), Black Doomer (23.02.2014)

  4. #3  
    Новичок
    Регистрация
    16.08.2011
    Сообщений
    17
    Сказал(а) спасибо
    5
    Поблагодарили 0 раз(а) в 0 сообщениях
    Цитата Сообщение от stabud Посмотреть сообщение
    Я конечно могу ошибаться, но вот что я думаю по этому поводу. Правом что-то изменять в приложении может пользоваться только хук WH_GETMESSAGE , но в данной процедуре сообщения WM_GETMINMAXINFO не поймать. Это сообщение ловится только при установке хука WH_CALLWNDPROC . Но данный хук не имеет привилегий что-то изменять. В нем можно поймать сообщения , прочитать какие то данные и пожалуй на этом все.
    Собственно, я сделал точно такой же вывод. Хотя до последнего надеялся, что ошибался.)

    Цитата Сообщение от stabud Посмотреть сообщение
    Однако , если программа поддерживает плагины, то есть твоя DLL будет из нее загружаться, то в этой DLL можно сабклассировать процедуру сообщений и все должно работать.
    А можно об этом поподробнее? Я, признаться, в WinAPI не силён.)
    Ответить с цитированием  
     

  5. #4  
    Профи Аватар для stabud
    Регистрация
    05.01.2013
    Сообщений
    768
    Сказал(а) спасибо
    319
    Поблагодарили 339 раз(а) в 268 сообщениях
    Записей в блоге
    6
    Я не знаю какие данные там передаются твоей DLL , надеюсь , что передается хендл того окна, который тебе надо урезать в размерах. В общем вот простой код сабклассинга:

    Код :
    #Include "windows.bi"
     
    Dim Shared As integer old
     
    Function _
    	GetMsgProc _
    	( hwnd as hwnd, msg as UINTEGER, wParam AS WPARAM, lParam AS LPARAM ) _
    	AS LRESULT Export
     
    	If msg = WM_GETMINMAXINFO Then
    		Dim AS PMINMAXINFO LimInfo = Cast(PMINMAXINFO, lParam )
    		LimInfo->ptMinTrackSize.x = 320
    		LimInfo->ptMinTrackSize.y = 200
    		Return 0
    	End If
      return CallWindowProc(Cast(Any Ptr,old),hwnd,msg,wparam,lparam)
    End Function
     
    Sub SubClass(hwnd as hwnd) Export
       old = SetWindowLong(hwnd,GWL_WNDPROC,CInt(@GetMsgProc))
    End Sub

    Для использования надо вызвать процедуру SubClass с хендлом окна, которое надо корректировать по размеру. После этого все оконные сообщения должны проходить через твою процедуру.
    Ответить с цитированием  
     

  6. 3 пользователя(ей) сказали cпасибо:

    >Quiet Snow< (24.02.2014), Black Doomer (23.02.2014), Абадябер (24.02.2014)

  7. #5  
    Новичок
    Регистрация
    16.08.2011
    Сообщений
    17
    Сказал(а) спасибо
    5
    Поблагодарили 0 раз(а) в 0 сообщениях
    stabud, помогло. Огромное спасибо!
    Ответить с цитированием  
     

Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 0
    Последнее сообщение: 08.12.2013, 13:06
  2. помогите написать программу
    от Маринка Константинова в разделе Turbo Pascal
    Ответов: 3
    Последнее сообщение: 07.11.2013, 02:56
  3. помогите написать программу
    от Стамус в разделе QBasic
    Ответов: 5
    Последнее сообщение: 18.10.2012, 20:35
  4. Ответов: 0
    Последнее сообщение: 10.01.2012, 19:18
  5. Помогите написать пару программ
    от PreF1993 в разделе QBasic
    Ответов: 6
    Последнее сообщение: 10.12.2010, 20:26
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •