C# 如何使用像Win32_Printer这样的Win32类?

C# 如何使用像Win32_Printer这样的Win32类?,c#,winapi,wmi,C#,Winapi,Wmi,我必须在C.net中使用Win32类,如Win32_PrintJob、Win32_Printer等 我不知道应该导入哪个命名空间才能在我的c.net应用程序中使用Win32类?这些是WMI类,因此您需要使用System.Management命名空间 这是一篇关于打印机的好文章:这些是WMI类,所以您需要使用System.Management命名空间 这是一篇关于打印机的好文章:在.NET中肯定有这样的对象,所以您不需要使用这些对象。 如果必须直接使用winapi,则可以创建一个包含winapi结

我必须在C.net中使用Win32类,如Win32_PrintJob、Win32_Printer等


我不知道应该导入哪个命名空间才能在我的c.net应用程序中使用Win32类?

这些是WMI类,因此您需要使用System.Management命名空间


这是一篇关于打印机的好文章:

这些是WMI类,所以您需要使用System.Management命名空间


这是一篇关于打印机的好文章:

在.NET中肯定有这样的对象,所以您不需要使用这些对象。 如果必须直接使用winapi,则可以创建一个包含winapi结构中包含的所有内容的结构。这些结构是结构,而不是类

一些注意事项: 保持所有成员的确切顺序和类型。 使用System.IntPtr表示HWND等句柄。 如果需要传递结构的大小,请使用Marshal.SizeOf。 还可以添加[StructLayout]属性,从中可以指定字符集和其他重要属性。
命名空间System.Runtime.InteropServices具有一些常见的winapi结构。

在.NET中确实实现了此类对象,因此您不需要使用这些对象。 如果必须直接使用winapi,则可以创建一个包含winapi结构中包含的所有内容的结构。这些结构是结构,而不是类

一些注意事项: 保持所有成员的确切顺序和类型。 使用System.IntPtr表示HWND等句柄。 如果需要传递结构的大小,请使用Marshal.SizeOf。 还可以添加[StructLayout]属性,从中可以指定字符集和其他重要属性。
命名空间System.Runtime.InteropServices具有一些常见的winapi结构。

要从C或.Net访问WMI,必须导入命名空间。另外,如果您是新使用WMI的用户,请尝试类似的工具,该工具可以帮助您创建一个C代码段来访问WMI

尝试使用该工具创建的示例代码

using System;
using System.Collections.Generic;
using System.Management;
using System.Text;

namespace GetWMI_Info
{
    class Program
    {

        static void Main(string[] args)
        {
            try
            {
                string ComputerName = "localhost";
                ManagementScope Scope;                

                if (!ComputerName.Equals("localhost", StringComparison.OrdinalIgnoreCase)) 
                {
                    ConnectionOptions Conn = new ConnectionOptions();
                    Conn.Username  = "";
                    Conn.Password  = "";
                    Conn.Authority = "ntlmdomain:DOMAIN";
                    Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), Conn);
                }
                else
                    Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), null);

                Scope.Connect();
                ObjectQuery Query = new ObjectQuery("SELECT * FROM Win32_PrintJob");
                ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Scope, Query);

                foreach (ManagementObject WmiObject in Searcher.Get())
                {
                    Console.WriteLine("{0,-35} {1,-40}","Document",WmiObject["Document"]);// String
                    Console.WriteLine("{0,-35} {1,-40}","Name",WmiObject["Name"]);// String

                }
            }
            catch (Exception e)
            {
                Console.WriteLine(String.Format("Exception {0} Trace {1}",e.Message,e.StackTrace));
            }
            Console.WriteLine("Press Enter to exit");
            Console.Read();
        }
    }
}

为了从C或.Net访问WMI,必须导入命名空间。另外,如果您是新使用WMI的用户,请尝试类似的工具,该工具可以帮助您创建一个C代码段来访问WMI

尝试使用该工具创建的示例代码

using System;
using System.Collections.Generic;
using System.Management;
using System.Text;

namespace GetWMI_Info
{
    class Program
    {

        static void Main(string[] args)
        {
            try
            {
                string ComputerName = "localhost";
                ManagementScope Scope;                

                if (!ComputerName.Equals("localhost", StringComparison.OrdinalIgnoreCase)) 
                {
                    ConnectionOptions Conn = new ConnectionOptions();
                    Conn.Username  = "";
                    Conn.Password  = "";
                    Conn.Authority = "ntlmdomain:DOMAIN";
                    Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), Conn);
                }
                else
                    Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), null);

                Scope.Connect();
                ObjectQuery Query = new ObjectQuery("SELECT * FROM Win32_PrintJob");
                ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Scope, Query);

                foreach (ManagementObject WmiObject in Searcher.Get())
                {
                    Console.WriteLine("{0,-35} {1,-40}","Document",WmiObject["Document"]);// String
                    Console.WriteLine("{0,-35} {1,-40}","Name",WmiObject["Name"]);// String

                }
            }
            catch (Exception e)
            {
                Console.WriteLine(String.Format("Exception {0} Trace {1}",e.Message,e.StackTrace));
            }
            Console.WriteLine("Press Enter to exit");
            Console.Read();
        }
    }
}

虽然您尚未标记答案,但可能正在寻找其他答案,这些答案为您提供了.NET framework命名空间System.Management

但是,您可能一直在阅读WMI文档,并且是从这个角度出发的。其中一个基本概念是WMI命名空间,它当然与.NET命名空间完全不同。所以这里有一个完全不同的答案以防万一

您可能需要的1 WMI命名空间是root\cimv2。只有在深入挖掘的情况下,才可以使用root\subscription或某家公司选择的名称空间,该公司决定将自己的WMI提供程序放在“特殊”的地方

通常,当您想要连接到WMI命名空间时,它位于计算机名称之后,例如\\root\cimv2。在本地连接时,可以省略计算机,因此您只需要放置名称空间路径,例如root\cimv2


在.NET中,您可以通过在字符串中使用WMI命名空间来构建ManagementPath,或者在传递给ManagementScope构造函数的字符串中隐式指定WMI命名空间。

虽然您尚未标记答案,但您可能正在寻找为您提供.NET framework命名空间System.Management的其他答案

但是,您可能一直在阅读WMI文档,并且是从这个角度出发的。其中一个基本概念是WMI命名空间,它当然与.NET命名空间完全不同。所以这里有一个完全不同的答案以防万一

您可能需要的1 WMI命名空间是root\cimv2。只有在深入挖掘的情况下,才可以使用root\subscription或某家公司选择的名称空间,该公司决定将自己的WMI提供程序放在“特殊”的地方

通常,当您想要连接到WMI命名空间时,它位于计算机名称之后,例如\\root\cimv2。在本地连接时,可以省略计算机,因此您只需要放置名称空间路径,例如root\cimv2


在.NET中,您可以通过在字符串中使用WMI命名空间来构建ManagementPath,或在传递给ManagementScope构造函数的字符串中隐式指定WMI命名空间。

+0合理,但相对范围问题的一般答案方式。+0合理,但相对范围问题的一般答案方式。