zoukankan      html  css  js  c++  java
  • C#调用Windows API函数,实现透明窗体 转

    这篇文章不是Windows Mobile的,而是Win32的。这篇文章主要介绍一下C#下如何调用Windows API函数,这里也想说一下,Windows Mobile编程不能把眼光只局限于手机,手机与PC端相结合的程序也是很有挑战力、很有市场的。所以,这也是我写这篇文章的原因之一。

            做Delphi的时候,实现窗体透明很简单,因为Delphi对Windows API的封装很好。不只对API函数封装的到位,对API函数所用到的参数封装的也很好。而.net没有对API函数进行封装,对API函数的参数就更没有封装了。调用API函数只能用Invoke的方式,参数也需要我们自己进行相关定义。

    DesktopWinAPI.cs类文件,Invoke了窗体透明所需要的API函数:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;

    namespace DeviceAnywhereDesktop
    {
        class DesktopWinAPI
        {
            [DllImport("user32.dll")]
            public extern static IntPtr GetDesktopWindow();

            [DllImport("user32.dll")]
            public extern static bool SetLayeredWindowAttributes(IntPtr hwnd, uint crKey, byte bAlpha, uint dwFlags);
            public static uint  LWA_COLORKEY = 0x00000001;
            public static uint LWA_ALPHA = 0x00000002;

            [DllImport("user32.dll")]
            public extern static uint SetWindowLong(IntPtr hwnd, int nIndex, uint dwNewLong);
            [DllImport("user32.dll")]
            public extern static uint GetWindowLong(IntPtr hwnd, int nIndex);

            public enum WindowStyle : int
            {
                GWL_EXSTYLE = -20
            }

            public enum ExWindowStyle : uint
            {
                WS_EX_LAYERED = 0x00080000
            }

        }
    }

    DeviceForm.cs单元是API函数的调用方式:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace DeviceAnywhereDesktop
    {
        public partial class DeviceForm : Form
        {
            public DeviceForm()
            {
                InitializeComponent();
            }

            protected override CreateParams CreateParams
            {
                get
                {
                    CreateParams cp = base.CreateParams;

                    cp.Parent = DesktopWinAPI.GetDesktopWindow();
                    cp.ExStyle = 0x00000080 | 0x00000008;//WS_EX_TOOLWINDOW | WS_EX_TOPMOST

                    return cp;
                }
            }

            private void SetWindowTransparent(byte bAlpha)
            {
                try
                {
                    DesktopWinAPI.SetWindowLong(this.Handle, (int)DesktopWinAPI.WindowStyle.GWL_EXSTYLE,
                        DesktopWinAPI.GetWindowLong(this.Handle, (int)DesktopWinAPI.WindowStyle.GWL_EXSTYLE) | (uint)DesktopWinAPI.ExWindowStyle.WS_EX_LAYERED);

                    DesktopWinAPI.SetLayeredWindowAttributes(this.Handle, 0, bAlpha, DesktopWinAPI.LWA_COLORKEY | DesktopWinAPI.LWA_ALPHA);
                }
                catch
                {
                }
            }
           

            private void DeviceForm_Load(object sender, EventArgs e)
            {
                this.SetWindowTransparent(100);
            }
        }
    }

  • 相关阅读:
    Linux学习记录(四):Shell脚本
    Linux学习记录(三):Vim
    基于PyTorch构建神经网络
    Python开发【第一篇】:初识Python
    asyncio 并发编程(二)
    asyncio 并发编程(一)
    Linux 文件和目录操作命令(一)
    Django Model
    Django 之 Form 组件
    Django 模板系统
  • 原文地址:https://www.cnblogs.com/Ontheway/p/967310.html
Copyright © 2011-2022 走看看