• Silverlight5通过P/Invoke调用系统win32的三个示例


    调用Win32函数

        public partial class MainPage : UserControl
        {
            [DllImportAttribute("user32.dll", EntryPoint = "MessageBoxW")]
            public static extern int MessageBoxW(
                [In]System.IntPtr hWnd,
                [In][MarshalAs(UnmanagedType.LPWStr)] string lpText,
                [In][MarshalAs(UnmanagedType.LPWStr)] string lpCaption,
                uint uType);
    
            [DllImport("user32.dll", EntryPoint = "MessageBoxA")]
            static extern int MsgBox(int hWnd, string msg, string caption, int type);
    
            [DllImport("kernel32.dll")]
            public static extern bool Beep(int frequency, int duration);
    
            [DllImport("learnDll.dll")]//, EntryPoint = "fnlearnDll"
            public static extern int fnlearnDll();
    
            public void PlaySound()
            {
                Random random = new Random();
                for (int i = 0; i < 50; i++)
                {
                    Beep(random.Next(10000), 100);
                }
            }
    
            public MainPage()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                PlaySound();
                MsgBox(0, "Hello", "Interop", 0);
                //MessageBoxW(IntPtr.Zero, "Hello", "Interop", 0);
                fnlearnDll();
            }
        }
    

    -------------------------------------------------------------------------------------------------------------------------------------------------------------

    USB设备插取识别

        public partial class SilverlightControl1 : UserControl
        {
            // Importing a set of necessary native methods from Win32 API.
            [DllImport("User32", EntryPoint = "CreateWindowEx", CharSet = CharSet.Auto, SetLastError = true)]
            static extern IntPtr CreateWindowEx(int dwExStyle, string lpszClassName, string lpszWindowName, int style, int x, int y, int width, int height,
                IntPtr hWndParent, IntPtr hMenu, IntPtr hInst,
                [MarshalAs(UnmanagedType.AsAny)] object pvParam);
    
            [DllImport("user32.dll")]
            static extern IntPtr DefWindowProc(IntPtr hWnd, int uMsg,
                IntPtr wParam, IntPtr lParam);
    
            [DllImport("user32", CharSet = CharSet.Auto, SetLastError = true)]
            public static extern short RegisterClass(WNDCLASS wc);
    
            // Marshaling the Window structure.
            [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
            public class WNDCLASS
            {
                public int style;
                public WndProc lpfnWndProc;
                public int cbClsExtra;
                public int cbWndExtra;
                public IntPtr hInstance;
                public IntPtr hIcon;
                public IntPtr hCursor;
                public IntPtr hbrBackground;
                public string lpszMenuName;
                public string lpszClassName;
            }
    
            //system detects USB insertion/removal
            const int WM_DEVICECHANGE = 0x0219;
            // system detects a new device
            const int DBT_DEVICEARRIVAL = 0x8000;
            // device removed
            const int DBT_DEVICEREMOVECOMPLETE = 0x8004;
    
            // Callbacks must have AllowReversePInvokeCalls attribute.
            [AllowReversePInvokeCalls]
            private IntPtr Callback(IntPtr hWnd, int msg, IntPtr wparam, IntPtr lparam)
            {
                if (msg == WM_DEVICECHANGE)
                {
                    if (wparam.ToInt32() == DBT_DEVICEARRIVAL)
                        textBlock1.Text = "USB inserted";
                    if (wparam.ToInt32() == DBT_DEVICEREMOVECOMPLETE)
                        textBlock1.Text = "USB removed";
                }
                return DefWindowProc(hWnd, msg, wparam, lparam);
            }
    
            public delegate IntPtr WndProc(
                IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
    
            // Preventing garbage collection of the delegate
            private static WndProc dontGCthis;
    
            public SilverlightControl1()
            {
                InitializeComponent();
    
                WNDCLASS wc = new WNDCLASS();
    
                // Preventing garbage collection of the delegate
                dontGCthis = new WndProc(Callback);
                wc.lpfnWndProc = dontGCthis;
    
                // Note that you need to ensure unique names     // for each registered class.
                // For example, if you open the same plugin 
                // in two different tabs of the browser,
                // you still should not end up with 
                // two registered classes with identical names.
                wc.lpszClassName = "foobar" + (new Random()).Next();
    
                RegisterClass(wc);
    
                IntPtr createResult = CreateWindowEx(0, wc.lpszClassName, "Window title", 0, 100, 100, 500, 500, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, 0);
            }
        }
    

    -----------------------------------------------------------------------------------------------------------------

    进程实时管理

    <UserControl
      x:Class="SilverlightApplication10.MainPage"
      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"
      mc:Ignorable="d"
      d:DesignHeight="300"
      d:DesignWidth="400"
      xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
      xmlns:local="clr-namespace:SilverlightApplication10">
      <UserControl.DataContext>
        <local:ProcessViewModel />
      </UserControl.DataContext>
      <Grid
        x:Name="LayoutRoot"
        Margin="6"
        Background="White">
        <Grid.RowDefinitions>
          <RowDefinition
            Height="Auto" />
          <RowDefinition />
        </Grid.RowDefinitions>
        <TextBlock
          Text="Process Information"
          FontSize="16" />
        <sdk:DataGrid
          Grid.Row="1"
          Margin="2"
          AutoGenerateColumns="true" 
          ItemsSource="{Binding Processes}"/>
      </Grid>
    </UserControl>
    
      public class PropertyChangeNotification : INotifyPropertyChanged
      {
        protected void RaisePropertyChanged(string property)
        {
          if (this.PropertyChanged != null)
          {
            this.PropertyChanged(this,
              new PropertyChangedEventArgs(property));
          }
        }
        public event PropertyChangedEventHandler PropertyChanged;
      }
    
      using System.ComponentModel;
      using System.Collections.Generic;
      using System.Windows;
      using System.Collections.ObjectModel;
      using System.Linq;
      using System.Windows.Threading;
      using System;
      using System.Threading.Tasks;
    
      public class ProcessViewModel : PropertyChangeNotification
      {
        public ProcessViewModel()
        {
          if (Application.Current.HasElevatedPermissions)
          {
            BuildInitialProcessList();
          }
        }
        void BuildInitialProcessList()
        {
          this.Processes = new ObservableCollection<Process>();
          BuildProcessList();
    
          DispatcherTimer timer = new DispatcherTimer();
          timer.Interval = TimeSpan.FromMilliseconds(500);
          timer.Tick += (s, e) => BuildProcessList();
          timer.Start();
        }
        void BuildProcessList()
        {
          IEnumerable<Process> newProcesses = Process.EnumerateCurrentList();
    
          var newProcsOuterJoinedExisting =
            from np in newProcesses
            join op in this.Processes
            on np.Id equals op.Id into joinGroup
            from gp in joinGroup.DefaultIfEmpty()
            select new { NewProcess = np, OldProcess = gp };
    
          foreach (var item in newProcsOuterJoinedExisting.ToList())
          {
            if (item.OldProcess == null)
            {
              this.Processes.Add(item.NewProcess);
            }
            else
            {
              item.OldProcess.Refresh();
            }
          }
    
          var remainingListOuterJoinedNewProcs =
            from cp in this.Processes
            join np in newProcesses
            on cp.Id equals np.Id into joinGroup
            from gp in joinGroup.DefaultIfEmpty()
            select new { CurrentProcess = cp, NewProcess = gp };
    
          foreach (var item in remainingListOuterJoinedNewProcs.ToList())
          {
            if (item.NewProcess == null)
            {
              this.Processes.Remove(item.CurrentProcess);
            }
          }
        }
        public ObservableCollection<Process> Processes
        {
          get
          {
            return (_Processes);
          }
          set
          {
            _Processes = value;
            RaisePropertyChanged("Processes");
          }
        }
        ObservableCollection<Process> _Processes;
      }
    
      using System;
      using System.Collections.Generic;
      using System.Runtime.InteropServices;
      using System.Text;
      using System.IO;
    
      internal class Win32Exception : Exception
      {
        public Win32Exception(string message, int errorCode)
          : base(message)
        {
          this.ErrorCode = errorCode;
        }
        public int ErrorCode { get; private set; }
      }
      public class Process : PropertyChangeNotification
      {
        [StructLayout(LayoutKind.Sequential)]
        struct PROCESS_MEMORY_COUNTERS
        {
          public UInt32 cb;
          public UInt32 PageFaultCount;
          public UIntPtr PeakWorkingSetSize;
          public UIntPtr WorkingSetSize;
          public UIntPtr QuotaPeakPagedPoolUsage;
          public UIntPtr QuotaPagedPoolUsage;
          public UIntPtr QuotaPeakNonPagedPoolUsage;
          public UIntPtr QuotaNonPagedPoolUsage;
          public UIntPtr PagefileUsage;
          public UIntPtr PeakPagefileUsage;
        };
    
        public Process(UInt32 processId)
        {
          this.Id = processId;
        }
        public UInt32 Id { get; private set; }
    
        public UInt64 WorkingSetBytes
        {
          get
          {
            PROCESS_MEMORY_COUNTERS counters;
            IntPtr handle = GetHandle();
    
            try
            {
              if (!GetProcessMemoryInfo(handle, out counters,
                (UInt32)Marshal.SizeOf(typeof(PROCESS_MEMORY_COUNTERS))))
              {
                throw new Win32Exception("Failed to get memory info",
                  Marshal.GetLastWin32Error());
              }
            }
            finally
            {
              CloseHandle(handle);
            }
            return (counters.WorkingSetSize.ToUInt64());
          }
        }
    
        public void Refresh()
        {
          this.RaisePropertyChanged("WorkingSetBytes");
        }
    
        public string ImageName
        {
          get
          {
            if (string.IsNullOrEmpty(this.imageName))
            {
              UInt32 capacity = 128;
              StringBuilder builder = new StringBuilder((int)capacity);
    
              IntPtr handle = GetHandle();
    
              try
              {
                while (GetProcessImageFileName(handle, builder, capacity) == 0)
                {
                  int errorCode = Marshal.GetLastWin32Error();
    
                  if (errorCode == ERROR_INSUFFICIENT_BUFFER)
                  {
                    capacity *= 2;
                    builder = new StringBuilder((int)capacity);
                  }
                  else
                  {
                    throw new Win32Exception("Failed to get image name", errorCode);
                  }
                }
                this.imageName = Path.GetFileName(builder.ToString());
              }
              finally
              {
                CloseHandle(handle);
              }
            }
            return (this.imageName);
          }
        }
        string imageName;
    
        IntPtr GetHandle()
        {
          IntPtr handle = OpenProcess(PROCESS_QUERY_INFORMATION, false, this.Id);
    
          if (handle == IntPtr.Zero)
          {
            throw new Win32Exception("Failed to open process",
              Marshal.GetLastWin32Error());
          }
          return (handle);
        }
        static bool TryOpenProcess(UInt32 id)
        {
          IntPtr ptr = OpenProcess(PROCESS_QUERY_INFORMATION, false, id);
    
          if (ptr != IntPtr.Zero)
          {
            CloseHandle(ptr);
          }
          return (ptr != IntPtr.Zero);
        }
        public static IEnumerable<Process> EnumerateCurrentList()
        {
          foreach (var processId in EnumerateProcessIds())
          {
            if (TryOpenProcess(processId))
            {
              yield return new Process(processId);
            }
          }
        }
        static IEnumerable<UInt32> EnumerateProcessIds()
        {
          UInt32[] processIds = new UInt32[32];
          bool retry = true;
    
          while (retry)
          {
            processIds = new UInt32[processIds.Length * 2];
    
            UInt32 arraySize =
              (UInt32)(Marshal.SizeOf(typeof(UInt32)) * processIds.Length);
    
            UInt32 bytesCopied = 0;
    
            retry = EnumProcesses(processIds, arraySize, out bytesCopied);
    
            if (retry)
            {
              retry = (bytesCopied == arraySize);
            }
            else
            {
              throw new Win32Exception("Failed enumerating processes",
                Marshal.GetLastWin32Error());
            }
          }
          return (processIds);
        }
    
        [DllImport("psapi", SetLastError = true)]
        static extern bool EnumProcesses(
          [MarshalAs(UnmanagedType.LPArray)] [In] [Out] UInt32[] processIds,
          UInt32 processIdsSizeBytes,
          out UInt32 bytesCopied);
    
        [DllImport("kernel32", SetLastError = true)]
        static extern IntPtr OpenProcess(UInt32 dwAccess, bool bInheritHandle,
          UInt32 dwProcessId);
    
        [DllImport("kernel32")]
        static extern bool CloseHandle(IntPtr handle);
    
        [DllImport("psapi", SetLastError = true)]
        static extern UInt32 GetProcessImageFileName(
          IntPtr processHandle,
          [In] [Out] StringBuilder lpImageFileName,
          UInt32 bufferSizeCharacters);
    
        [DllImport("psapi", SetLastError = true)]
        static extern bool GetProcessMemoryInfo(
          IntPtr processHandle,
          out PROCESS_MEMORY_COUNTERS counters,
          UInt32 dwSize);
    
        static readonly UInt32 PROCESS_QUERY_INFORMATION = 0x0400;
        const int ERROR_ACCESS_DENIED = 5;
        const int ERROR_INVALID_PARAMETER = 87;
        const int ERROR_INSUFFICIENT_BUFFER = 122;
      }
    

      

  • 相关阅读:
    luoguP4389 付公主的背包 多项式exp
    bzoj3456 城市规划 多项式求In
    luoguP4491 [HAOI2018]染色 广义容斥原理 + FFT
    计蒜之道2019复赛题解
    Educational Codeforces Round 66 (Rated for Div. 2)
    [CodeChef-ANUDTQ] Dynamic Trees and Queries
    M-SOLUTIONS Programming Contest
    Codeforces Global Round 3
    PKUSC2019题解
    [LOJ#3120][Luogu5401][CTS2019]珍珠(容斥+生成函数)
  • 原文地址:https://www.cnblogs.com/chuncn/p/2307613.html
Copyright © 2020-2023  润新知