sanmoking 发表于 2012-5-1 09:57:38

au3的gui如何接受浏览器拖放过来的链接地址【已解决】

本帖最后由 sanmoking 于 2012-5-4 10:56 编辑

一般浏览器都支持链接地址拖放,拖放到浏览器自身是新页面打开,拖放到系统桌面或文件夹,就是创建快捷方式,拖放到其他程序有另外的作用,比如迅雷,就新建下载……
总之肯定是有接收的方法的,au3我只知道能接收文件文件夹,这种链接网址什么的还不会,过路的高人,大婶们发发慈悲,万分感激。。我目前需要把接收到的地址显示在input里面。

多谢各位的帮助,测试了几位的代码,简单反馈一下:

2楼【疯子】的代码,跟我现在要用的效果不是很合适,不过也见识了au3的前景,以后可以用到其他地方。

13楼【大师】的代码,如果纯创建个控件来提示拖入,效果到还是挺好的,不过有点反人类,平常只有创建个放大镜图标什么的提示拖出去的用法。
我尝试把这个ObjCreate("Shell.Explorer.2")扩展到窗口全部,整个窗口都有拖入功能了,但是上面的输入控件,按钮控件的显示要想处理好比较麻烦,得不偿失。

11楼【happytc】的代码,是比较接近我想要的,不过一般这种拖入链接最好用input,富文本框会自动换行,不好,还没研究不自动换行的参数,另外富文本框图片、文字什么的我一选都能拖入,不好,我只需要超链接。框里已经有内容的,我在拖入新的进去需要替换掉旧的,要求不能共存。。。

再次感谢大家的帮助,我再研究研究。

lanfengc 发表于 2012-5-1 11:57:58

曲线救国解决获取浏览器点击网址

本帖最后由 lanfengc 于 2012-5-1 13:12 编辑

给你个例子。这个例子以前在lynfr8写的那个不弹出窗口浏览网页的帖子中发过。 我修改了下,发给你吧。 不知道为什么,监测不到IE的ondragstart事件
具体资料你可以搜索
张硕(CathyEagle)的专栏 《Internet Explorer 编程简述》系列


#include "GUIConstantsEx.au3"
#include <IE.au3>
#include <Misc.au3>
#include <WinAPI.au3>
#include <array.au3>
Global Const $HandCursorID=0X0001001F
Global$Text,$Text2="",$URL = "http://www.baidu.com/" , $MyMsgboxTitleToStopNavigate="我测试下这个窗口标题弄的特殊点"
$dll                 = DllOpen("user32.dll")
$GUIMain        =GUICreate            ( "Event Test",       800,600 ,100,100)
$GUIEdit        =GUICtrlCreateEdit      ( "Test Log:" & @CRLF,10, 20, 780, 270)
$StateLab         = GUICtrlCreateLabel("Label1", 8, 288, 780, 17)

GUISetState ()
$oIE =ObjCreate("Shell.Explorer.2")
GUICtrlCreateObj($oIE,8, 320, 780, 320)
$EventObject=ObjEvent($oIE,"IEEvent_","DWebBrowserEvents")
if @error then exit Msgbox(0,"错误!","不可使用COM接口 'DWebBrowserEvents'. 错误代码: " & hex(@error,8))
$Timer = DllCallbackRegister("Timer", "int", "hwnd;uint;uint;dword")
$TimerDLL = DllCall($dll, "uint", "SetTimer", "hwnd", 0, "uint", 0, "int", 100, "ptr", DllCallbackGetPtr($Timer))
$oIE.Navigate( $URL )         
sleep(1000)            
GUISwitch ( $GUIMain )
While 1
    $msg = GUIGetMsg()
        If $msg = $GUI_EVENT_CLOSEThen
                        $EventObject.Stop   ; 不再接收事件
                        $EventObject=0      ; 关闭Event Object
                        $oIE=0            ; 清除内存
                        GUIDelete ()
                        DllCall($dll, "int", "KillTimer", "hwnd", 0, "uint", $TimerDLL) ;关闭定时器
                        DllCallbackFree($Timer);释放定时器句柄
                        DllClose($dll);关闭DLL
                        Exit
        EndIf
        If _IsPressed("1", $dll) And WinActive($GUIMain) Then      ;如果为鼠标按下
                WinSetOnTop($GUIMain,"",1)
                MsgBox(0,$MyMsgboxTitleToStopNavigate, "0",1,WinGetHandle("Program Manager"));弹出一个对话框,断下WBBrowser的Navigate事件
                WinSetOnTop($GUIMain,"",0)
                If $Text2<>""Then;如果获取的网址不为空
                        $temp=StringRegExp($Text2,"http:\/\/\S{1,100}",3);提取HTTP类超链接
                        ToolTip("你点击的链接是:"&$temp)
                        $oIE.Navigate( StringReplace($temp,"/...","") )   
                EndIf
        EndIf       

