Автор Тема: Совместное использование сообщений двумя UDF библиотеками  (Прочитано 3407 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2696
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Для тех, кто пишет UDF'ы.

Есть в AutoIt довольно скверная штука - GUIRegisterMsg(), предназначенная для регистрации пользовательских функций обработки WM_... сообщений, не возвращает имя предыдущего обработчика. После вызова GUIRegisterMsg() для какой-нибудь функции, предыдущий обработчик автоматически "отдыхает", и узнать после этого название его функции не представляется возможным. Таким образом, если я написал два UDF, в которых используется, например, WM_COMMAND, а пользователь в своей программе использует оба этих UDF, один из них просто не будет нормально работать (или вообще не будет работать). Для частичного решения данной проблемы можно поступить следующим образом:

UDF1.au3
Код: AutoIt [Выделить]
Global $__UDF1_WM0111 = 0

GUIRegisterMsg($WM_COMMAND, 'UDF1_WM_COMMAND')

...

Func UDF1_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    ; Handler from UDF2.au3
    If (IsDeclared('__UDF2_WM0111')) And (Not $__UDF2_WM0111) Then
        $__UDF1_WM0111 = 1
        Local $Result = UDF2_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
        $__UDF1_WM0111 = 0
        If $Result <> $GUI_RUNDEFMSG Then
            Return $Result
        EndIf
    EndIf
    ...
    Return $GUI_RUNDEFMSG
EndFunc   ;==>UDF1_WM_COMMAND


UDF2.au3
Код: AutoIt [Выделить]
Global $__UDF2_WM0111 = 0

GUIRegisterMsg($WM_COMMAND, 'UDF2_WM_COMMAND')

...

Func UDF2_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    ; Handler from UDF1.au3
    If (IsDeclared('__UDF1_WM0111')) And (Not $__UDF1_WM0111) Then
        $__UDF2_WM0111 = 1
        Local $Result = UDF1_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
        $__UDF2_WM0111 = 0
        If $Result <> $GUI_RUNDEFMSG Then
            Return $Result
        EndIf
    EndIf
    ...
    Return $GUI_RUNDEFMSG
EndFunc   ;==>UDF2_WM_COMMAND


Теперь оба обработчика будут работать вне зависимости от того, какой из этих двух UDF'ов пользователь поставил первым в списке #Include <...>. Также могут использоваться как оба UDF'а одновременно, так и по отдельности. Единственное, что нельзя предусмотреть, это использование WM_... сообщений в самой пользовательской программе, но тут необходимо его предупредить, что если он регистрирует (в данном случае) WM_COMMAND, то из его функции обработки этого сообщения нужно вызвать один из обработчиков вышеописанных UDF'ов (любой, но только один). Примерно так:

Код: AutoIt [Выделить]
Func MY_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    Local $Result = UDF1_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    If $Result <> $GUI_RUNDEFMSG Then
        Return $Result
    EndIf
    ...
    Return $GUI_RUNDEFMSG
EndFunc   ;==>MY_WM_SETCURSOR


Вот и все.
« Последнее редактирование: Август 01, 2010, 17:10:48 от Yashied »


Думай, прежде чем говорить.

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
4 Ответов
4469 Просмотров
Последний ответ Март 22, 2017, 14:11:44
от mrsoros
12 Ответов
4845 Просмотров
Последний ответ Январь 29, 2012, 10:17:30
от Tosyk
18 Ответов
29967 Просмотров
Последний ответ Декабрь 06, 2012, 14:50:33
от Kaster
1 Ответов
1967 Просмотров
Последний ответ Март 21, 2013, 22:48:12
от Naisho
4 Ответов
2126 Просмотров
Последний ответ Июль 14, 2013, 00:16:00
от Zalman1980
0 Ответов
1270 Просмотров
Последний ответ Сентябрь 28, 2013, 03:16:32
от joiner
2 Ответов
1343 Просмотров
Последний ответ Февраль 22, 2014, 20:57:44
от Z_Lenar
5 Ответов
1421 Просмотров
Последний ответ Июль 17, 2016, 14:48:11
от SergejF
2 Ответов
1380 Просмотров
Последний ответ Декабрь 29, 2016, 02:06:08
от qqww22
3 Ответов
472 Просмотров
Последний ответ Ноябрь 03, 2017, 13:05:22
от sngr