[Quote]

    puhpol
  • 2
  • Longevity: 9 years
  • Posts: 888
  • REPUTATION:74

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

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

v1.4 Fix4



Last edited by puhpol on 2017-01-27 18:45; edited 1 time in total

[Quote]

    Joker-2013
  • 1039
  • Longevity: 9 years 4 months
  • Posts: 2053
  • REPUTATION:120

    [+] [-]
  • Location: из прошлого
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 его желательно выключить.
То есть считывает версию системы и не подключаем фильты в хп?
В пьюрике можно переписывать встроенные процедуры?

[Quote]

    nikzzzz
  • 215
  • Longevity: 9 years 9 months
  • Posts: 3114
  • REPUTATION: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В пьюрике можно переписывать встроенные процедуры?
В теории можно, но это крайне не красиво.

[Quote]

    Joker-2013
  • 1039
  • Longevity: 9 years 4 months
  • Posts: 2053
  • REPUTATION:120

    [+] [-]
  • Location: из прошлого
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
Но нет множественного считывания (если кинуть несколько файлов)

[Quote]

    nikzzzz
  • 215
  • Longevity: 9 years 9 months
  • Posts: 3114
  • REPUTATION:127

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

[Quote]

    nikzzzz
  • 215
  • Longevity: 9 years 9 months
  • Posts: 3114
  • REPUTATION: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)

[Quote]

    Joker-2013
  • 1039
  • Longevity: 9 years 4 months
  • Posts: 2053
  • REPUTATION:120

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

[Quote]

    AZJIO
  • 17953
  • Longevity: 6 years 8 months
  • Posts: 1320
  • REPUTATION:127

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

[Quote]

    nikzzzz
  • 215
  • Longevity: 9 years 9 months
  • Posts: 3114
  • REPUTATION:127

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

[Quote]

    Joker-2013
  • 1039
  • Longevity: 9 years 4 months
  • Posts: 2053
  • REPUTATION:120

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


Last edited by Joker-2013 on 2018-04-12 19:45; edited 1 time in total

[Quote]

    Joker-2013
  • 1039
  • Longevity: 9 years 4 months
  • Posts: 2053
  • REPUTATION:120

    [+] [-]
  • Location: из прошлого
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, ей что то не нравится в тех трех строчках...
Константы, вроде имеются...
И тут нашел, что для висты нужно по другому чуть прописать...

[Quote]

    Gemostarter
  • 15956
  • Longevity: 7 years 7 months
  • Posts: 323
  • REPUTATION:35

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

[Quote]

    nikzzzz
  • 215
  • Longevity: 9 years 9 months
  • Posts: 3114
  • REPUTATION: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

[Quote]

    Joker-2013
  • 1039
  • Longevity: 9 years 4 months
  • Posts: 2053
  • REPUTATION:120

    [+] [-]
  • Location: из прошлого
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.]

[Quote]

    nikzzzz
  • 215
  • Longevity: 9 years 9 months
  • Posts: 3114
  • REPUTATION: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.
По крайней мере, в десятке поддерживается.

[Quote]

    nikzzzz
  • 215
  • Longevity: 9 years 9 months
  • Posts: 3114
  • REPUTATION: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)


Last edited by nikzzzz on 2018-04-13 04:26; edited 4 times in total

Page 3 of 5


Display posts:    

Current time is: 02-Nov 10:26

All times are UTC + 3


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum