gds通用软件开发系统

导航

C# Windows CE使用小技巧实例

C# Windows CE使用的一些感受:使用Windows的开发机上用C#启动一个外部程序的方法有很多,但这些方法用在使用WinCE的目标工控机上都无能为力。

C# Windows CE使用1、

现在以打开一个IE为例,介绍如何在WinCE下使用C#来打开一个外部文件:

首先添加命名空间

  1. usingSystem.Runtime.InteropServices;,

然后调用API函数:

  1. [DllImport("coredll.Dll", 
  2. EntryPoint="CreateProcess",SetLastError=true)] 
  3.  
  4. externstaticintCreateProcess( 
  5. stringstrImageName,stringstrCmdLine, 
  6. IntPtrpProcessAttributes,IntPtrpThreadAttributes, 
  7. intbInheritsHandle,intdwCreationFlags, 
  8. IntPtrpEnvironment, IntPtrpCurrentDir, 
  9. IntPtrbArray,ProcessInfooProc); 
  10.  
  11. publicclassProcessInfo 
  12.  
  13.  
  14. publicInt32hProcess; 
  15.  
  16. publicInt32hThread; 
  17.  
  18. publicInt32ProcessID; 
  19.  
  20. publicInt32ThreadID; 
  21.  
  22. }

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

  1. privatevoidbutton_Click( 
  2. objectsender,System.EventArgse) 
  3.  
  4.  
  5. ProcessInfopi=newProcessInfo(); 
  6.  
  7. CreateProcess(" \\windows\\iesample.exe", 
  8. "\\HardDisk\\Readme.htm",IntPtr.Zero, 
  9. IntPtr.Zero,0,0,IntPtr.Zero, 
  10. IntPtr.Zero,IntPtr.Zero,pi); 
  11.  
  12. }

C# Windows CE使用2、

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

  1. [STAThread] 
  2.  
  3. staticvoidMain() 
  4.  
  5.  
  6. //如果跟本程式命名的行程只有一个才执行程式 
  7.  
  8. if(System.Diagnostics.Process. 
  9. GetProcessesByName( 
  10.  
  11. Application.ProductName).Length==1) 
  12.  
  13.  
  14. Application.Run(newForm1()); 
  15.  
  16.  
  17. }

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

  1. [DllImport("coredll.Dll")] 
  2.  
  3. privatestaticexternintGetLastError(); 
  4.  
  5. [DllImport("coredll.Dll")] 
  6.  
  7. privatestaticexternintReleaseMutex(IntPtrhMutex); 
  8.  
  9. [DllImport("coredll.Dll")] 
  10.  
  11. privatestaticexternIntPtrCreateMutex( 
  12. SECURITY_ATTRIBUTESlpMutexAttributes, 
  13. boolbInitialOwner,stringlpName); 
  14.  
  15. [StructLayout(youtKind.Sequential)] 
  16.  
  17. publicclassSECURITY_ATTRIBUTES 
  18.  
  19.  
  20. publicintnLength; 
  21.  
  22. publicintlpSecurityDescriptor; 
  23.  
  24. publicintbInheritHandle; 
  25.  
  26.  
  27. constintERROR_ALREADY_EXISTS=0183; 

然后编写代码

  1. staticvoidMain() 
  2.  
  3.  
  4. #regionApi_CallCreateMutex; 
  5.  
  6. IntPtrhMutex; 
  7.  
  8. hMutex=CreateMutex(null,false,"程序名"); 
  9.  
  10. if(GetLastError()!=ERROR_ALREADY_EXISTS) 
  11.  
  12.  
  13. Application.Run(newFrmmenu()); 
  14.  
  15.  
  16. else
  17.  
  18.  
  19. MessageBox.Show("本程序只允许同时运行一个"); 
  20.  
  21. ReleaseMutex(hMutex); 
  22.  
  23.  
  24. #endregion 
  25.  
  26. }

C# Windows CE使用3、

在.NETFramework中没有函数可以激活属于另外一个进程或程序的窗体,所以我们要通过调用API函数来实现:

  1. usingSystem.Runtime.InteropServices; 
  2.  
  3. [DllImport("coredll.Dll")] 
  4.  
  5. publicstaticexternIntPtrFindWindow( 
  6. Stringclassname,Stringtitle); 
  7.  
  8. [DllImport("coredll.Dll")] 
  9.  
  10. publicstaticexternvoidSetForegroundWindow(IntPtrhwnd);

然后使用下列代码即可

  1. IntPtrhDlg; 
  2.  
  3. hDlg=FindWindow(null,"窗口标题"); 
  4.  
  5. SetForegroundWindow(hDlg);

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

其实,任何时候,只要.NETFramework无法满足编程者需要的时候,通常都可以使用托管(interop)机制直接与Windows交互。大家也许看出调用原有的[DllImport("user32.Dll")]动态链接库时无法满足WinCE下程序要求,所以我们调用了[DllImport("coredll.Dll")]。希望这篇文章能给初学者提供一些捷径。

C# Windows CE使用的一些感受和实例的介绍就向你介绍到这里,希望对你了解C# Windows CE使用有所帮助。

posted on 2010-06-23 08:58  gds通用软件开发系统  阅读(1228)  评论(0编辑  收藏  举报