欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#?WPF使用GDI實(shí)現(xiàn)截屏功能

 更新時(shí)間:2024年03月14日 08:51:08   作者:CodeOfCC  
這篇文章主要為大家詳細(xì)介紹了C#?WPF如何使用GDI實(shí)現(xiàn)截屏功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下

前言

wpf截屏?xí)r通??梢圆捎胓di+,調(diào)用起來(lái)比較方便。使用gdi也能實(shí)現(xiàn)截屏,截屏數(shù)據(jù)也能轉(zhuǎn)成BitmapSource對(duì)象,當(dāng)然調(diào)用流程會(huì)復(fù)雜一些,而且需要引入win32方法,唯一比較容易的就是可以直接繪制異或鼠標(biāo)。

一、導(dǎo)入gdi32

方法一、NuGet獲取

這種方法好處是簡(jiǎn)單方便,缺點(diǎn)是增加了依賴dll,生成的程序容量大一些且附帶一些dll。

(1)、獲取gdi32

(2)、獲取user32

方法二、Dllimport

使用DllImport將需要的win32 api導(dǎo)入。這樣做工作量比較大,但是好處是無(wú)依賴,生成程序很小。

示例如下:

[DllImport(User32, SetLastError = false, ExactSpelling = true)]
public static extern IntPtr GetDC([In, Optional] IntPtr ptr);

完整的gdi需要導(dǎo)入的所有接口見(jiàn)附錄。

二、實(shí)現(xiàn)步驟

1、創(chuàng)建兼容DC

IntPtr srcHdc = IntPtr.Zero;
IntPtr dstHdc = IntPtr.Zero;
srcHdc = GetDC(hWnd);
dstHdc = CreateCompatibleDC(srcHdc);

2、創(chuàng)建位圖

BITMAPINFO bmi = new BITMAPINFO();
IntPtr hBitmap = IntPtr.Zero;
IntPtr oldBitmap = IntPtr.Zero;
bmi.bmiHeader.biSize = (uint)Marshal.SizeOf<BITMAPINFOHEADER>();
bmi.bmiHeader.biWidth = capWidth;
bmi.bmiHeader.biHeight = -capHeight;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 24;
bmi.bmiHeader.biCompression = BitmapCompressionMode.BI_RGB;
bmi.bmiHeader.biSizeImage = 0;
bmi.bmiHeader.biXPelsPerMeter = 0;
bmi.bmiHeader.biYPelsPerMeter = 0;
bmi.bmiHeader.biClrUsed = 0;
bmi.bmiHeader.biClrImportant = 0;
hBitmap = CreateDIBSection(dstHdc, in bmi, DIBColorMode.DIB_RGB_COLORS, out pvBits, IntPtr.Zero, 0);
oldBitmap = SelectObject(dstHdc, hBitmap);

3、獲取位圖信息

需要獲取位圖的行對(duì)齊stride

BITMAP bitmap;
temp = Marshal.AllocHGlobal(Marshal.SizeOf<BITMAP>());
if (GetObject(hBitmap, Marshal.SizeOf<BITMAP>(), temp) == 0)
{
    throw new Exception("GetObject Failed");
}
bitmap = Marshal.PtrToStructure<BITMAP>(temp);

4、BitBlt

BitBlt(dstHdc, capX, capY, capWidth, capHeight, srcHdc, capX, capY, RasterOperationMode.SRCCOPY | RasterOperationMode.CAPTUREBLT)

5、獲取數(shù)據(jù)

//行對(duì)齊
int stride=bitmap.bmWidthBytes;
//寬
int width=bitmap.bmWidth;
//高
int height=bitmap.bmHeight;
//位圖數(shù)據(jù)
IntPtr pBuffer=bitmap.bmBits;

BITMAP轉(zhuǎn)成WriteableBitmap(BitmapSource)

