2009-08-13 6 views
2

私はすべてのウィンドウの透明度を設定しようとしています。私は次のコードを持っています。C#でそのハンドルでウィンドウの透明度を設定することはできませんか?

public partial class Form1 : Form 
{ 
    [DllImport("user32.dll")] 
    static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); 

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

    [DllImport("user32.dll")] 
    static extern bool SetLayeredWindowAttributes(IntPtr hwnd, uint crKey, byte bAlpha, uint dwFlags); 

    public const int GWL_EXSTYLE = -20; 
    public const int WS_EX_LAYERED = 0x80000; 
    public const int LWA_ALPHA = 0x2; 

    public Form1() 
    { 
     InitializeComponent(); 
     this.Load += new EventHandler(Form1_Load); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     Process[] processlist = Process.GetProcesses(); 

     foreach (Process theprocess in processlist) 
     { 
      SetWindowLong(theprocess.Handle, GWL_EXSTYLE, 
       GetWindowLong(theprocess.Handle, GWL_EXSTYLE)^WS_EX_LAYERED); 
      SetLayeredWindowAttributes(theprocess.Handle, 0, 128, LWA_ALPHA); 
     } 

    } 
} 

コードを実行すると何も起こりません。

何が間違っていますか?

答えて

5

SetWindowLongは、ウィンドウハンドル(hWnd)かかりますが、あなたの」代わりにプロセスハンドルを渡します。それを変更した後

theProcess.MainWindowHandle 

のすべてのインスタンスを変更 、それは私がそれをテストしたのWindows XPマシン上で働いていました。幸いにも、Visual Studio 2010ウィンドウは影響を受けませんでした。

+0

まさに私が望んでいたもの!ありがとう – Moon

1

the Opacityを試しましたか?

this.Opacity = 0.50; 
+2

これは、現在のウィンドウの不透明度を設定するだけです。これは彼が達成しようとしているものではありません。 – Thorarin

2

あなたのコードのこの部分:    ^ WS_EX_LAYERED  がWS_EX_LAYEREDビットを反転させ、

私はあなたがしたいと思う:    | WS_EX_LAYERED

関連する問題