au3的gui如何接受浏览器拖放过来的链接地址【已解决】
本帖最后由 sanmoking 于 2012-5-4 10:56 编辑一般浏览器都支持链接地址拖放,拖放到浏览器自身是新页面打开,拖放到系统桌面或文件夹,就是创建快捷方式,拖放到其他程序有另外的作用,比如迅雷,就新建下载……
总之肯定是有接收的方法的,au3我只知道能接收文件文件夹,这种链接网址什么的还不会,过路的高人,大婶们发发慈悲,万分感激。。我目前需要把接收到的地址显示在input里面。
多谢各位的帮助,测试了几位的代码,简单反馈一下:
2楼【疯子】的代码,跟我现在要用的效果不是很合适,不过也见识了au3的前景,以后可以用到其他地方。
13楼【大师】的代码,如果纯创建个控件来提示拖入,效果到还是挺好的,不过有点反人类,平常只有创建个放大镜图标什么的提示拖出去的用法。
我尝试把这个ObjCreate("Shell.Explorer.2")扩展到窗口全部,整个窗口都有拖入功能了,但是上面的输入控件,按钮控件的显示要想处理好比较麻烦,得不偿失。
11楼【happytc】的代码,是比较接近我想要的,不过一般这种拖入链接最好用input,富文本框会自动换行,不好,还没研究不自动换行的参数,另外富文本框图片、文字什么的我一选都能拖入,不好,我只需要超链接。框里已经有内容的,我在拖入新的进去需要替换掉旧的,要求不能共存。。。
再次感谢大家的帮助,我再研究研究。
曲线救国解决获取浏览器点击网址
本帖最后由 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
先研究一下,目前想到一个间接的解决办法 {:face (411):}围观 2楼的试了下,不是我想要的,我是说把其他浏览器的页面链接,拖到au3的窗口里。 代码收下...... 回复 3# zldfsz
等待大师的间接解决方法 其实就是一个接收字符串的问题吧,这个问题以前找过一直没解决,像QQ聊天窗口里面拖一段文字到Word编辑界面一样 回复 5# sanmoking
你不会将这个脚本的$oIE对象替换成IEATTACT获取的吗 不好意思,今天有事出去了。
大家这么围观搞得我鸭梨老大的,其实是绕过问题的方法,不过应该能达到楼主要的效果,再研究一会儿就可以发代码了 一般浏览器都支持链接地址拖放,拖放到浏览器自身是新页面打开,拖放到系统桌面或文件夹,就是创建快捷方式 ...
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
倒是以前别人问到个问题:用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 我的另类方法
#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
我的另类方法
zldfsz 发表于 2012-5-1 23:25 http://www.autoitx.com/images/common/back.gif
不行,这种是反习惯的。
一般人都会直接拖进Edit控件里,不会拖到什么‘空白’处
你再改进下你的‘另类方法’ 不行,这种是反习惯的。
一般人都会直接拖进Edit控件里,不会拖到什么‘空白’处
你再改进下 ...
happytc 发表于 2012-5-1 15:44 http://www.autoitx.com/images/common/back.gif
这与其采用的方法有关,最多加上提示和禁用输入控件