即使您不了解 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 中设置的特殊权限或特权?
最佳答案
很抱歉,您没有在 AutoIt 论坛上获得帮助,但您所做的远远超出了我们社区大部分的业余编码人员的水平。
理论上你是对的,在编程中一切皆有可能。
你不能访问数据,因为你是一个不同的进程。为此,您必须在其他程序中创建一 block 内存,添加一些代码,然后执行它。该过程称为注入(inject)。
注入(inject)过程相当简单,几乎就是这些函数调用:_WinAPI_OpenProcess
、_MemVirtualAllocEx
、_WinAPI_WriteProcessMemory
、CreateRemoteThread
code> 您必须为 _WinAPI_WaitForSingleObject
、_WinAPI_ReadProcessMemory
、_MemVirtualFreeEx
编写自己的包装器。
即使完成了这些,您也不能只将图像列表发送到新应用程序,您可以获取图标的句柄,然后将数据写入内存块,然后然后传回指针。
在论坛中搜索一下,现在您知道自己在寻找什么了。有例子,比如 this one和 this one ,在论坛中搜索 CreateRemoteThread
,您将获得一些值得一读的话题。
祝你好运。如果我是你,我会找到一些方法来制作你自己的图像列表版本,而不是试图复制他们的。
关于windows - 访问另一个 Windows 应用程序资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17011592/