#IfWinActive, ahk_exe explorer.exe ; only for explorer
^sc07B::
selected = % Explorer_GetSelection() ; get currently selected item in explorer as source ;*[test]
FileGetAttrib, attrselected, %selected% ; get attributes of selected item
; check if source & target exist, are not equal, and target is a folder
if selected and clipboard and selected != clipboard and InStr("%attrselected%", "D")
{
Loop, parse, clipboard, `n, `r
FileMove, %A_LoopField%, %selected%
}
Explorer_GetSelection() {
WinGetClass, winClass, % "ahk_id" . hWnd := WinExist("A")
if !(winClass ~= "(Cabinet|Explore)WClass")
Return
for window in ComObjCreate("Shell.Application").Windows
if (hWnd = window.HWND) && (oShellFolderView := window.document)
break
for item in oShellFolderView.SelectedItems
result .= (result = "" ? "" : "`n") . item.path
if !result
result := oShellFolderView.Folder.Self.Path
Return result
}
执行上述代码时,显示错误0x80004005。
Error:0x80004005
Source:(null)
Description:(null)
HelpFile:(null)
HelpContext:(null)
Specifically:HWND
然后按 Y 键,它就会按预期工作。
Q1. 如何避免显示0x80004005错误?
Q2.为什么这个错误昨天没有出现,今天却出现了?
上述代码是对“如何在 Windows 10 中使用“Ctrl”键和“V”将“粘贴”到鼠标选择的目录而不是当前目录?“。
^v:: → ^sc07B::
文件复制 → 文件移动
后记。
以下几个地方可能会出现异常(也可能不出现异常),我想查看异常内容e,但是没有显示出来,有什么办法可以修改代码吗?
Try ; Attempts to execute code.
{
for window in ComObjCreate("Shell.Application").Windows
if (hWnd = window.HWND) && (oShellFolderView := window.document)
break
}
Catch e ; Handles the first error/exception raised by the block above.
{
MsgBox, An exception was thrown!`nSpecifically: %e%
Exit
}
MsgBox 的结果,抛出了异常!具体来说:%hWnd%
0x421d12
MsgBox 的结果,抛出了异常!具体来说:%window.HWND%
以下变量名包含非法字符“window.HWND”
答案1
在这种情况下无法说出实现它的具体方法,但猜测它应该有帮助:https://www.autohotkey.com/docs/commands/Try.htm
答案2
我是 Sage7,今天在我的第一次 Com 测试中遇到了类似的问题。我终于解决了它。
这似乎是由 ComObjCreate 或 autohotkey 内部 32 位 iExploer32.exe 的限制造成的,它们无法加载超过总 4GB 内存。设法不要访问太多的 iExploer32(或窗口)
解决的方法,杀死进程树中最顶层的父进程iExploer.exe