7z c# wince_WinCE下使用C#的几个小技巧

1、我们知道,在使用Windows的开发机上用C#启动一个外部程序的方法有很多,但这些方法用在使用WinCE的目标工控机上都无能为力,现在小嫚儿以打开一个IE为例,介绍如何在WinCE下使用C#来打开一个外部文件:首先添加命名空间

using System.Runtime.InteropServices;,然后调用API函数:

[DllImport("coredll.Dll",  EntryPoint="CreateProcess",  SetLastError=true)]

extern  static  int  CreateProcess(string  strImageName,  string  strCmdLine,  IntPtr pProcessAttributes,  IntPtr  pThreadAttributes  ,  int  bInheritsHandle,  int dwCreationFlags,  IntPtr  pEnvironment,  IntPtr  pCurrentDir,  IntPtr  bArray, ProcessInfo  oProc);

public  class  ProcessInfo

{

public  Int32  hProcess;

public  Int32  hThread;

public  Int32  ProcessID;

public  Int32  ThreadID;

}

最后就可以编写你需要打开IE的代码了(点击一个按钮打开IE浏览器中相应内容,此例程要求打开目标工控机硬盘上的Readme文件):

private void button_Click(object sender, System.EventArgs e)

{

ProcessInfo  pi  =  new  ProcessInfo();

CreateProcess("\\windows\\iesample.exe"  ,  "\\HardDisk\\Readme.htm", IntPtr.Zero,  IntPtr.Zero,  0,  0,  IntPtr.Zero,  IntPtr.Zero,  IntPtr.Zero,  pi);

}

2、有时候我们会希望我们的程式只被执行一次,VB的时代我们会用App.PrevInstance,而.net的时代我们可以用下列方式实现

[STAThread]

static void Main()

{

//如果跟本程式命名的行程只有一个才执行程式

if (System.Diagnostics.Process.GetProcessesByName(

Application.ProductName).Length == 1)

{

Application.Run(new Form1());

}

}

但此方法在WinCE下无法实现,所以我们还是要先调用动态链接库,

[DllImport("coredll.Dll")]

private static extern int GetLastError();

[DllImport("coredll.Dll")]

private static extern int ReleaseMutex(IntPtr hMutex);

[DllImport("coredll.Dll")]

private static extern IntPtr CreateMutex(SECURITY_ATTRIBUTES lpMutexAttributes,bool bInitialOwner,string lpName);

[StructLayout( LayoutKind.Sequential)]

public class SECURITY_ATTRIBUTES

{

public int nLength;

public int lpSecurityDescriptor;

public int bInheritHandle;

}

const int ERROR_ALREADY_EXISTS = 0183;

然后编写代码

static void Main()

{

#region Api_Call CreateMutex;

IntPtr hMutex;

hMutex=CreateMutex(null,false,"程序名");

if (GetLastError()!=ERROR_ALREADY_EXISTS)

{

Application.Run(new Frmmenu());

}

else

{

MessageBox.Show("本程序只允许同时运行一个");

ReleaseMutex(hMutex);

}

#endregion

}

3、有时我们希望自己的程序能做到激活一个窗体,但在 .NET  Framework 中没有函数可以激活属于另外一个进程或程序的窗体。所以,我们还是要调用API函数来实现:

using System.Runtime.InteropServices;

[DllImport("coredll.Dll")]

public static extern IntPtr FindWindow(String classname, String title);

[DllImport("coredll.Dll")]

public static extern void  SetForegroundWindow(IntPtr hwnd);

然后使用下列代码即可

IntPtr hDlg;

hDlg=FindWindow(null, "窗口标题");

SetForegroundWindow( hDlg );

最后,WinCE下的C#里不支持GroupBox控件,建议使用Panel控件代替;不支持Frame控件,如果非要达到那样的效果,可以用Label和TextBox组和起来应付一下。

其实,任何时候,只要.NET Framework无法满足编程者的需要,通常都可以使用托管(interop)机制直接与Windows 交互。大家也许看出调用原有的[DllImport("user32 .Dll")]动态链接库时无法满足WinCE下程序要求,所以我们调用了[DllImport("coredll.Dll")]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值