为何存在"内存不能写"而脚本死掉[已解决]
本帖最后由 happytc 于 2011-1-21 19:05 编辑如图所示,是运行:DllCall("user32.dll", "int", "SendMessage", "hwnd", $hwd , "int" , 1075 , "int", 509)
而死掉的,其中509是Total Commander中的解压命令。完整代码如下,我一按Alt+F6后,au3脚本就死掉,出来如图的提示HotKeySet("!{F6}", "TCUnpackSameDir")
While 1
Sleep(100)
WEnd
Func TCUnpackSameDir()
Local $TCclass2, $TCControl2, $TCControl3, $Flag1, $Flag2
$TCclass2 = ""
$TCControl2 = "TCheckBox1"
$TCControl3 = "TButton4"
$hwd = WinGetHandle("")
DllCall("user32.dll", "int", "SendMessage", "hwnd", $hwd , "int" , 1075 , "int", 509)
If WinWaitActive($TCclass2) Then
ControlSend($TCclass2, "", "TAltEdit1", "{DEL}")
ControlCommand($TCclass2, "", $TCControl2, "Check")
ControlCommand($TCclass2, "", $TCControl3, "Check")
EndIf
EndFunc
忘了传图了,如上图所示。
奇怪的是,同样的应用,ahk一点问题都没有,其代码如下:
$!F6::
IfWinActive ahk_class TTOTAL_CMD
{
PostMessage, 1075, 509
WinWaitActive, ahk_class TDLGUNZIPALL
Send, {Del}
Control, Check, , TCheckBox1
Send, {Enter}
}
else
Send !{F6}
return 本帖最后由 happytc 于 2011-1-11 09:58 编辑
另外,我把上面au3代码中,把那行DLLCall()的换成:ControlSend($TCclass2, "", "Edit1", "cm_UnpackFiles"),别的一点不变,就一点问题没有了,难道是au3的DLLCall有bug?
神奇的是我重启机子后,第一次用,不会死,并且还会解压。再用就死掉,跳出上图了 POSTMessage 与 SendMessage 是两个不同的函数,区分清楚的话,应该就没问题了。
我猜测是TC在收到消息后,还没处理完你就再用AU3给他第二个消息。
至于崩溃这个问题是Sendmessage的问题还是Au3的问题就不清楚了。 谢谢republican你的回复
上面只是给个例子,不关是SendMessage或PostMessage的事,因用Postmessage一样会死掉,就是上面的换成:
DllCall("user32.dll", "int", "PostMessage", "hwnd", $hwd , "int" , 1075 , "int", 509)
一样会出现脚本死掉,如下图
同样,在ahk里,达到同样的功能,不管是用Postmessage还是Sendmessage都没有问题
为什么在au3里一用就死掉呢??这个问题困惑了我好久了。希望有大侠可以解惑一下 明显是SendMessage的参数用错了
函数原形:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);再对照下你自己的. 回复 7# ceoguang
winAPI的Sendmessage是四个参数,这个我知道,只是看了au3的DLLCall原型,其后面的参数都是用中括号括起来的,说明可以忽略,再则以前是用ahk的,也都是这样忽略后面的lParam参数了,所以误解以为au3里也是这样可以用呢。原来au3里,必须把winAPI里的函数参数写全了才不会出问题。
也就是上面的必须这样才能正确在au3里用:
DllCall("user32.dll", "int", "PostMessage", "hwnd", $hwd , "int" , 1075 , "int", 509, "int", "")
其中的1075是:WM_USER+51 ....
看来你还是没了解.
那就用封装好的自定义函数吧._SendMessage($hWnd, 1075, 509) ....
看来你还是没了解.
那就用封装好的自定义函数吧.
ceoguang 发表于 2011-1-12 22:30 http://www.autoitx.com/images/common/back.gif
若我没有理解,能不能麻烦您把出问题这句:DllCall("user32.dll", "int", "SendMessage", "hwnd", $hwd , "int" , 1075 , "int", 509)改成可以用的DLLCall调用形式吧。我想有了例子,应该更容易理解了。我不用封装的,这里举Sendmessage只是为了说明DLLCall函数应用来的个例子,平时还需要调用大量的winAPI的函数。
页:
[1]