Wend

Func IEEvent_StatusTextChange($Text);这是获取状态栏改变
    If $Text<>'' And $Text<>'完成' And $Text<>'完毕' Then;如果找到的是空,完成, 完毕,则不写入到日志
                GUICtrlSetData ( $GUIEdit, "IE Status text changed to: " & $Text & @CRLF, "append" )
                GUICtrlSetData($StateLab,$Text)
                $Text2=$Text
        EndIf
EndFunc

Func IEEvent_BeforeNavigate($sUrl);这是劫持。 将百度劫持到搜狗。
        If StringInStr($sUrl,"baidu") Then
                $oIE.Navigate("www.sogou.com")
        Else
                $Text2=$Text
        EndIf
EndFunc


Func Timer($hWnd, $uiMsg, $idEvent, $dwTime)
        If WinExists($MyMsgboxTitleToStopNavigate) Then
                WinMove($MyMsgboxTitleToStopNavigate,"",@DesktopWidth,@DesktopHeight,0,0,1)
                Send("{Enter}")
        EndIf
EndFunc

zldfsz 发表于 2012-5-1 12:16:52

先研究一下,目前想到一个间接的解决办法

308513523 发表于 2012-5-1 12:50:48

{:face (411):}围观

sanmoking 发表于 2012-5-1 14:30:48

2楼的试了下,不是我想要的,我是说把其他浏览器的页面链接,拖到au3的窗口里。

lxz 发表于 2012-5-1 19:02:40

代码收下......

xms77 发表于 2012-5-1 20:05:36

回复 3# zldfsz
等待大师的间接解决方法

tryhi 发表于 2012-5-1 20:05:48

其实就是一个接收字符串的问题吧,这个问题以前找过一直没解决,像QQ聊天窗口里面拖一段文字到Word编辑界面一样

lanfengc 发表于 2012-5-1 20:22:15

回复 5# sanmoking


    你不会将这个脚本的$oIE对象替换成IEATTACT获取的吗

zldfsz 发表于 2012-5-1 22:06:25

不好意思,今天有事出去了。
大家这么围观搞得我鸭梨老大的,其实是绕过问题的方法,不过应该能达到楼主要的效果,再研究一会儿就可以发代码了

happytc 发表于 2012-5-1 22:31:47

一般浏览器都支持链接地址拖放,拖放到浏览器自身是新页面打开,拖放到系统桌面或文件夹,就是创建快捷方式 ...
sanmoking 发表于 2012-5-1 09:57 http://www.autoitx.com/images/common/back.gif

这不是默认的行为吗?

哈,第一次上论坛时,就看到这只跳舞的熊,印象很深地!


如上图,就是拖你的大头图和你那个‘论坛元老’到Edit 控件里


#include <GUIConstantsEx.au3>
#include <GuiRichEdit.au3>
#include <WindowsConstants.au3>
#Include <GuiScrollBars.au3>
#include <ScrollBarConstants.au3>

Opt("GUIOnEventMode", 1)