public static WriteableBitmap ToWriteableBitmap(this BITMAP bitmap)
{
    var wb = new WriteableBitmap(bitmap.bmWidth, bitmap.bmHeight, 0, 0, bitmap.bmBitsPixel == 32 ? PixelFormats.Bgra32 : PixelFormats.Bgr24, null);
    wb.WritePixels(new Int32Rect(0, 0, bitmap.bmWidth, bitmap.bmHeight), bitmap.bmBits, bitmap.bmHeight * bitmap.bmWidthBytes, bitmap.bmWidthBytes, 0, 0);
    return wb;
}

6、銷毀資源

if (dstHdc != IntPtr.Zero)
{
    if (oldBitmap != IntPtr.Zero)
    {
        var ret = SelectObject(dstHdc, oldBitmap);
        if (ret == IntPtr.Zero)
        {
            errors += "SelectObject Failed";
        }
    }
    if (!DeleteDC(dstHdc))
    {
        errors += "DeleteDC Failed";
    }
}
if (srcHdc != IntPtr.Zero)
{
    if (!ReleaseDC(hWnd, srcHdc))
    {
        errors += "ReleaseDC Failed";
    }
}
if (!DeleteObject(hBitmap))
{
    errors += "DeleteObject Failed";
}
if (temp != IntPtr.Zero) Marshal.FreeHGlobal(temp);

三、封裝成對(duì)象

/************************************************************************
* @Project:      GdiGrabber
* @Decription:  gdi圖片采集
* 可以根據(jù)提供的句柄采集圖片或者獲取快照。提供了采集區(qū)域提供了實(shí)際值和比例值
* 兩種接口。采集提供了同步和異步兩種方式,在主線程或者UI線程建議用異步,在非
* UI線程建議用同步。
* @Verision:      v1.0.0
* @Author:      Xin Nie
* @Create:      2024/03/13 23:57:00
* @LastUpdate:  2024/03/13 23:57:00
************************************************************************
* Copyright @ 2024. All rights reserved.
************************************************************************/
public static class GdiGrabber
{
    /// <summary>
    /// 快照
    /// </summary>
    /// <param name="x"></param>
    /// <param name="y"></param>
    /// <param name="width"></param>
    /// <param name="height"></param>
    /// <param name="hwnd"></param>
    /// <returns></returns>
    public static WriteableBitmap? Snapshot(int x, int y, int width, int height, nint hWnd = 0, bool isPaintMouse = true);
    /// <summary>
    /// 快照
    /// 按比例,在任意分辨率,比如0,0,1,1就是全屏。
    /// </summary>
    /// <param name="x">比例,0-1</param>
    /// <param name="y">比例,0-1</param>
    /// <param name="width">比例,0-1</param>
    /// <param name="height">比例,0-1</param>
    /// <param name="hwnd"></param>
    /// <returns></returns>
    public static WriteableBitmap? Snapshot(double x, double y, double width, double height, nint hWnd = 0, bool isPaintMouse = true);
    /// <summary>
    /// 采集,異步
    /// 按比例,在任意分辨率,比如0,0,1,1就是全屏。
    /// 用法 await foreach(var i in GdiGrabberCapture){}
    /// 注意,在UI線程可以直接使用。
    /// 在非UI線程需要確保Dispatcher的運(yùn)行,比如在線程最后調(diào)用Dispatcher.Run()、或 Dispatcher.PushFrame。
    /// </summary>
    /// <param name="x">比例,0-1</param>
    /// <param name="y">比例,0-1</param>
    /// <param name="width">比例,0-1</param>
    /// <param name="height">比例,0-1</param>
    /// <param name="hWnd">句柄,為0則采集桌面</param>
    /// <param name="isPaintMouse">是否繪制鼠標(biāo)</param>
    /// <returns>采集的數(shù)據(jù)對(duì)象</returns>
    public static IAsyncEnumerable<BITMAP> Capture(double x, double y, double width, double height, nint hWnd = 0, bool isPaintMouse = true);
    /// <summary>
    /// 采集,異步
    /// 用法 await foreach(var i in GdiGrabberCapture){}
    /// 注意,在UI線程可以直接使用。
    /// 在非UI線程需要確保Dispatcher的運(yùn)行,比如在線程最后調(diào)用Dispatcher.Run()、或 Dispatcher.PushFrame。
    /// </summary>
    /// <param name="x"></param>
    /// <param name="y"></param>
    /// <param name="width"></param>
    /// <param name="height"></param>
    /// <param name="hWnd">句柄,為0則采集桌面</param>
    /// <param name="isPaintMouse">是否繪制鼠標(biāo)</param>
    /// <returns>采集的數(shù)據(jù)對(duì)象</returns>
    /// <exception cref="Exception"></exception>
    public static async IAsyncEnumerable<BITMAP> Capture(int x, int y, int width, int height, nint hWnd = 0, bool isPaintMouse = true);
    public static /*IEnumerable<BITMAP>*/void CaptureSync(double x, double y, double width, double height, Func<BITMAP, bool> onGrab, nint hWnd = 0, bool isPaintMouse = true);
    /// <summary>
    /// 采集,同步
    /// </summary>
    /// <param name="x"></param>
    /// <param name="y"></param>
    /// <param name="width"></param>
    /// <param name="height"></param>
    /// <param name="hWnd">句柄,為0則采集桌面</param>
    /// <param name="isPaintMouse">是否繪制鼠標(biāo)</param>
    /// <param name="onGrab">采集回調(diào),返回是否繼續(xù)采集。之所以采用回調(diào)是因?yàn)?,更好的設(shè)計(jì)應(yīng)該是使用yeild return,但是會(huì)出現(xiàn)內(nèi)存異常讀寫(xiě)問(wèn)題,暫時(shí)無(wú)法解決。
    /// </param>
    /// <returns>采集的數(shù)據(jù)對(duì)象</returns>
    /// <exception cref="Exception"></exception>
    public static /*IEnumerable<BITMAP>*/void CaptureSync(int x, int y, int width, int height, Func<BITMAP, bool> onGrab, nint hWnd = 0, bool isPaintMouse = false);
       /// <summary>
    /// 將BITMAP轉(zhuǎn)換成WriteableBitmap
    /// 作者的設(shè)備測(cè)試此操作1080p耗時(shí)8ms
    /// </summary>
    /// <param name="bitmap">this</param>
    /// <returns>WriteableBitmap</returns>
    public static WriteableBitmap ToWirteableBitmap(this BITMAP bitmap);
    /// <summary>
    /// 將BITMAP數(shù)據(jù)拷貝到riteableBitmap
    /// 作者的設(shè)備測(cè)試此操作1080p耗時(shí)2ms
    /// </summary>
    /// <param name="bitmap">this</param>
    /// <param name="wb">WriteableBitmap</param>
    public static void CopyToWriteableBitmap(this BITMAP bitmap, WriteableBitmap wb);
}

