访问另一个窗口的应用程序的资源

即使你不知道AutoIt,你也可以对这个问题有一些很好的认识,因为AutoIt不是一个完全独特的语言。 这是一种可以方便地访问窗口dll的语言。

我正在尝试使用AutoIt语言使程序与Windows日志一起运行,以便通过热键select它的颜色。 我已经完成了大部分脚本并正在工作。 我现在正在为它做一个GUI。 我发现它确实使用图像列表显示颜色的图像。 我想在我的graphics用户界面中使用精确的图像列表,以获得更加人性化的外观。 我的问题是,我无法抓住它并使用它。 我试图复制它,也无济于事。 我认为这可能是由于我的应用程序没有适当的权限来访问该程序的资源。

我的脚本是这个(以及这个的许多变化):

 $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。 我已经尝试了各种方法,比如直接访问它并无济于事。 任何想法/build议/意见?

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

对不起,你没有在AutoIt论坛上获得帮助,但是你所做的远远超出了构成我们大部分社区的爱好者编码者的水平。

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

你不能访问数据,因为你是一个不同的过程。 要做到这一点,你必须在其他程序中创建一块内存,添加一些代码,然后执行它。 这个过程被称为注入。

注入过程相当简单,几乎这些函数调用: _WinAPI_OpenProcess_MemVirtualAllocEx_WinAPI_WriteProcessMemoryCreateRemoteThread你将不得不编写自己的包装, _WinAPI_WaitForSingleObject_WinAPI_ReadProcessMemory_MemVirtualFreeEx

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

现在做一些搜索论坛,你知道你在找什么。 有一些例子,像这个和这个一样 ,搜索论坛的CreateRemoteThread ,你会得到一些值得阅读的线程。

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