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);
            }
        }
    }

  • 相关阅读:
    Mac上的USB存储设备使用痕迹在新版操作系统有所变化
    Beware of the encrypted VM
    A barrier for Mobile Forensics
    Second Space could let suspect play two different roles easily
    Take advantage of Checkra1n to Jailbreak iDevice for App analysis
    Find out "Who" and "Where"
    Where is the clone one and how to extract it?
    Downgrade extraction on phones running Android 7/8/9
    高版本安卓手机的取证未来
    How to extract WeChat chat messages from a smartphone running Android 7.x or above
  • 原文地址:https://www.cnblogs.com/Ontheway/p/967310.html
Copyright © 2011-2022 走看看