四、完整代碼

vs2022 .net6.0 wpf項(xiàng)目,采用DllImport的方式無(wú)任何依賴。

之后上傳

五、使用示例

1、快照

(1)比例值區(qū)域截取

截取全屏(任意分辨率)

WriteableBitmap? wb=  GdiGrabber.Snapshot(0,0,1.0,1.0);

(2)實(shí)際值區(qū)域截取

WriteableBitmap? wb=  GdiGrabber.Snapshot(0,0,600,600);

(3)WPF中使用

WpfGdiGrabber.xaml

<Window x:Class="WpfGdiGrabber.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfGdiGrabber"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid  >
        <Image x:Name="img"></Image>
    </Grid>
</Window>

WpfGdiGrabber.cs

using AC;
using System.Windows;
using System.Windows.Media.Imaging;
namespace WpfGdiGrabber
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            WriteableBitmap? wb = GdiGrabber.Snapshot(0, 0, 1.0, 1.0);
        }
    }
}

效果預(yù)覽

2、采集

(1)、異步

UI線程使用

await foreach (var i in GdiGrabber.Capture(0, 0, 1.0, 1.0, 0))
{   
    //img為Image控件
    if (img.Source == null)
        img.Source = i.ToWriteableBitmap();
    else
        i.CopyToWriteableBitmapp(img.Source as WriteableBitmap);
}

非UI線程使用,需要啟動(dòng)一個(gè)Dispatcher用于調(diào)度消息以及阻塞線程避免結(jié)束。

