amin84 Posted January 19, 2011 Share Posted January 19, 2011 Hello, I'm trying to make a GUI that has drag and drop. It works fine when the UAC is off. It won't do anything if the UAC is on. Here is the sample code: expandcollapse popup#RequireAdmin #include <GUIConstantsEx.au3> #include <ListViewConstants.au3> #include <WindowsConstants.au3> Opt("GuiOnEventMode", 1) Global $DropFilesArr[1] Global $FilesAllowedMask[4] = [3, ".txt", ".exe", "D"] GUICreate("Drop Multiple Files to LV Demo", 500, 400, -1, -1, -1, $WS_EX_ACCEPTFILES+$WS_EX_TOPMOST) GUISetOnEvent($GUI_EVENT_CLOSE, "MainEvents") GUISetOnEvent($GUI_EVENT_DROPPED, "MainEvents") GUIRegisterMsg(0x233, "WM_DROPFILES_FUNC") GUICtrlCreateLabel("Drag to the List View some file(s)", 60, 20) $ListView = GUICtrlCreateListView("Col1", 50, 50, 400, 300, -1, $WS_EX_CLIENTEDGE) GUICtrlSendMsg(-1, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_HEADERDRAGDROP, $LVS_EX_HEADERDRAGDROP) GUICtrlSetState(-1, $GUI_DROPACCEPTED) GUISetState() While 1 Sleep(100) WEnd Func MainEvents() Switch @GUI_CtrlId Case $GUI_EVENT_CLOSE Exit Case $GUI_EVENT_DROPPED $NotValidExtPath = "" $ValidExtCount = 0 For $i = 1 To UBound($DropFilesArr)-1 $ValidExtCount += 1 GUICtrlCreateListViewItem($DropFilesArr[$i], $ListView) Next If $ValidExtCount > 0 Then GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 0, -1) EndSwitch EndFunc Func _IsValidExt($sPath) For $i = 1 To $FilesAllowedMask[0] If StringRight($sPath, 4) = $FilesAllowedMask[$i] And _ Not StringInStr(FileGetAttrib($sPath), $FilesAllowedMask[$i]) Then Return True Next Return False EndFunc Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam) Local $nSize, $pFileName Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255) For $i = 0 To $nAmt[0] - 1 $nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0) $nSize = $nSize[0] + 1 $pFileName = DllStructCreate("char[" & $nSize & "]") DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", _ DllStructGetPtr($pFileName), "int", $nSize) ReDim $DropFilesArr[$i + 2] $DropFilesArr[$i+1] = DllStructGetData($pFileName, 1) $pFileName = 0 Next $DropFilesArr[0] = UBound($DropFilesArr)-1 EndFunc I searched MSDN and other places and they said you need to use ChangeWindowMessageFilter. I also found these which the writer claims it will solve the problem: ChangeWindowMessageFilter (WM_DROPFILES, MSGFLT_ADD); ChangeWindowMessageFilter (WM_COPYDATA, MSGFLT_ADD); ChangeWindowMessageFilter (0x0049, MSGFLT_ADD); But I don't know how to convert that to autoit. I tried a couple of ways but none of them worked and I really didn't know what I was doing. Any help will be greatly appreciated. Link to comment Share on other sites More sharing options...
guinness Posted January 19, 2011 Share Posted January 19, 2011 (edited) Maybe have a look at _WinAPI_DragQueryFileEx() in WinAPIEx.au3, this might solve your problem with UAC!? Or have a look here >> Edited January 19, 2011 by guinness UDF List:  _AdapterConnections() • _AlwaysRun() • _AppMon() • _AppMonEx() • _ArrayFilter/_ArrayReduce • _BinaryBin() • _CheckMsgBox() • _CmdLineRaw() • _ContextMenu() • _ConvertLHWebColor()/_ConvertSHWebColor() • _DesktopDimensions() • _DisplayPassword() • _DotNet_Load()/_DotNet_Unload() • _Fibonacci() • _FileCompare() • _FileCompareContents() • _FileNameByHandle() • _FilePrefix/SRE() • _FindInFile() • _GetBackgroundColor()/_SetBackgroundColor() • _GetConrolID() • _GetCtrlClass() • _GetDirectoryFormat() • _GetDriveMediaType() • _GetFilename()/_GetFilenameExt() • _GetHardwareID() • _GetIP() • _GetIP_Country() • _GetOSLanguage() • _GetSavedSource() • _GetStringSize() • _GetSystemPaths() • _GetURLImage() • _GIFImage() • _GoogleWeather() • _GUICtrlCreateGroup() • _GUICtrlListBox_CreateArray() • _GUICtrlListView_CreateArray() • _GUICtrlListView_SaveCSV() • _GUICtrlListView_SaveHTML() • _GUICtrlListView_SaveTxt() • _GUICtrlListView_SaveXML() • _GUICtrlMenu_Recent() • _GUICtrlMenu_SetItemImage() • _GUICtrlTreeView_CreateArray() • _GUIDisable() • _GUIImageList_SetIconFromHandle() • _GUIRegisterMsg() • _GUISetIcon() • _Icon_Clear()/_Icon_Set() • _IdleTime() • _InetGet() • _InetGetGUI() • _InetGetProgress() • _IPDetails() • _IsFileOlder() • _IsGUID() • _IsHex() • _IsPalindrome() • _IsRegKey() • _IsStringRegExp() • _IsSystemDrive() • _IsUPX() • _IsValidType() • _IsWebColor() • _Language() • _Log() • _MicrosoftInternetConnectivity() • _MSDNDataType() • _PathFull/GetRelative/Split() • _PathSplitEx() • _PrintFromArray() • _ProgressSetMarquee() • _ReDim() • _RockPaperScissors()/_RockPaperScissorsLizardSpock() • _ScrollingCredits • _SelfDelete() • _SelfRename() • _SelfUpdate() • _SendTo() • _ShellAll() • _ShellFile() • _ShellFolder() • _SingletonHWID() • _SingletonPID() • _Startup() • _StringCompact() • _StringIsValid() • _StringRegExpMetaCharacters() • _StringReplaceWholeWord() • _StringStripChars() • _Temperature() • _TrialPeriod() • _UKToUSDate()/_USToUKDate() • _WinAPI_Create_CTL_CODE() • _WinAPI_CreateGUID() • _WMIDateStringToDate()/_DateToWMIDateString() • Au3 script parsing • AutoIt Search • AutoIt3 Portable • AutoIt3WrapperToPragma • AutoItWinGetTitle()/AutoItWinSetTitle() • Coding • DirToHTML5 • FileInstallr • FileReadLastChars() • GeoIP database • GUI - Only Close Button • GUI Examples • GUICtrlDeleteImage() • GUICtrlGetBkColor() • GUICtrlGetStyle() • GUIEvents • GUIGetBkColor() • Int_Parse() & Int_TryParse() • IsISBN() • LockFile() • Mapping CtrlIDs • OOP in AutoIt • ParseHeadersToSciTE() • PasswordValid • PasteBin • Posts Per Day • PreExpand • Protect Globals • Queue() • Resource Update • ResourcesEx • SciTE Jump • Settings INI • SHELLHOOK • Shunting-Yard • Signature Creator • Stack() • Stopwatch() • StringAddLF()/StringStripLF() • StringEOLToCRLF() • VSCROLL • WM_COPYDATA • More Examples... Updated: 22/04/2018 Link to comment Share on other sites More sharing options...
trancexx Posted January 19, 2011 Share Posted January 19, 2011 (edited) There is no need to look at anything. It can't be done. edit: No, it can be done. That guy was right. Great! If IsAdmin() Then ; Allow to receive this messages if run elevated _ChangeWindowMessageFilterEx($hGUI, 0x233, 1) ; $WM_DROPFILES _ChangeWindowMessageFilterEx($hGUI, $WM_COPYDATA, 1) ; redundant? _ChangeWindowMessageFilterEx($hGUI, 0x0049, 1) ; $WM_COPYGLOBALDATA EndIf Func _ChangeWindowMessageFilterEx($hWnd, $iMsg, $iAction) Local $aCall = DllCall("user32.dll", "bool", "ChangeWindowMessageFilterEx", _ "hwnd", $hWnd, _ "dword", $iMsg, _ "dword", $iAction, _ "ptr", 0) If @error Or Not $aCall[0] Then Return SetError(1, 0, 0) Return 1 EndFunc Edited January 19, 2011 by trancexx Xandy and wakillon 2 ♡♡♡ . eMyvnE Link to comment Share on other sites More sharing options...
amin84 Posted January 19, 2011 Author Share Posted January 19, 2011 (edited) Awesome. I figured it out last night too but I was too tired to post it. So here is a sample Drag and Drop listview with RequireAdmin and UAC on (which is the first one in this forum): expandcollapse popup#RequireAdmin #include <GUIConstantsEx.au3> #include <ListViewConstants.au3> #include <WindowsConstants.au3> Opt("GuiOnEventMode", 1) Global $DropFilesArr[1] Global $FilesAllowedMask[4] = [3, ".txt", ".exe", "D"] $mainFrm = GUICreate("Drop Multiple Files to LV Demo", 500, 400, -1, -1, -1, $WS_EX_ACCEPTFILES+$WS_EX_TOPMOST) _ChangeWindowMessageFilterEx($mainFrm, 0x233, 1) _ChangeWindowMessageFilterEx($mainFrm, $WM_COPYDATA, 1) _ChangeWindowMessageFilterEx($mainFrm, 0x0049, 1) GUISetOnEvent($GUI_EVENT_CLOSE, "MainEvents") GUISetOnEvent($GUI_EVENT_DROPPED, "MainEvents") GUIRegisterMsg(0x233, "WM_DROPFILES_FUNC") GUICtrlCreateLabel("Drag to the List View some file(s)", 60, 20) $ListView = GUICtrlCreateListView("Col1", 50, 50, 400, 300, -1, $WS_EX_CLIENTEDGE) GUICtrlSendMsg(-1, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_HEADERDRAGDROP, $LVS_EX_HEADERDRAGDROP) GUICtrlSetState(-1, $GUI_DROPACCEPTED) GUISetState() While 1 Sleep(100) WEnd Func MainEvents() Switch @GUI_CtrlId Case $GUI_EVENT_CLOSE Exit Case $GUI_EVENT_DROPPED $NotValidExtPath = "" $ValidExtCount = 0 For $i = 1 To UBound($DropFilesArr)-1 $ValidExtCount += 1 GUICtrlCreateListViewItem($DropFilesArr[$i], $ListView) Next If $ValidExtCount > 0 Then GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 0, -1) EndSwitch EndFunc Func _IsValidExt($sPath) For $i = 1 To $FilesAllowedMask[0] If StringRight($sPath, 4) = $FilesAllowedMask[$i] And _ Not StringInStr(FileGetAttrib($sPath), $FilesAllowedMask[$i]) Then Return True Next Return False EndFunc Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam) Local $nSize, $pFileName Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255) For $i = 0 To $nAmt[0] - 1 $nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0) $nSize = $nSize[0] + 1 $pFileName = DllStructCreate("char[" & $nSize & "]") DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", _ DllStructGetPtr($pFileName), "int", $nSize) ReDim $DropFilesArr[$i + 2] $DropFilesArr[$i+1] = DllStructGetData($pFileName, 1) $pFileName = 0 Next $DropFilesArr[0] = UBound($DropFilesArr)-1 EndFunc Func _ChangeWindowMessageFilterEx($hWnd, $iMsg, $iAction) Local $aCall = DllCall("user32.dll", "bool", "ChangeWindowMessageFilterEx", _ "hwnd", $hWnd, _ "dword", $iMsg, _ "dword", $iAction, _ "ptr", 0) If @error Or Not $aCall[0] Then Return SetError(1, 0, 0) Return 1 EndFunc Edited January 19, 2011 by leomoon Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now