WPF获取窗口句柄

.NET WinForm获取窗口句柄很方便,this.Handle搞定。

WPF就有些麻烦了,获取方法如下:

引入命名空间:using System.Windows.Interop;

获取方法:new WindowInteropHelper(this).Handle

this是个Window类的实例

 

1) 在窗体事件内获得句柄

private void Window_Loaded(object sender, RoutedEventArgs e)

{

          WindowInteropHelper wndHelper = new WindowInteropHelper(this);

          IntPtr  wpfHwnd=wndHelper.Handle;

}

 

2.修改窗体属性:窗体风格

private void Window_Loaded(object sender, RoutedEventArgs e)

{

     WindowInteropHelper wndHelper = new WindowInteropHelper(this);

    int exStyle = (int)GetWindowLong(wndHelper.Handle, (int)GetWindowLongFields.GWL_EXSTYLE);

     exStyle |= (int)ExtendedWindowStyles.WS_EX_TOOLWINDOW;

      SetWindowLong(wndHelper.Handle, (int)GetWindowLongFields.GWL_EXSTYLE, (IntPtr)exStyle);

}

 

函数定义:

    #region Window styles
   
[Flags]
   
public enum ExtendedWindowStyles
   
{
       
// ...
        WS_EX_TOOLWINDOW
= 0x00000080,
       
// ...
   
}

   
public enum GetWindowLongFields
   
{
       
// ...
        GWL_EXSTYLE
= (-20),
       
// ...
   
}

   
[DllImport("user32.dll")]
   
public static extern IntPtr GetWindowLong(IntPtr hWnd, int nIndex);

   
public static IntPtr SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong)
   
{
       
int error = 0;
       
IntPtr result = IntPtr.Zero;
       
// Win32 SetWindowLong doesn't clear error on success
       
SetLastError(0);

       
if (IntPtr.Size == 4)
       
{
           
// use SetWindowLong
           
Int32 tempResult = IntSetWindowLong(hWnd, nIndex, IntPtrToInt32(dwNewLong));
            error
= Marshal.GetLastWin32Error();
            result
= new IntPtr(tempResult);
       
}
       
else
       
{
           
// use SetWindowLongPtr
            result
= IntSetWindowLongPtr(hWnd, nIndex, dwNewLong);
            error
= Marshal.GetLastWin32Error();
       
}

       
if ((result == IntPtr.Zero) && (error != 0))
       
{
           
throw new System.ComponentModel.Win32Exception(error);
       
}

       
return result;
   
}

   
[DllImport("user32.dll", EntryPoint = "SetWindowLongPtr", SetLastError = true)]
   
private static extern IntPtr IntSetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong);

   
[DllImport("user32.dll", EntryPoint = "SetWindowLong", SetLastError = true)]
   
private static extern Int32 IntSetWindowLong(IntPtr hWnd, int nIndex, Int32 dwNewLong);

   
private static int IntPtrToInt32(IntPtr intPtr)
   
{
       
return unchecked((int)intPtr.ToInt64());
   
}

   
[DllImport("kernel32.dll", EntryPoint = "SetLastError")]
   
public static extern void SetLastError(int dwErrorCode);
   
#endregion

 

转载网址:http://stackoverflow.com/questions/357076/best-way-to-hide-a-window-from-the-alt-tab-program-switcher

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值