Что нового

Как сделать Drag-and-drop ели скрипт запущен от Админа

pvnn

Осваивающий
Сообщения
305
Репутация
32
Всем привет
Скрипт нормально работал, пока не решил запускать его с правами админа. Перестал работать Drag-and-drop.
Как можно исправить?

Код:
;~ #RequireAdmin ; Если активизировать эту строку, то скрипт не будет работать

; Библиотеки
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>


; GUI
$Form1 = GUICreate("", 335, 84, -1, -1,-1,BitOR($WS_EX_ACCEPTFILES,$WS_EX_TOPMOST) )
$Label1 = GUICtrlCreateLabel("Файл:", 8, 16, 82, 17)
$InpPath = GUICtrlCreateInput("", 50, 12, 217, 21)
GUICtrlSetState(-1, $GUI_DROPACCEPTED) ; Input наделённый свойством drag-and-drop (8)
$ButOK = GUICtrlCreateButton("ОК", 77, 48, 75, 25)
$ButCancel = GUICtrlCreateButton("Отмена", 165, 48, 75, 25)
$ButBrows = GUICtrlCreateButton("...", 275, 11, 48, 22)
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE,$ButCancel
			Exit
		Case $GUI_EVENT_DROPPED ; Событие приходящееся на drag-and-drop (-13)
            If @GUI_DropId = $InpPath Then GUICtrlSetData($InpPath, @GUI_DragFile)
	EndSwitch
WEnd
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
pvnn
Как можно исправить?
Никак. Если у принимающего окна права выше, чем у передающего, то перетаскивание в него невозможно, но нужно очень много знаний (см. ниже).
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Друзья, ну в примере же к функции_WinAPI_DragQueryFileEx() все есть (я закоментировал этот участок).
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
Yashied, спасибо за ответ!
Тема решена

Код:
#RequireAdmin

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>


#include <WinAPISys.au3>


; GUI
$Form1 = GUICreate("", 335, 84, -1, -1,-1,$WS_EX_TOPMOST )
$Label1 = GUICtrlCreateLabel("Файл:", 8, 16, 45, 17)
$InpPath = GUICtrlCreateInput("", 50, 12, 217, 21)
Global $g_hLabel = GUICtrlGetHandle($InpPath)
$ButOK = GUICtrlCreateButton("ОК", 77, 48, 75, 25)
$ButCancel = GUICtrlCreateButton("Отмена", 165, 48, 75, 25)
$ButBrows = GUICtrlCreateButton("...", 275, 11, 48, 22)

; Register label window proc
Global $g_hDll = DllCallbackRegister('_WinProc', 'ptr', 'hwnd;uint;wparam;lparam')
Global $g_pDll = DllCallbackGetPtr($g_hDll)
Global $g_hProc = _WinAPI_SetWindowLong($g_hLabel, $GWL_WNDPROC, $g_pDll)
_WinAPI_DragAcceptFiles($g_hLabel, $GUI_CHECKED)

GUISetState(@SW_SHOW)

If IsAdmin() Then
    _WinAPI_ChangeWindowMessageFilterEx($g_hLabel, $WM_COPYGLOBALDATA, $MSGFLT_ALLOW)
    _WinAPI_ChangeWindowMessageFilterEx($g_hLabel, $WM_DROPFILES, $MSGFLT_ALLOW)
EndIf

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE,$ButCancel
            Exit
    EndSwitch
WEnd

Func _WinProc($hWnd, $iMsg, $wParam, $lParam)
	Local $Str
    Switch $iMsg
        Case $WM_DROPFILES
            Local $sFileList = _WinAPI_DragQueryFileEx($wParam)
            If Not @error Then
				GUICtrlSetData($InpPath, $sFileList[1])
;~                 For $i = 1 To $sFileList[0] ; Несколько файлов
;~                     $Str&=$sFileList[$i] & @CRLF
;~                 Next
;~ 				MsgBox(0,'',$Str)
            EndIf
            _WinAPI_DragFinish($wParam)
            Return 0
    EndSwitch
    Return _WinAPI_CallWindowProc($g_hProc, $hWnd, $iMsg, $wParam, $lParam)
EndFunc   ;==>_WinProc
 
Верх