puhpol
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
EasyBootIce_v1.4.zip
(2 MB, Downloaded: 3102 times)
Last edited by puhpol on 2017-01-27 18:45; edited 1 time in total
Joker-2013
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 & 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
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 В пьюрике можно переписывать встроенные процедуры?
В теории можно, но это крайне не красиво.
Joker-2013
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
Но нет множественного считывания (если кинуть несколько файлов)
nikzzzz
Longevity : 9 years 9 months Posts : 3114 REPUTATION :127 [+] [-]
Joker-2013 , Естественно, tempStr.s = PeekS(Buffer) считывает только имя первого файла.
nikzzzz
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)
Joker-2013
Longevity : 9 years 4 months Posts : 2053 REPUTATION :120 [+] [-] Location : из прошлого
nikzzzz , Всё отлично!!! Благодарю за помощь!nikzzzz , И в твоем коде нельзя навесить перетаскивание на всё окно... Было бы неплохо и по координатам.
AZJIO
Longevity : 6 years 8 months Posts : 1320 REPUTATION :127 [+] [-]
В AutoIt3 тоже есть пример
nikzzzz
Longevity : 9 years 9 months Posts : 3114 REPUTATION :127 [+] [-]
52736 В твоем коде нельзя навесить перетаскивание на всё окно...
Я считаю это просто неправильным, перетаскивание должно быть только для определенных элементов.
Joker-2013
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
Отправлено:
11-Apr-2018 23:49
(after 1 hour 5 minutes)
Joker-2013
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, ей что то не нравится в тех трех строчках... Константы, вроде имеются... И тут нашел, что для висты нужно по другому чуть прописать...
Gemostarter
Longevity : 7 years 7 months Posts : 323 REPUTATION :35 [+] [-]
Joker-2013 , вероятно, PB объявляет используемые функции API вне блока if-endif, независимо от того, где они будут использоваться. Попробуйте работать напрямую с dll.
nikzzzz
Longevity : 9 years 9 months Posts : 3114 REPUTATION :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
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.]
nikzzzz
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") ...
52761 ChangeWindowMessageFilter может не поддерживаться в будущих версиях Windows.
По крайней мере, в десятке поддерживается.
nikzzzz
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
Current time is: 02-Nov 10:59
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