我有一个代码,列出了win32框中正在运行的应用程序,然后显示他们的图标。
到目前为止一切顺利,我得到应用程序的hwnd,然后调用GetClassLong(hwnd,GCL_HICONSM),一切都很好。
但是java应用程序的情况很难处理,因为回答我的调用的过程是javaw.exe,而不是闪亮的pimpy java应用程序,谁有一个如此漂亮的图标......
我也试着GetWindowThreadProcessId,但是唉,这是返回的java的PID ......
有一种方法可以做到这一点,因为任务管理器(alt + tab)显示了好的图标。
答案 0 :(得分:5)
我回答了我自己的问题,感谢PhiLho让我走上了正确的轨道:来自Codeproject的一篇文章,其中有正确的算法来获取一个窗口图标(无论是否为java):
//首先,尝试:
SendMessageTimeout(WM_GETICON)
//如果找不到图标,请尝试
GetClassLong(GCL_HICONSM)
//如果仍然没有图标,请尝试
SendMessageTimeout(WM_WM_QUERYDRAGICON)
//如果仍然没有图标,则注定要失败,返回错误或无效图标
出于某种原因,java应用程序会回答第一个呼叫,但不会回应其他呼叫,这似乎是由javaw.exe处理的。
再次感谢PhiLho。
答案 1 :(得分:3)
嗯,可以这样做,因为Process Viewer有一个Show Applications按钮来执行该操作(即使主视图显示了Java的图标)。唉,这个免费软件不是开源的,所以它不会告诉它的秘密......: - (
Sysinternals'ProcMon不这样做,唉。
我会多挖一点......: - )
[编辑]如果GCL_HICON失败,MS KB文章和Code Project文章都建议使用WM_QUERYDRAGICON ...