new Thread(async () =>
    {
        bool isExit = false;
        var frame = new DispatcherFrame();
        var func = async () =>
        {
            //循環(huán)采集
            await foreach (var i in GdiGrabber.Capture(0, 0, 1.0, 1.0, 0))
            {
                //Dispatcher將操作切換到UI線程執(zhí)行
                Dispatcher.Invoke(() =>
                {
                    //WriteableBitmap是和線程綁定的,需要在UI線程創(chuàng)建此對(duì)象。
                    WriteableBitmap? wb = i.ToWriteableBitmap();
                });
                //退出采集
                if (isExit) break;
            }
            //退出消息循環(huán)
            frame.Continue = false;
        };
        func();
        //啟動(dòng)Dispatcher消息循環(huán),此行阻塞
        Dispatcher.PushFrame(frame);
    })
{ IsBackground = true }.Start();

(2)、同步

同步的方式會(huì)阻塞,建議在非UI線程中使用。但要注意WriteableBitmap 需要在UI線程中創(chuàng)建才能被控件使用。

GdiGrabber.CaptureSync(0, 0, 1.0, 1.0,  (bitmap) =>
{
    //獲取到WriteableBitmap對(duì)象
    WriteableBitmap wb = bitmap.ToWriteableBitmap();
    //返回true為繼續(xù)截屏,false為停止。
    return true;
});

(3)、WPF中使用(異步)

WpfGdiGrabber.xaml

<Window x:Class="WpfGdiGrabber.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfGdiGrabber"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid  >
        <Image x:Name="img"></Image>
    </Grid>
</Window>

WpfGdiGrabber.cs

using AC;
using System.Windows;
using System.Windows.Media.Imaging;
namespace WpfGdiGrabber
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Capture();
        }
        async void Capture()
        {
            await foreach (var i in GdiGrabber.Capture(0, 0, 1.0, 1.0, 0))
            {
                if (img.Source == null)
                    img.Source = i.ToWriteableBitmap();
                else
                    i.CopyToWriteableBitmap(img.Source as WriteableBitmap);
            }
        }
    }
}

效果預(yù)覽

總結(jié)

以上就是今天要講的內(nèi)容,本文實(shí)現(xiàn)了的GDI截屏與GDI+對(duì)比性能略差一些,但也是可以一定程度滿足使用,比如用來(lái)截屏或者制作放大鏡。而且有一個(gè)好處是可以做到無(wú)額外依賴。總的來(lái)說(shuō),可以作為一種備選方案或者測(cè)試方案。

附錄

