1

即使您不了解 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. 我尝试了各种方法,例如直接访问它,但无济于事。有什么想法/建议/意见吗?

有没有办法让一个窗口的程序访问另一个窗口程序的资源?是否可以在 kernel32 dll 中设置特殊权限或特权?

4

1 回答 1

2

很抱歉,您没有在 AutoIt 论坛上获得帮助,但您所做的远远超出了业余爱好者的水平,他们构成了我们社区的大部分。

理论上你是对的,在编程中一切皆有可能。

您无法访问数据,因为您是不同的进程。为此,您必须在另一个程序中创建一块内存,添加一些代码并执行它。该过程称为注入。

注入的过程相当简单,几乎就是这些函数调用:_WinAPI_OpenProcess, _MemVirtualAllocEx, _WinAPI_WriteProcessMemory,CreateRemoteThread你必须为, _WinAPI_WaitForSingleObject, _WinAPI_ReadProcessMemory,编写自己的包装器_MemVirtualFreeEx

即使你这样做了,你也不能只将图像列表发送到新应用程序,你可以获取图标的句柄,然后将数据写入内存块,然后传递指针背部。

现在您知道自己在寻找什么,请在论坛上进行一些搜索。有一些例子,比如这个这个,搜索论坛CreateRemoteThread,你会得到一些值得一读的主题。

祝你好运。如果我是你,我会找到一些方法来制作你自己的图像列表版本,而不是试图复制他们的。

于 2013-06-14T23:55:49.820 回答