即使您不了解AutoIt,您也可能对此问题有一些了解,因为AutoIt不是一种完全独特的语言。它是一种语言,可以轻松访问窗口的dll。
我正在尝试使用AutoIt语言创建一个运行Windows Journal的程序,以便通过热键选择它的颜色。我已经完成了大部分脚本的工作。我现在正在为它制作一个GUI。我发现它确实使用imagelist
来显示颜色的图像。我想在我的GUI中使用那个精确的图像列表,以获得更加用户友好的外观。我的问题是我无法抓住并使用它。我也尝试过复制它,但无济于事。我想这可能是因为我的应用程序没有相应的权限来访问该程序的资源。
我的脚本就是这个(以及其中的许多变体):
$hWnd = ControlGetHandle("[CLASS:JournalApp]", "", 113) ;113 is the control ID for the color selecting toolbar
$hImageJS = _GUICtrlToolbar_GetImageList($hWnd)
$hImage = _GUIImageList_Duplicate($hImageJS)
ConsoleWrite(_GUIImageList_GetImageCount($hImage)&"<--count")
我知道有一个图片列表,因为我发现我从GUICtrlToolbar_GetButtonImage($hWnd, $cmdId)
获得了支持这个想法的回报。
我总是从imagecount
得到0。我尝试了各种方法,例如直接访问它,但无济于事。有什么想法/建议/意见吗?
有没有办法让一个窗口的程序访问另一个窗口程序的资源?是否有可以在kernel32 dll中设置的特殊权限或权限?
答案 0 :(得分:2)
很抱歉,你没有在AutoIt论坛上获得帮助,但你所做的远远超出了构成我们社区大部分的业余爱好者的程度。
从理论上讲,你是对的,在编程中一切皆有可能。
您无法访问数据,因为您是一个不同的流程。为此,您必须在另一个程序中创建一个内存块,添加一些代码并执行它。这个过程叫做注射。
注射过程相当简单,几乎是这些函数调用:_WinAPI_OpenProcess
,_MemVirtualAllocEx
,_WinAPI_WriteProcessMemory
,CreateRemoteThread
你必须自己编写包装器,_WinAPI_WaitForSingleObject
,_WinAPI_ReadProcessMemory
,_MemVirtualFreeEx
。
即使您已经完成了这项工作,您也无法将图像列表发送到新应用程序,您可以获取图标的句柄,然后将数据写入块内存,然后传回指针。
现在在论坛上搜索一下你知道你在找什么。有一些示例,例如this one和this one,在论坛中搜索CreateRemoteThread
,您将获得一些值得阅读的帖子。