[Цитировать]

    puhpol
  • 2
  • Стаж: 10 лет
  • Сообщений: 891
  • Репутация:75

    [+] [-]
EasyBOOTICE v1.4- Очень удобная программа для редактирования файлов BCD, GRLDR, Menu.lst.
Программа проста, просто перетащите файл в нужное окно программы.
Откроется окно BootIce для редактирования файла.
Окно утилиты сохраняет свою позицию в файл конфигурации.
В файле конфигурации можно "включить" режим: "Поверх всех окон"
Кино:

Новая версия 1.4
Добавлена х64
При двойном клике на кнопки, открывается соответствующее окно BootICE
Решена проблема с перетаскиванием, при включенном UAC и запуском от имени Администратора
Благодарю nikzzzz за помощь!
Файл подписан самопальным сертификатом, что бы UAC писал корректные данные, установите Sert.cer в систему (не обязательно)
Вложение

v1.4 Fix4



Последний раз редактировалось: puhpol (2017-01-27 18:45), всего редактировалось 1 раз

[Цитировать]

    Joker-2013
  • 1039
  • Стаж: 9 лет 4 месяца
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
DragAcceptFiles_(GadgetID(4), 1)
DragAcceptFiles_(GadgetID(5), 1)
lpOldWndProc = SetWindowLongPtr_(GadgetID(4), #GWL_WNDPROC, @WndProc())
SetWindowLongPtr_(GadgetID(5), #GWL_WNDPROC, @WndProc())
Repeat
eventz=WaitWindowEvent ()
Select eventz
Case #PB_Event_CloseWindow
Quit = 1
EndSelect
Until Quit = 1
SetWindowLongPtr_(GadgetID(4), #GWL_WNDPROC, lpOldWndProc)
SetWindowLongPtr_(GadgetID(5), #GWL_WNDPROC, lpOldWndProc)
Вообще не понимаю данного кода...
Подключаем функцию API Drag & Drop
lpOldWndProc = SetWindowLongPtr_(GadgetID(4), #GWL_WNDPROC, @WndProc())
SetWindowLongPtr_(GadgetID(5), #GWL_WNDPROC, @WndProc())
один возврат берем, а второй нам не нужен? По какому принципу выбирает с какого гаджета нужен возврат?
SetWindowLongPtr_(GadgetID(4), #GWL_WNDPROC, lpOldWndProc)
SetWindowLongPtr_(GadgetID(5), #GWL_WNDPROC, lpOldWndProc)
Строчки прописаны после цикла, что они делают?
только для XP его желательно выключить.
То есть считывает версию системы и не подключаем фильты в хп?
В пьюрике можно переписывать встроенные процедуры?

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 9 месяцев
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
Joker-2013,
52721один возврат берем, а второй нам не нужен?
Так он будет один и тот-же, зачем лишнюю переменную создавать?
52721Строчки прописаны после цикла, что они делают?
Возвращают все в исходное состояние.
52721То есть считывает версию системы и не подключаем фильты в хп?
Да, примерно так:
If OSVersion() >= #PB_OS_Windows_Vista
  ChangeWindowMessageFilter_(#WM_DROPFILES,#MSGFLT_ADD)
  ChangeWindowMessageFilter_(#WM_COPYDATA,#MSGFLT_ADD)
  ChangeWindowMessageFilter_($0049,#MSGFLT_ADD)
EndIf
52721В пьюрике можно переписывать встроенные процедуры?
В теории можно, но это крайне не красиво.

[Цитировать]

    Joker-2013
  • 1039
  • Стаж: 9 лет 4 месяца
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
nikzzzz,
Работает даже такой вариант:
If OSVersion() >= #PB_OS_Windows_Vista
  ChangeWindowMessageFilter_(#WM_DROPFILES,#MSGFLT_ADD)
  ChangeWindowMessageFilter_(#WM_COPYDATA,#MSGFLT_ADD)
  ChangeWindowMessageFilter_($0049,#MSGFLT_ADD)
EndIf
If OpenWindow(1, 200, 200, 400, 400, "Drag & Drop", #PB_Window_SystemMenu)
  DragAcceptFiles_(WindowID(1),#True)
  Repeat
    Event = WaitWindowEvent()
    If Event = #WM_DROPFILES
      Buffer = AllocateMemory(300)
      DragQueryFile_(EventwParam(),0,Buffer,300)
      tempStr.s = PeekS(Buffer)
      FreeMemory(Buffer)
      MessageRequester("", tempStr.s)
    EndIf
  Until Event = #PB_Event_CloseWindow
EndIf
Но нет множественного считывания (если кинуть несколько файлов)

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 9 месяцев
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
Joker-2013,
Естественно, tempStr.s = PeekS(Buffer) считывает только имя первого файла.

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 9 месяцев
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
Joker-2013,
Немного окультурил
Global lpOldWndProc
Macro DragAcceptFiles(GadgetNumber)
  DragAcceptFiles_(GadgetID(GadgetNumber), 1)
  lpOldWndProc = SetWindowLongPtr_(GadgetID(GadgetNumber), #GWL_WNDPROC, @WndProc())
EndMacro
Macro IgnoreUAC()
  If OSVersion() >= #PB_OS_Windows_Vista
    ChangeWindowMessageFilter_(#WM_DROPFILES,#MSGFLT_ADD)
    ChangeWindowMessageFilter_(#WM_COPYDATA,#MSGFLT_ADD)
    ChangeWindowMessageFilter_($0049,#MSGFLT_ADD)
  EndIf
EndMacro
Macro DragAcceptFree(GadgetNumber)
  SetWindowLongPtr_(GadgetID(GadgetNumber), #GWL_WNDPROC, lpOldWndProc)
EndMacro
Procedure GadgetFromGadgetID(GadgetID)
  If IsWindow_(GadgetID)
    ProcedureReturn GetDlgCtrlID_(GadgetID)
  EndIf
  ProcedureReturn -1
EndProcedure
Procedure WndProc(hwnd, uMsg, wParam, lParam)
  Protected NumberOfCharactersDropped.i,CharacterIndex.i
  Protected CharacterBuffer.s = Space(#MAX_PATH),GadgetN.l
  Select uMsg
    Case #WM_DROPFILES
      GadgetN=GadgetFromGadgetID(hwnd)
      If GadgetN <>-1
        NumberOfCharactersDropped = DragQueryFile_(wParam , $FFFFFFFF, ReturnedFileName.s, 0)
        For CharacterIndex.i = 0 To NumberOfCharactersDropped.i - 1
          DragQueryFile_(wParam, CharacterIndex, CharacterBuffer, #MAX_PATH)
          AddGadgetItem(GadgetN, -1, CharacterBuffer.s)
        Next
      EndIf
      DragFinish_(*DroppedFilesArea)
  EndSelect
  ProcedureReturn CallWindowProc_(lpOldWndProc, hWnd, uMsg, wParam, lParam)
EndProcedure
;;;;;;;;;;;;;;; Main ;;;;;;;;;;;;;
IgnoreUAC()
hWnd0 = OpenWindow(0, 0, 0, 400, 400, "Drag & Drop", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
EditorGadget(4, 10, 10, 380, 180, #PB_Editor_ReadOnly)
DragAcceptFiles(4)
EditorGadget(5, 10, 200, 380, 180, #PB_Editor_ReadOnly)
DragAcceptFiles(5)
While #True
  Select WaitWindowEvent ()
    Case #PB_Event_CloseWindow
      Break
  EndSelect
Wend
DragAcceptFree(4)
DragAcceptFree(5)

[Цитировать]

    Joker-2013
  • 1039
  • Стаж: 9 лет 4 месяца
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
nikzzzz, Всё отлично!!! Благодарю за помощь!
nikzzzz, И в твоем коде нельзя навесить перетаскивание на всё окно...
Было бы неплохо и по координатам.

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 8 месяцев
  • Сообщений: 1322
  • Репутация:127

    [+] [-]
В AutoIt3 тоже есть пример

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 9 месяцев
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
52736В твоем коде нельзя навесить перетаскивание на всё окно...
Я считаю это просто неправильным, перетаскивание должно быть только для определенных элементов.

[Цитировать]

    Joker-2013
  • 1039
  • Стаж: 9 лет 4 месяца
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
Новая версия 1.4
Добавлена х64
Надеюсь что решена проблема с перетаскиванием, при включенном UAC и запуском от имени Администратора
Благодарю nikzzzz за помощь!


Последний раз редактировалось: Joker-2013 (2018-04-12 19:45), всего редактировалось 1 раз

[Цитировать]

    Joker-2013
  • 1039
  • Стаж: 9 лет 4 месяца
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
nikzzzz, Нашел в чем причина, но ума не дам как это исправить....
Macro IgnoreUAC()
  If OSVersion() >= #PB_OS_Windows_Vista
    ChangeWindowMessageFilter_(#WM_DROPFILES,#MSGFLT_ADD)
    ChangeWindowMessageFilter_(#WM_COPYDATA,#MSGFLT_ADD)
    ChangeWindowMessageFilter_($0049,#MSGFLT_ADD)
  EndIf
EndMacro
Данный код, после компиляции не совместим с XP
Даже если условие не соблюдается, то все равно программа вылетает с ошибкой Точка входа в User32 не найдена.
Если закоментировать три строки с ChangeWindowMessageFilter_, то все ок...
Пытался после If OSVersion() >= #PB_OS_Windows_Vista писать Debug "Hello" но оно не выполняется, так как не соблюдено условие, но это не мешает вылетать скомпилирлванной версии.
Получается что код при компиляции, преобразуется, а при запуске в системе XP, ей что то не нравится в тех трех строчках...
Константы, вроде имеются...
И тут нашел, что для висты нужно по другому чуть прописать...

[Цитировать]

    Gemostarter
  • 15956
  • Стаж: 7 лет 7 месяцев
  • Сообщений: 323
  • Репутация:35

    [+] [-]
Joker-2013, вероятно, PB объявляет используемые функции API вне блока if-endif, независимо от того, где они будут использоваться. Попробуйте работать напрямую с dll.

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 9 месяцев
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
Gemostarter,
52758PB объявляет используемые функции API вне блока if-endif, независимо от того, где они будут использоваться. Попробуйте работать напрямую с dll.
Совершенно верно, интеллект компилятора. ay ac
Самому ручками все приходится делать. ac am
Macro IgnoreUAC()
  If OSVersion() >= #PB_OS_Windows_Vista
    user32_dll = OpenLibrary(#PB_Any, "user32.dll")
    CallFunction(user32_dll, "ChangeWindowMessageFilter", #WM_DROPFILES, #MSGFLT_ADD)
    CallFunction(user32_dll, "ChangeWindowMessageFilter", #WM_COPYDATA, #MSGFLT_ADD)
    CallFunction(user32_dll, "ChangeWindowMessageFilter", $0049, #MSGFLT_ADD)
    CloseLibrary(user32_dll)
  EndIf
EndMacro

[Цитировать]

    Joker-2013
  • 1039
  • Стаж: 9 лет 4 месяца
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
nikzzzz, Может все таки нужно сделать такой же определятор как в LUA?
if User32:GetProcAddress_("ChangeWindowMessageFilterEx") then -- for Windows 7 and above
    User32.ChangeWindowMessageFilterEx(hWnd, 0x233,  1, 0);
    User32.ChangeWindowMessageFilterEx(hWnd, 0x004A, 1, 0);
    User32.ChangeWindowMessageFilterEx(hWnd, 0x0049, 1, 0);
  else
    if User32:GetProcAddress_("ChangeWindowMessageFilter") then -- for Windows Vista, Windows Server 2008
      User32.ChangeWindowMessageFilter(0x233,  1);
      User32.ChangeWindowMessageFilter(0x004A, 1);
      User32.ChangeWindowMessageFilter(0x0049, 1);
    end
end
Проверять наличие точки входа, а не версию ОС
Как код будет выглядеть на пьюрике?
Хотя Фред написал: IIRC MS не предоставляет юникодную версию GetProcAddress_ (), поэтому вам придется самому обрабатывать это дело.
Тут есть какие то решения, но я не понимаю код...
А MS пишут:
[Использование функции ChangeWindowMessageFilter не рекомендуется, так как имеет область действия по всему процессу. Вместо этого используйте функцию ChangeWindowMessageFilterEx для управления доступом к определенным окнам по мере необходимости. ChangeWindowMessageFilter может не поддерживаться в будущих версиях Windows.]

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 9 месяцев
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
Joker-2013,
Minimum supported client - Windows Vista [desktop apps only]
Зачем усложнять задачу?
52761Проверять наличие точки входа, а не версию ОС
Как-то так
user32_dll = OpenLibrary(#PB_Any, "user32.dll")
If GetFunction(user32_dll, "ChangeWindowMessageFilter") ...
52761ChangeWindowMessageFilter может не поддерживаться в будущих версиях Windows.
По крайней мере, в десятке поддерживается.

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 9 месяцев
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
Добавил DragAcceptAction
;DragAcceptAction
#DA_Add                =  1  ; Добавляет DragFile или DragDir вместо замены
#DA_Dir                =  2  ;
#DA_File               =  4  ; Default
#DA_MaxGadgetNumber    = 20  ; GadgetNumber не должен превышать это значение !!!
#PB_FileSystem_Dir     = 16
Global lpOldWndProc
Global Dim DragAcceptAction(#DA_MaxGadgetNumber + 1)
Macro DragAcceptFiles(GadgetNumber,Action=4)
  DragAcceptFiles_(GadgetID(GadgetNumber), 1)
  lpOldWndProc = SetWindowLongPtr_(GadgetID(GadgetNumber), #GWL_WNDPROC, @WndProc())
  DragAcceptAction(GadgetNumber) = Action
EndMacro
Macro IgnoreUAC()
  If OSVersion() >= #PB_OS_Windows_Vista
    user32_dll = OpenLibrary(#PB_Any, "user32.dll")
    CallFunction(user32_dll, "ChangeWindowMessageFilter", #WM_DROPFILES, #MSGFLT_ADD)
    CallFunction(user32_dll, "ChangeWindowMessageFilter", #WM_COPYDATA, #MSGFLT_ADD)
    CallFunction(user32_dll, "ChangeWindowMessageFilter", $0049, #MSGFLT_ADD)
    CloseLibrary(user32_dll)
  EndIf
EndMacro
Macro DragAcceptFree(GadgetNumber)
  SetWindowLongPtr_(GadgetID(GadgetNumber), #GWL_WNDPROC, lpOldWndProc)
EndMacro
Procedure GadgetFromGadgetID(GadgetID)
  If IsWindow_(GadgetID)
    ProcedureReturn GetDlgCtrlID_(GadgetID)
  EndIf
  ProcedureReturn -1
EndProcedure
Procedure WndProc(hwnd, uMsg, wParam, lParam)
  Protected NumberOfCharactersDropped.i,CharacterIndex.i , Action.i, FileAttribDir.i
  Protected CharacterBuffer.s = Space(#MAX_PATH),GadgetNumber.l, DropText.s = ""
  Select uMsg
    Case #WM_DROPFILES
      GadgetNumber=GadgetFromGadgetID(hwnd)
      If GadgetNumber <>-1
        Action=DragAcceptAction(GadgetNumber)
        If Action & $1 : DropText = GetGadgetText(GadgetNumber) : EndIf
        NumberOfCharactersDropped = DragQueryFile_(wParam , $FFFFFFFF, #NUL, 0)
        For CharacterIndex = 0 To NumberOfCharactersDropped - 1
          DragQueryFile_(wParam, CharacterIndex, CharacterBuffer, #MAX_PATH)
          If GetFileAttributes(CharacterBuffer) & #PB_FileSystem_Dir : FileAttribDir=0 : Else : FileAttribDir=-1 : EndIf
          If (FileAttribDir And (Action & $4)) Or (Not FileAttribDir And (Action & $2))
            If DropText<>"" : DropText + Chr(10) : EndIf
            DropText = DropText + CharacterBuffer
          EndIf
        Next
        If Not DropText = ""
          SetGadgetText(GadgetNumber, DropText)
        EndIf
      EndIf
      DragFinish_(*DroppedFilesArea)
  EndSelect
  ProcedureReturn CallWindowProc_(lpOldWndProc, hWnd, uMsg, wParam, lParam)
EndProcedure
;;;;;;;;;;;;;;; Main Demo ;;;;;;;;;;;;;
IgnoreUAC()
hWnd0 = OpenWindow(0, 0, 0, 400, 400, "Drag & Drop", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
EditorGadget(4, 10, 10, 380, 180, #PB_Editor_ReadOnly)
;Добавить в список захваченные файлы
DragAcceptFiles(4, #DA_File | #DA_Add)
EditorGadget(5, 10, 200, 380, 180, #PB_Editor_ReadOnly)
;Список - только захваченные каталоги
DragAcceptFiles(5, #DA_Dir)
While #True
  Select WaitWindowEvent ()
    Case #PB_Event_CloseWindow
      Break
  EndSelect
Wend
DragAcceptFree(4)
DragAcceptFree(5)


Последний раз редактировалось: nikzzzz (2018-04-13 04:26), всего редактировалось 4 раз(а)

Страница 3 из 5


Показать сообщения:    

Текущее время: 21-Ноя 15:08

Часовой пояс: UTC + 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы можете скачивать файлы