# encoding: ascii
# api: csharp
# title: Set-Opacity
# description: Like Set-Blur, except it runs on Windows XP … you know … without the blur
# version: 0.1
# type: class
# license: CC0
# x-poshcode-id: 1865
# x-archived: 2010-05-24T16:40:58
#
#
   #.Synopsis
   # Mess with the transparency and blur of the PowerShell window
   #.Parameter color
   # The color to treat as transparent (you can set this to your foreground or background for best effect, but you must pass an actual [Drawing.Color]
   #.Parameter opacity
   # On a scale of 0 to 255, how opaque to make the window (255 is no transparency, 0 is invisible)
   #.Parameter Off
   # If set, turns off the color and opacity settings
   #.Parameter Handle
   # The handle of the window to act on. Defaults to the current PowerShell window
   #.Example 
   # Set-Opacity -Color ([System.Drawing.Color]::FromArgb( 0xff, 1, 36, 86 ))
   #
   # Makes the PowerShell Blue color completely transparent
   #.Example 
   # Set-Opacity -Opacity 200
   #
   # Sets the window partly transparent
   param([byte]$opacity, [System.Drawing.Color]$color, [switch]$Off, [IntPtr]$handle = (ps -Id $pid).MainWindowHandle)
   

Add-Type -Type @"
using System;
using System.Runtime.InteropServices;
namespace Huddled {
   public class Opacity {
   
      [DllImport("user32.dll")]
      public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
      
      [DllImport("user32.dll", SetLastError=true)]
      public static extern int GetWindowLong(IntPtr hWnd, int nIndex);

      [DllImport("user32.dll")]
      public static extern bool SetLayeredWindowAttributes(IntPtr hwnd, uint crKey, byte bAlpha, uint dwFlags);
   }
   
   [StructLayout(LayoutKind.Sequential)]
   public struct ColorRef
   {
      public uint ColorDWORD;

      public static implicit operator uint(ColorRef cr) {
         return cr.ColorDWORD;
      }
      public static implicit operator ColorRef(uint crKey) {
         ColorRef cr = new ColorRef();
         cr.ColorDWORD = crKey;
         return cr;
      }
      
      public static implicit operator System.Drawing.Color(ColorRef cr){
         return System.Drawing.Color.FromArgb((int)(0x000000FFU & cr.ColorDWORD), (int)(0x0000FF00U & cr.ColorDWORD) >> 8, (int)(0x00FF0000U & cr.ColorDWORD) >> 16);
      }
      
      public static implicit operator ColorRef(System.Drawing.Color color){
         ColorRef cr = new ColorRef();
         cr.ColorDWORD = (uint)color.R + (((uint)color.G) << 8) + (((uint)color.B) << 16);
         return cr;
      }
   }
}
"@ -Ref System.Drawing

function global:Set-Opacity {
   #.Synopsis
   # Mess with the transparency and blur of the PowerShell window
   #.Parameter color
   # The color to treat as transparent (you can set this to your foreground or background for best effect, but you must pass an actual [Drawing.Color]
   #.Parameter opacity
   # On a scale of 0 to 255, how opaque to make the window (255 is no transparency, 0 is invisible)
   #.Parameter Off
   # If set, turns off the color and opacity settings
   #.Parameter Handle
   # The handle of the window to act on. Defaults to the current PowerShell window
   #.Example 
   # Set-Opacity -Color ([System.Drawing.Color]::FromArgb( 0xff, 1, 36, 86 ))
   #
   # Makes the PowerShell Blue color completely transparent
   #.Example 
   # Set-Opacity -Opacity 200
   #
   # Sets the window partly transparent
   param([byte]$opacity, [System.Drawing.Color]$color, [switch]$Off, [IntPtr]$handle = (ps -Id $pid).MainWindowHandle)
   
   if($Off) { 
      $style = [Huddled.Opacity]::GetWindowLong($handle, -20) -bor 0x80000 -bxor 0x80000
   } else {
      $style = [Huddled.Opacity]::GetWindowLong($handle, -20) -bor 0x80000      
   }
   $style = [Huddled.Opacity]::SetWindowLong($Handle, -20, $style);

   $flag = 0
   if($color) { $flag += 1 } else { $color = [System.Drawing.Color]::Black }
   if($opacity) { $flag += 2 } else { $opacity = 255 }
   
   $null = [Huddled.Opacity]::SetLayeredWindowAttributes($handle, ([uInt32][Huddled.ColorRef]$color), $opacity, $flag)
}

Set-Opacity @PSBoundParameters
