拥有打开的应用程序的窗口句柄,我可以使用GetWindowText函数从应用程序的标题栏中检索文本.我想更进一步,并检索与同一个应用程序关联的图标.
我该怎么做呢?我查看了我认为相关的Win32 API部分,但没有任何内容跳出来.
任何指针将不胜感激.
提前致谢!
Icon ico = Icon.ExtractAssociatedIcon(theProcess.MainModule.FileName);
来自TheSoftwareJedi
最初这似乎是一个完全重复的如何从可执行文件中获取图标只有C#中的进程的实例,但是那个人似乎主要关注如何从它自己的内部获取它,而你可能是询问如何使用与正在运行的进程分开的程序获取图标.
-亚当
您可以执行以下操作:
[DllImport("user32.dll")] static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); [DllImport("user32.dll")] static extern IntPtr LoadIcon(IntPtr hInstance, IntPtr lpIconName); [DllImport("user32.dll", EntryPoint = "GetClassLong")] static extern uint GetClassLong32(IntPtr hWnd, int nIndex); [DllImport("user32.dll", EntryPoint = "GetClassLongPtr")] static extern IntPtr GetClassLong64(IntPtr hWnd, int nIndex); ////// 64 bit version maybe loses significant 64-bit specific information /// static IntPtr GetClassLongPtr(IntPtr hWnd, int nIndex) { if (IntPtr.Size == 4) return new IntPtr((long)GetClassLong32(hWnd, nIndex)); else return GetClassLong64(hWnd, nIndex); } uint WM_GETICON = 0x007f; IntPtr ICON_SMALL2 = new IntPtr(2); IntPtr IDI_APPLICATION = new IntPtr(0x7F00); int GCL_HICON = -14; public static Image GetSmallWindowIcon(IntPtr hWnd) { try { IntPtr hIcon = default(IntPtr); hIcon = SendMessage(hWnd, WM_GETICON, ICON_SMALL2, IntPtr.Zero); if (hIcon == IntPtr.Zero) hIcon = GetClassLongPtr(hWnd, GCL_HICON); if (hIcon == IntPtr.Zero) hIcon = LoadIcon(IntPtr.Zero, (IntPtr)0x7F00/*IDI_APPLICATION*/); if (hIcon != IntPtr.Zero) return new Bitmap(Icon.FromHandle(hIcon).ToBitmap(), 16, 16); else return null; } catch (Exception) { return null; } }
此代码检索小窗口图标,该图标显示在标题栏中的窗口文本旁边.