本文主要介绍C#如何实现控制计算机注销、关机和重启的功能。本案例涉及的知识点有:流程、Shell32.dll、User32.dll、Struct数据结构。有兴趣的可以看看。
目录
目标知识点的实现process shell 32 . dlluser 32 . dll struct数据结构实现步骤函数类表单配置事件触发事件程序
实现目标
C#可以实现计算机注销、关机、重启的功能。
知识点
本案例涉及的知识点有:流程、Shell32.dll、User32.dll、Struct数据结构。
Process
本案例主要通过Process类调用cmd.exe,使用shell命令实现电机的关机和重启。
使用的属性和方法是StartInfo(属性)和Start(方法)。
StartInfo.FileName
或者启动应用程序或文档。
过程。StartInfo .文件名
过程。StartInfo.FileName='cmd.exe '
StartInfo.UseShellExecute
真实;启动进程时是否应使用外壳程序;如果进程是直接从可执行文件创建的,则为False。默认值为true。
以下场景值为真:
您需要打开文档、媒体、web文件等。你需要在你电脑上的环境变量的路径下打开URL,打开脚本,打开程序。
以下方案值为假:
显式执行已知程序并重定向输入和输出。
UseShellExecute=调用true Shellexecute。
调用了UseShellExecute=false CreateProcess。
过程。StartInfo.UseShellExecute
过程。StartInfo . UseShellExecute=false
StartInfo.RedirectStandardInput
获取用于写入应用程序输入的流。
真实;如果应从StandardInput读取输入,则为;否则为假。默认值为false。
一个进程可以从它的标准输入流(通常是键盘)中读取输入文本。通过重定向StandardInput流,您可以以编程方式指定流程的输入。例如,您可以从指定文件的内容或另一个应用程序的输出中提供文本,而不使用键盘输入。
StartInfo.RedirectStandardOutput
或者获取一个值,该值指示是否将应用程序的文本输出写入StandardOutput流。
真实;如果输出应写入StandardOutput,则为;否则为假。默认值为false。
当Process将文本写入其标准流时,该文本通常显示在主机上。通过设置RedirectStandardOutputtrue来重定向StandardOutput流,可以操作或取消进程的输出。例如,您可以过滤文本,以不同的方式格式化文本,或者将输出写入控制台和指定的日志文件。
//运行“CSC . exe/r:system . dll/out:sample . exe stdstr . cs”。UseShellExecute为false,因为我们正在指定
//一个可执行文件,在这种情况下取决于它是否在路径文件夹中。通过设置
//RedirectStandardOutput为true,则csc.exe的输出被定向到进程。标准输出流
//然后直接显示在这个控制台窗口中。
使用(Process compiler=new Process())
{
编译器。StartInfo . FileName=' csc.exe
编译器。StartInfo . Arguments='/r:system . dll/out:sample . exe stdstr . cs ';
编译器。StartInfo . UseShellExecute=false;
编译器。StartInfo . redirect standard output=true;
编译器。start();
控制台。WriteLine(编译器。standard output . ReadToEnd());
编译器。wait forexit();
}
StartInfo.RedirectStandardError
或者获取一个值,该值指示是否将应用程序的错误输出写入StandardError流。
真实;如果错误输出应写入StandardError,则为;否则为假。默认值为false。
当Process将文本写入其标准错误流时,该文本通常会显示在主机上。通过重定向StandardError流,可以操作或禁用流程的错误输出。例如,您可以过滤文本,以不同的方式格式化文本,或者将输出写入控制台和指定的日志文件。
StartInfo.CreateNoWindow
或者设置一个值,指示是否在新窗口中开始该过程。
如果进程应该在不创建包含它的新窗口的情况下启动,则为True否则为假。默认值为false。
对控制面板窗口有效,与UseShellExecute结合使用。
useshellexecute=true时此值无效,为正常方式启动。
useshellexecute=false:CreateNoWindow=true时,控制面板窗口不会显示。这种方式下无法通过窗口关闭进程,所以运行的进程最好是可以自己运行完关闭的,不然需要到任务管理器中关闭。
Start美元
启动进程资源并将其与流程(流程)组件关联。
StandardInput.WriteLine(cmd)美元
获取用于写入应用程序输入的流。
串流写入器,可用于写入应用程序的标准输入流。
shell32.dll
公共静态外部bool sendmessage(intpth dn、int wMsg、int mParam、int lparam
//从exe\dll\ico文件中获取指定索引或身份证明号号的图标句柄
[DllImport('shell32.dll ',EntryPoint='ExtractIcon')]
//获取文件图标的美国石油学会函数
[DllImport('shell32.dll ',EntryPoint='SHGetFileInfo')]
公共静态外部intptr shgetfileinfo(字符串pszPath、uint dwfileattribute、ref SHFILEINFO psfi、uint cbsizefileinfo、uint flags);
//从exe\dll\ico文件中生成图标句柄数组
[DllImport('shell32.dll')]
public static external uint extract iconex(string lpsz file,int nIconIndex,int[]phiconarge,int[] phiconSmall,uint nicos);
//清空指定驱动器的回收站
[DllImport('shell32.dll')]
公共静态外部int shemptyryclebin(intpt hwnd,int pszrootpath,int dwf flags);
//打开系统的命令窗口
[DllImport('shell32.dll ',EntryPoint='ShellExecute')]
公共静态外部int ShellExecute(int hwnd、String lpOperation、String lpFile、String lpParameters、String lpDirectory、int nshocmd);
User32.dll
//用来释放被当前线程中某个窗口捕获的光标
[DllImport('user32.dll')]
公共静态外部bool relase capture();
//向指定的窗体发送Windows操作系统操作系统消息
[DllImport('user32.dll')]
公共静态外部bool sendmessage(intpth dn、int wMsg、int mParam、int lparam
//获取文件夹图标的美国石油学会函数
[DllImport('User32.dll ',EntryPoint='DestroyIcon')]
公共静态外部内部销毁图标(intptr hicon);
//查询或设置系统级参数
[DllImport('user32.dll ',入口点=' system parameters symphonoa ')]
公共静态外部int 32系统参数sinfo(int 32 uation,Int32 uParam,string lpvparam,int 32 fuwinini);
//定义系统美国石油学会入口点,用来关闭~我爱你~注销或者重启计算机
[DllImport('user32.dll ',EntryPoint='ExitWindowsEx ',CharSet=CharSet).Ansi)]
公共静态外部内部exitwindowsex
Struct数据结构
页:1中结构(结构)数据类型此处不做更多延伸介绍,这里只说明结构类型的语法定义规则和结构体布局。
语法定义
//公共为修饰符,人为结构体名称,名字"年龄""性"为结构体成员,每个成员包括修饰符~我爱你~数据类型。
公共结构人员
{
公共字符串名称;
公共(同Internationalorganizations)国际组织年龄;
公共坦克性;
}:
结构体布局
*顺序,顺序布局*
[结构布局(布局种类).(连续)
结构编号(结构编号)
{
内部a;
内部b;
}
//默认情况下在内存里是先排一个,再排乙。非政府组织
//也就是如果能取到一个a的地址,和乙。非政府组织的地址,则相差一个内部的类型的长度,4字节
*显式(显式),精确布局*
*需要用FieldOffset()设置每个成员的位置
这样就可以实现类似c。非政府组织的公用体的功能*
[结构布局(布局种类).显式(显式)
结构S1
{
[字段偏移量(0)]
内部a;
[字段偏移量(0)]
内部b;
}
//需要用FieldOffset()设置每个成员的位置
//这样就可以实现类似c。非政府组织的公用体的功能
代码案例
代码案例中-沼泽特性,它用于描述字段~我爱你~方法或参数的封送处理格式。用它作为参数前缀并指定目标需要的数据类型。
[结构布局(布局种类).(连续)
公共结构shfileinfo关于
{
公共intptr hicon//图标句柄
公共intptr iicon//系统图标列表的索引
公共uint dwattributes://文件属性
[沼泽(未受污染的类型)。ByValTStr,sizest=260)]
公共字符串szdisplayname//文件的路径
[MarshalAs(UnmanagedType。ByValTStr,SizeConst=80)]
公共字符串szTypeName//文件的类型名
}
实现步骤
功能类
该功能的实现逻辑:
Logout:调用windows系统API函数(user32.dll)的方法。
//定义系统API入口点,用于关机、注销或重启计算机。
[DllImport('user32.dll ',EntryPoint='ExitWindowsEx ',CharSet=CharSet。Ansi)]
公共静态extern int ExitWindowsEx(int u flags,int dwReserved)
关闭:使用Process创建一个新进程,打开cmd.exe,然后使用shell脚本触发关闭操作。
公共void CMDOperator(字符串cmd)
{
Process my Process=new Process();//创建一个流程对象
我的过程。StartInfo . FileName=' cmd.exe//设置打开cmd命令窗口
我的过程。StartInfo . UseShellExecute=false;//不使用操作系统外壳程序启动进程的值
我的过程。StartInfo . RedirectStandardInput=true;//设置可以从标准输入流中读取的值
我的过程。StartInfo . redirect standard output=true;//设置可以写入标准输出流的值
我的过程。StartInfo . RedirectStandardError=true;//设置以显示iostream中的错误。
我的过程。StartInfo . CreateNoWindow=true//设置在新窗口中启动进程
我的过程。start();//启动进程
我的过程。标准输入.写线(cmd);//传入要执行的命令
}
Restart:除了修改shell脚本之外,它的实现方式与shutdown相同。
窗体组态
label控件在红色边框中,Button控件在绿色边框中。
事件触发
表单中有四个按钮,每个按钮对应四个事件。事件触发属性为:点击。
事件程序
//注销按钮事件程序
//调用win32类中的ExitWindowsEx方法。
私有void button1_Click(对象发送方,EventArgs e)
{
Win32。ExitWindowsEx(0,0);//注销计算机
}
//关机按钮事件程序
//调用Opera类中的CMDOperator方法。使用shell脚本触发
私有void button2_Click(对象发送方,EventArgs e)
{
操作。cmd operator(' shut down-s-t 0 ');//关闭计算机
}
//重新启动按钮事件程序
//调用Opera类中的CMDOperator方法。使用shell脚本触发
私有void按钮3_Click(对象发送方,EventArgs e)
{
操作。cmd operator(' shut down-r-t 0 ');//重新启动计算机
}
以上是C#控制电脑注销、关机、重启的细节。更多关于C#控制计算机的信息,请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。