找回密码
 加入
搜索
查看: 22752|回复: 59

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

 火... [复制链接]
发表于 2012-5-1 09:57:38 | 显示全部楼层 |阅读模式
本帖最后由 sanmoking 于 2012-5-4 10:56 编辑

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

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

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

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

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


再次感谢大家的帮助,我再研究研究。
发表于 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_CLOSE  Then
                        $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[0])
                        $oIE.Navigate( StringReplace($temp[0],"/...","") )     
                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

评分

参与人数 1金钱 +35 贡献 +5 收起 理由
sanmoking + 35 + 5 多谢,不过不太对症。

查看全部评分

发表于 2012-5-1 12:16:52 | 显示全部楼层
先研究一下,目前想到一个间接的解决办法

评分

参与人数 1金钱 +22 收起 理由
sanmoking + 22 等大师研究结果,谢谢

查看全部评分

发表于 2012-5-1 12:50:48 | 显示全部楼层
  围观

评分

参与人数 1金钱 -20 贡献 -1 收起 理由
afan -20 -1

查看全部评分

 楼主| 发表于 2012-5-1 14:30:48 | 显示全部楼层
2楼的试了下,不是我想要的,我是说把其他浏览器的页面链接,拖到au3的窗口里。
发表于 2012-5-1 19:02:40 | 显示全部楼层
代码收下......
发表于 2012-5-1 20:05:36 | 显示全部楼层
回复 3# zldfsz
等待大师的间接解决方法
发表于 2012-5-1 20:05:48 | 显示全部楼层
其实就是一个接收字符串的问题吧,这个问题以前找过一直没解决,像QQ聊天窗口里面拖一段文字到Word编辑界面一样
发表于 2012-5-1 20:22:15 | 显示全部楼层
回复 5# sanmoking


    你不会将这个脚本的$oIE对象替换成IEATTACT获取的吗
发表于 2012-5-1 22:06:25 | 显示全部楼层
不好意思,今天有事出去了。
大家这么围观搞得我鸭梨老大的,其实是绕过问题的方法,不过应该能达到楼主要的效果,再研究一会儿就可以发代码了
发表于 2012-5-1 22:31:47 | 显示全部楼层
一般浏览器都支持链接地址拖放,拖放到浏览器自身是新页面打开,拖放到系统桌面或文件夹,就是创建快捷方式 ...
sanmoking 发表于 2012-5-1 09:57


这不是默认的行为吗?

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


如上图,就是拖你的大头图和你那个‘论坛元老’到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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 5金钱 +131 贡献 +27 收起 理由
tryhi + 30 + 10
user3000 + 10 + 2 学习了!
sanmoking + 21 + 5
502762378 + 20 + 5 惭愧。。
zldfsz + 50 学习了

查看全部评分

发表于 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
发表于 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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1金钱 +22 收起 理由
sanmoking + 22

查看全部评分

发表于 2012-5-1 23:44:18 | 显示全部楼层
我的另类方法
zldfsz 发表于 2012-5-1 23:25



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

你再改进下你的‘另类方法’
发表于 2012-5-2 00:00:11 | 显示全部楼层
不行,这种是反习惯的。
一般人都会直接拖进Edit控件里,不会拖到什么‘空白’处

你再改进下 ...
happytc 发表于 2012-5-1 15:44


这与其采用的方法有关,最多加上提示和禁用输入控件
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-27 08:40 , Processed in 0.088264 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表