本来是想实现控制台程序运行时自动全屏,但是只找到VC下的实现方法(http://www.vckbase.com/bbs/prime/viewprime.asp?id=347)。
其中要使用两个未公开的Win32 API函数来存取控制台窗口,这就需要使用动态调用的方法,动态调用中使用的Windows API函数主要有三个,即:Loadlibrary,GetProcAddress和Freelibrary。步骤如下:
1.Loadlibrary:装载指定DLL动态库
2.GetProcAddress:获得函数的入口地址
3.Freelibrary:从内存中卸载动态库
但是C#中是没有函数指针,无法直接使用GetProcAddress返回的入口地址。后来找到资料,其实.NET2.0新增了Marshal.GetDelegateForFunctionPointer方法可以满足这个要求,MSDN里的解释是:将非托管函数指针转换为委托。
后面的事就简单啦,我把它编成了一个类来方便调用。
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Runtime.InteropServices;
namespacefeiyun0112.cnblogs.com
{
publicclassDllInvoke
{
WinAPI
privateIntPtrhLib;
publicDllInvoke(StringDLLPath)
{
hLib=LoadLibrary(DLLPath);
}
~DllInvoke()
{
FreeLibrary(hLib);
}
//将要执行的函数转换为委托
publicDelegateInvoke(stringAPIName,Typet)
{
IntPtrapi=GetProcAddress(hLib,APIName);
return(Delegate)Marshal.GetDelegateForFunctionPointer(api,t);
}
}
}
下面是使用的例子:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Runtime.InteropServices;
usingfeiyun0112.cnblogs.com;
namespaceConsoleApplication1
{
classProgram
{
WinAPI
publicdelegateboolSetConsoleDisplayMode(IntPtrhOut,intdwNewMode,outintlpdwOldMode);
staticvoidMain(string[]args)
{
DllInvokedll=newDllInvoke("kernel32.dll");
intdwOldMode;
//标准输出句柄
IntPtrhOut=GetStdHandle(STD_OUTPUT_HANDLE);
//调用WinAPI,设置屏幕最大化
SetConsoleDisplayModes=(SetConsoleDisplayMode)dll.Invoke("SetConsoleDisplayMode",typeof(SetConsoleDisplayMode));
s(hOut,1,outdwOldMode);
Console.WriteLine("********************FullScreenMode********************");
Console.ReadLine();
}
}
}