DllImport

    [StructLayout(LayoutKind.Sequential)]
    public struct BITMAP
    {
        public int bmType;
        public int bmWidth;
        public int bmHeight;
        public int bmWidthBytes;
        public ushort bmPlanes;
        public ushort bmBitsPixel;
        public IntPtr bmBits;
    }

    class WinApiImport
    {
        const string Gdi32 = "gdi32.dll";
        const string User32 = "user32.dll";
        [StructLayout(LayoutKind.Sequential), Serializable]
        public struct POINT
        {
            public int X;
            public int Y;
        }
        [StructLayout(LayoutKind.Sequential), Serializable]
        public struct RECT
        {
            public int left;
            public int top;
            public int right;
            public int bottom;
        }

        [StructLayout(LayoutKind.Sequential, Size = 4)]
        public struct RGBQUAD
        {
            public byte rgbBlue;
            public byte rgbGreen;
            public byte rgbRed;
            public byte rgbReserved;
        }
        [StructLayout(LayoutKind.Sequential)]
        public struct BITMAPINFO
        {
            public BITMAPINFOHEADER bmiHeader;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
            public RGBQUAD[] bmiColors;
        }

        public enum BitmapCompressionMode : uint
        {
            BI_RGB = 0,
            BI_RLE8 = 1,
            BI_RLE4 = 2,
            BI_BITFIELDS = 3,
            BI_JPEG = 4,
            BI_PNG = 5
        }

        [StructLayout(LayoutKind.Sequential, Pack = 2)]
        public struct BITMAPINFOHEADER
        {
            public uint biSize;
            public int biWidth;
            public int biHeight;
            public ushort biPlanes;
            public ushort biBitCount;
            public BitmapCompressionMode biCompression;
            public uint biSizeImage;
            public int biXPelsPerMeter;
            public int biYPelsPerMeter;
            public uint biClrUsed;
            public uint biClrImportant;
        }

        public enum DIBColorMode : int
        {
            DIB_RGB_COLORS = 0,
            DIB_PAL_COLORS = 1
        }
        public enum CursorState
        {
            CURSOR_HIDDEN = 0,
            CURSOR_SHOWING = 0x00000001,
            CURSOR_SUPPRESSED = 0x00000002,
        }
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        public struct CURSORINFO
        {
            public uint cbSize;
            public CursorState flags;
            public IntPtr hCursor;
            public POINT ptScreenPos;
        }
        [StructLayout(LayoutKind.Sequential)]
        public sealed class ICONINFO
        {
            public bool fIcon;
            public int xHotspot;
            public int yHotspot;
            public IntPtr hbmMask;
            public IntPtr hbmColor;
        }
        public enum RasterOperationMode
        {
            SRCCOPY = 0x00CC0020,
            SRCPAINT = 0x00EE0086,
            SRCAND = 0x008800C6,
            SRCINVERT = 0x00660046,
            SRCERASE = 0x00440328,
            NOTSRCCOPY = 0x00330008,
            NOTSRCERASE = 0x001100A6,
            MERGECOPY = 0x00C000CA,
            MERGEPAINT = 0x00BB0226,
            PATCOPY = 0x00F00021,
            PATPAINT = 0x00FB0A09,
            PATINVERT = 0x005A0049,
            DSTINVERT = 0x00550009,
            BLACKNESS = 0x00000042,
            WHITENESS = 0x00FF0062,
            NOMIRRORBITMAP = -2147483648,
            CAPTUREBLT = 0x40000000
        }
        [DllImport(User32, CharSet = CharSet.Auto, ExactSpelling = true, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        [System.Security.SecurityCritical]
        public static extern bool GetClientRect(IntPtr hWnd, out RECT lpRect);
        [DllImport(User32, SetLastError = false, ExactSpelling = true)]
        public static extern IntPtr GetDesktopWindow();
        [DllImport(User32, SetLastError = false, ExactSpelling = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool ClientToScreen(IntPtr hWnd, ref POINT lpPoint);
        [DllImport(User32, SetLastError = false, ExactSpelling = true)]
        public static extern IntPtr GetDC([In, Optional] IntPtr ptr);
        [DllImport(Gdi32, ExactSpelling = true, SetLastError = true)]
        public static extern IntPtr CreateCompatibleDC([Optional] IntPtr hDC);
        [DllImport(Gdi32, SetLastError = false, ExactSpelling = true)]
        public static extern IntPtr CreateDIBSection([In, Optional] IntPtr hdc, in BITMAPINFO pbmi, DIBColorMode usage, out IntPtr ppvBits, [In, Optional] IntPtr hSection, [In, Optional] uint offset);
        [DllImport(Gdi32, SetLastError = false, CharSet = CharSet.Auto)]
        public static extern int GetObject(IntPtr hgdiobj, int cbBuffer, IntPtr lpvObject);
        [DllImport(Gdi32, ExactSpelling = true, SetLastError = true)]
        public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);
        [DllImport(Gdi32, ExactSpelling = true, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool BitBlt(IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, RasterOperationMode dwRop);
        [DllImport(Gdi32, ExactSpelling = true, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        [System.Security.SecurityCritical]
        public static extern bool DeleteDC(IntPtr hdc);
        [DllImport(User32, SetLastError = false, ExactSpelling = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDC);
        [DllImport(Gdi32, ExactSpelling = true, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool DeleteObject(IntPtr hObject);
        [DllImport(User32, SetLastError = true, ExactSpelling = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool GetCursorInfo(ref CURSORINFO pci);
        [DllImport(User32, SetLastError = true, ExactSpelling = true)]
        public static extern IntPtr CopyIcon(IntPtr hIcon);
        [DllImport(User32, SetLastError = true, ExactSpelling = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool GetIconInfo(IntPtr hIcon, [In, Out] ICONINFO piconinfo);
        [DllImport(User32, SetLastError = true, ExactSpelling = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool DrawIcon(IntPtr hDC, int X, int Y, IntPtr hIcon);
        [DllImport(User32, SetLastError = true, ExactSpelling = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool DestroyCursor(IntPtr hCursor);
        [DllImport(User32, SetLastError = true, CharSet = CharSet.Auto)]
        public static extern IntPtr LoadCursor(IntPtr hInstance, string lpCursorName);
    }

以上就是C# WPF使用GDI實(shí)現(xiàn)截屏功能的詳細(xì)內(nèi)容,更多關(guān)于C# WPF截屏的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C# 使用Free Spire.Presentation 實(shí)現(xiàn)對(duì)PPT插入、編輯、刪除表格

    C# 使用Free Spire.Presentation 實(shí)現(xiàn)對(duì)PPT插入、編輯、刪除表格

    小編發(fā)現(xiàn)使用.NET組件——Free Spire.Presentation,在C#中添加該產(chǎn)品DLL文件,可以簡(jiǎn)單快速地實(shí)現(xiàn)對(duì)演示文稿的表格插入、編輯和刪除等操作,具體實(shí)現(xiàn)代碼大家參考下本文吧
    2017-09-09
  • C#解析Lrc歌詞文件過(guò)程詳解

    C#解析Lrc歌詞文件過(guò)程詳解

    這篇文章主要為大家詳細(xì)介紹了C#解析Lrc歌詞文件過(guò)程,很有趣的解析過(guò)程,感興趣的小伙伴們可以參考一下
    2016-06-06
  • C#影院售票系統(tǒng)畢業(yè)設(shè)計(jì)(4)

    C#影院售票系統(tǒng)畢業(yè)設(shè)計(jì)(4)

    這篇文章主要介紹了C#影院售票系統(tǒng)畢業(yè)設(shè)計(jì),學(xué)習(xí)內(nèi)容是總結(jié)銷售信息的保存以及加載銷售信息,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2015-11-11
  • C#多線程系列之多線程鎖lock和Monitor

    C#多線程系列之多線程鎖lock和Monitor

    這篇文章介紹了C#多線程鎖lock和Monitor的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • C#調(diào)用EXE文件實(shí)現(xiàn)傳參和獲取返回結(jié)果

    C#調(diào)用EXE文件實(shí)現(xiàn)傳參和獲取返回結(jié)果

    本文主要介紹了C#調(diào)用EXE文件實(shí)現(xiàn)傳參和獲取返回結(jié)果,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • C#獲取任務(wù)欄顯示進(jìn)程的方法

    C#獲取任務(wù)欄顯示進(jìn)程的方法

    這篇文章主要介紹了C#獲取任務(wù)欄顯示進(jìn)程的方法,涉及C#針對(duì)進(jìn)程操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • C#串口通信實(shí)現(xiàn)方法

    C#串口通信實(shí)現(xiàn)方法

    這篇文章主要介紹了C#串口通信實(shí)現(xiàn)方法,詳細(xì)講述了C#串口通信所涉及的數(shù)據(jù)接收與發(fā)送方法,以及相關(guān)的線程調(diào)用方法,是非常典型的應(yīng)用,需要的朋友可以參考下
    2014-12-12
  • C# byte轉(zhuǎn)為有符號(hào)整數(shù)實(shí)例

    C# byte轉(zhuǎn)為有符號(hào)整數(shù)實(shí)例

    這篇文章主要介紹了C# byte轉(zhuǎn)為有符號(hào)整數(shù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • c# TreeView添加右鍵快鍵菜單有兩種方法

    c# TreeView添加右鍵快鍵菜單有兩種方法

    c# TreeView添加右鍵快鍵菜單有兩種方法,需要的朋友可以參考一下
    2013-04-04
  • C#中常使用進(jìn)度條的代碼

    C#中常使用進(jìn)度條的代碼

    C#中常使用進(jìn)度條的代碼...
    2007-03-03

最新評(píng)論