您的位置:首页 > 其它

通过窗口句柄获取程序路径

2013-08-11 17:59 537 查看
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace WpfApplication1
{
class WindowListItem : DragItem
{
private TaskBarWindow taskBarWindow;
public WindowListItem(TaskBarWindow taskBarWindow)
{
InitializeComponent();
this.Content.Content = taskBarWindow.title;
this.taskBarWindow = taskBarWindow;
BitmapImage image = new BitmapImage(new Uri(@"F:\temp\b.png", UriKind.Absolute));
this.Icon.Source = GetIcon();

}

public override void onItemClick()
{
MainWindow.mainWindow.Hide();
Win32.ShowWindow(this.taskBarWindow.hwnd.ToInt32(), 9);
Win32.SetForegroundWindow(this.taskBarWindow.hwnd.ToInt32());
}

[DllImport("psapi.dll")]
static extern uint GetModuleFileNameEx(IntPtr hProcess, IntPtr hModule, [Out] StringBuilder lpBaseName, [In] [MarshalAs(UnmanagedType.U4)] int nSize);

[System.Runtime.InteropServices.DllImport("shell32.dll")]
private static extern int ExtractIconEx(string lpszFile, int niconIndex, IntPtr[] phiconLarge, IntPtr[] phiconSmall, int nIcons);

public static IntPtr getAppIconFromWindowHandle(IntPtr hwnd)
{
int pId = 0;
IntPtr pHandle = IntPtr.Zero;
Win32.GetWindowThreadProcessId(hwnd, ref pId);
pHandle = Win32.OpenProcess(1040, 0, pId);
StringBuilder sb = new StringBuilder(512);
GetModuleFileNameEx(pHandle, IntPtr.Zero, sb, 512);
Win32.CloseHandle(pHandle);

IntPtr[] largeIcons, smallIcons ;
int IconCount = ExtractIconEx(sb.ToString(), -1, null, null, 0);
largeIcons = new IntPtr[IconCount];
smallIcons = new IntPtr[IconCount];
ExtractIconEx(sb.ToString(), 0, largeIcons, smallIcons, IconCount);

if (largeIcons.Length > 0)
{
return largeIcons[0];
}
else
{
return IntPtr.Zero;
}
}

public ImageSource GetIcon()
{
IntPtr icon = new IntPtr(0);
icon = getAppIconFromWindowHandle(this.taskBarWindow.hwnd);
if (icon != IntPtr.Zero)
{
return System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(
icon,
new Int32Rect(0, 0, 32, 32),
BitmapSizeOptions.FromEmptyOptions());
}
else
{
return null;
}
}

}
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace WpfApplication1
{
public class Win32
{
[DllImport("user32.dll", EntryPoint = "GetClassName")]
public static extern int GetClassName(int hwnd, StringBuilder lpClassName, int nMaxCount);

[DllImport("user32.dll", EntryPoint = "GetWindow")]
public static extern int GetWindow(int hwnd, int uCmd);

[DllImport("user32.dll", EntryPoint = "GetWindowLong")]
public static extern long GetWindowLong(int hwnd, int nIndex);

[DllImport("user32.dll", EntryPoint = "IsWindowVisible")]
public static extern bool IsWindowVisible(int hwnd);

[DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]
public static extern bool SetForegroundWindow(int hwnd);

[DllImport("user32.dll", EntryPoint = "ShowWindow")]
public static extern bool ShowWindow(int hwnd, int nCmdShow);

[DllImport("user32.dll", EntryPoint = "GetWindowText")]
public static extern int GetWindowText(int hwnd, StringBuilder lpString, int cch);

public delegate bool EnumWindowsProc(int hWnd, int lParam);

[DllImport("user32.dll")]
public static extern int EnumWindows(EnumWindowsProc ewp, int lParam);

public const int PROCESS_ALL_ACCESS = 0x000F0000 | 0x00100000 | 0xFFF;
[DllImport("User32.dll")]
public extern static int GetWindowThreadProcessId(IntPtr hWnd, ref int lpdwProcessId);
[DllImport("Kernel32.dll")]
public extern static IntPtr OpenProcess(int fdwAccess, int fInherit, int IDProcess);
[DllImport("Kernel32.dll")]
public extern static bool TerminateProcess(IntPtr hProcess, int uExitCode);
[DllImport("Kernel32.dll")]
public extern static bool CloseHandle(IntPtr hObject);
[DllImport("Kernel32.dll", EntryPoint = "GetModuleFileName")]
public static extern uint GetModuleFileName(IntPtr hModule, [Out] StringBuilder lpszFileName, int nSize);
[DllImport("SHELL32.DLL", CharSet = CharSet.Auto)]
public static extern int ExtractIconEx(string lpszFile, int nIconIndex, IntPtr phiconLarge, IntPtr phiconSmall, int nIcons);

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: