puhpol
Стаж : 10 лет Сообщений : 891 Репутация :75 [+] [-]
EasyBOOTICE v1.4 -
Очень удобная программа для редактирования файлов BCD, GRLDR, Menu.lst. Программа проста, просто перетащите файл в нужное окно программы. Откроется окно BootIce для редактирования файла. Окно утилиты сохраняет свою позицию в файл конфигурации. В файле конфигурации можно "включить" режим: "Поверх всех окон" Кино:Новая версия 1.4 Добавлена х64 При двойном клике на кнопки, открывается соответствующее окно BootICE Решена проблема с перетаскиванием, при включенном UAC и запуском от имени АдминистратораБлагодарю nikzzzz за помощь! Файл подписан самопальным сертификатом, что бы UAC писал корректные данные, установите Sert.cer в систему (не обязательно)
Вложение
EasyBootIce_v1.4.zip
(2 MB, Скачано: 3123 раз)
Последний раз редактировалось: puhpol (2017-01-27 18:45), всего редактировалось 1 раз
Joker-2013
Стаж : 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 & DroplpOldWndProc = 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
Стаж : 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
Стаж : 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
Стаж : 9 лет 9 месяцев Сообщений : 3114 Репутация :127 [+] [-]
Joker-2013 , Естественно, tempStr.s = PeekS(Buffer) считывает только имя первого файла.
nikzzzz
Стаж : 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
Стаж : 9 лет 4 месяца Сообщений : 2053 Репутация :120 [+] [-] Откуда : из прошлого
nikzzzz , Всё отлично!!! Благодарю за помощь!nikzzzz , И в твоем коде нельзя навесить перетаскивание на всё окно... Было бы неплохо и по координатам.
AZJIO
Стаж : 6 лет 8 месяцев Сообщений : 1322 Репутация :127 [+] [-]
В AutoIt3 тоже есть пример
nikzzzz
Стаж : 9 лет 9 месяцев Сообщений : 3114 Репутация :127 [+] [-]
52736 В твоем коде нельзя навесить перетаскивание на всё окно...
Я считаю это просто неправильным, перетаскивание должно быть только для определенных элементов.
Joker-2013
Стаж : 9 лет 4 месяца Сообщений : 2053 Репутация :120 [+] [-] Откуда : из прошлого
Новая версия 1.4 Добавлена х64 Надеюсь что решена проблема с перетаскиванием, при включенном UAC и запуском от имени АдминистратораБлагодарю nikzzzz за помощь!
Последний раз редактировалось: Joker-2013 (2018-04-12 19:45), всего редактировалось 1 раз
Отправлено:
11-Апр-2018 23:49
(спустя 1 час 5 минут)
Joker-2013
Стаж : 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
Стаж : 7 лет 7 месяцев Сообщений : 323 Репутация :35 [+] [-]
Joker-2013 , вероятно, PB объявляет используемые функции API вне блока if-endif, независимо от того, где они будут использоваться. Попробуйте работать напрямую с dll.
nikzzzz
Стаж : 9 лет 9 месяцев Сообщений : 3114 Репутация :127 [+] [-]
Gemostarter ,52758 PB объявляет используемые функции API вне блока if-endif, независимо от того, где они будут использоваться. Попробуйте работать напрямую с dll.
Совершенно верно, интеллект компилятора. Самому ручками все приходится делать. 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
Стаж : 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
Стаж : 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") ...
52761 ChangeWindowMessageFilter может не поддерживаться в будущих версиях Windows.
По крайней мере, в десятке поддерживается.
nikzzzz
Стаж : 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-Ноя 14:43
Часовой пояс: UTC + 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете прикреплять файлы к сообщениям Вы можете скачивать файлы