$hGui = GUICreate("Drag & Drop Test for EDIT Control", 600, 300, -1, -1, -1, $WS_EX_WINDOWEDGE + $WS_EX_TOPMOST)
GUISetOnEvent($GUI_EVENT_CLOSE, "ExitGui")
GUICtrlCreateLabel("Rich Text Field", 20, 20)
GUICtrlCreateLabel("Drag and drop link into the rich field ... ", 20, 250, 550, -1)
GUICtrlSetFont(-1, 11, 400, -1, "Arial")

$RichEdit = _GUICtrlRichEdit_Create($hGui, "", 20, 40, 550, 200, BitOR($ES_WANTRETURN, $ES_MULTILINE, $WS_VSCROLL))
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
_GUIScrollBars_ShowScrollBar($RichEdit, $SB_VERT, True)



GUISetState(@SW_SHOW, $hGui)

While True
        Sleep(50)
WEnd

Func ExitGui()
    _GUICtrlRichEdit_Destroy($RichEdit)
    Exit
EndFunc

happytc 发表于 2012-5-1 23:08:06

倒是以前别人问到个问题:用au3建的富文本框,选择里面的一些文字,拖到别的程序里,如何在富文本框里也保留这些文字(就是象Word一样,从Word拖文字到别的程序里,Word的文字还在的),我还研究了半天才搞定呢!

有兴趣地可以扩展研究微软的如下两个链接,关于各种拖拽效果都可以达到:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms690076(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/bb774319(v=vs.85).aspx

zldfsz 发表于 2012-5-1 23:25:18

我的另类方法

#include <GUIConstantsEx.au3>
$title = "测试"
$Form1 = GUICreate($title, 500, 100, -1, -1)
$Label1 = GUICtrlCreateLabel("URL地址", 3, 30, 45, 20)
$Label2 = GUICtrlCreateLabel("名   称", 3, 60, 45, 20)
$Input1 = GUICtrlCreateInput("请将链接拖放到右边空白区域", 50, 30, 300, 20)
$Input2 = GUICtrlCreateInput("", 50, 60, 300, 20)
$oIE = ObjCreate("Shell.Explorer.2")
$GUIActiveX = GUICtrlCreateObj($oIE, 400, -200, 100, 300)
GUISetState()
$dir = @TempDir & "\geturl"
DirCreate($dir)
FileDelete($dir & "\*.*")
$oIE.navigate($dir)
While 1
        If GUIGetMsg() = -3 Then Exit
        Local $hSearch = FileFindFirstFile($dir & "\*.*")
        If $hSearch = -1 Then
                FileClose($hSearch)
                ContinueLoop
        EndIf
        While 1
                Local $sFile = FileFindNextFile($hSearch)
                If @error Then ExitLoop
                If StringRight($sFile, 4) = ".url" Then
                        GUICtrlSetData($Input1, IniRead($dir & "\" & $sFile, "InternetShortcut", "URL", ""))
                        GUICtrlSetData($Input2, StringTrimRight($sFile, 4))
                        DirRemove($dir, 1)
                        DirCreate($dir)
                Else
                        DirRemove($dir, 1)
                        DirCreate($dir)
                EndIf
        WEnd
        FileClose($hSearch)
        Sleep(100)
WEnd

happytc 发表于 2012-5-1 23:44:18

我的另类方法
zldfsz 发表于 2012-5-1 23:25 http://www.autoitx.com/images/common/back.gif


    不行,这种是反习惯的。
一般人都会直接拖进Edit控件里,不会拖到什么‘空白’处

你再改进下你的‘另类方法’

zldfsz 发表于 2012-5-2 00:00:11

不行,这种是反习惯的。
一般人都会直接拖进Edit控件里,不会拖到什么‘空白’处

你再改进下 ...
happytc 发表于 2012-5-1 15:44 http://www.autoitx.com/images/common/back.gif

这与其采用的方法有关,最多加上提示和禁用输入控件
页: [1] 2 3 4
查看完整版本: au3的gui如何接受浏览器拖放过来的链接地址【已解决】