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")]

WinCE下使用C#的几个小技巧的更多相关文章

  1. Windows下程序打包发布时的小技巧

    一.背景 Windows下开发的应用程序在发布时,需要将其依赖的一些动态链接库一起打进安装包里面去.这个时候,快速确定这个程序到底依赖哪些动态链接库变得非常重要.很久以前写过一篇关于Qt程序安装包制作 ...

  2. Windows下程序打包发布时的小技巧(使用Dependency Walker侦测不理想,改用VS自带的dumpbin则万无一失,还可查看dll导出的函数)

    Windows下开发的应用程序在发布时,需要将其依赖的一些动态链接库一起打进安装包里面去.这个时候,快速确定这个程序到底依赖哪些动态链接库变得非常重要.很久以前写过一篇关于Qt程序安装包制作的博客,里 ...

  3. Python正则匹配递归获得给出目录下的特定类型的文件小技巧

    需求是酱的: 输入一个目录,这个目录包含检测目录的必备信息但不准确需要获得后加工一下,如给出目录:C:\Program Files\Common Files\DESIGNER,需要检测的目录是:C:\ ...

  4. WINCE下进程间通信(一)

    WINCE下进程间通信(一) 在WINCE开发中经常需要在不同的进程之间传递.共享数据,总结了一下,WINCE下进程间通信常用的方式有:Windows消息,共享内存,socket通信,管道,全局原子, ...

  5. WinCE下读取注册表获得SD路径

    WinCE下读取注册表获得SD路径 [要点]WinCE注册表中[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SDMemory\] 下键Folde ...

  6. WinCE下GPRS自动拨号软件(GPRS AutoDial)

    之前在WinCE下调试USB的3G Modem时,写过一个拨号助手RASManager,基本能用.后来车机卖到俄罗斯去,客户老M提供了一个更好的GPRS自动拨号软件GPRS AutoDial,功能完善 ...

  7. Wince下sqlce数据库开发(二)

    上次写到使用数据绑定的方法测试本地sqlce数据库,这次使用访问SQL Server的方法访问sqlce,你会发现他们是如此的相似... 参考资料:http://www.cnblogs.com/rai ...

  8. Wince下sqlce数据库开发(一)

    对于Wince下的sqlce数据库虽然很多人在用,但在我查找资料时,却发现资料是多么的匮乏,在此对自己这几天的了解做个简单介绍,希望对大家能有所帮助! 本文的最后附有所使用到的sqlce在wince下 ...

  9. arc下内存泄漏的解决小技巧

    一定要注意,我们运行app时,一定要关心内存的使用,尽量不要超过20M,即使有很多图片要显示也绝对不能超过30M.所以运行自己开发的app时多关心内存的使用是个很好的习惯. 对于性能,内存的优化,这个 ...

随机推荐

  1. OSU!(bzoj 4318)

    Description osu 是一款群众喜闻乐见的休闲软件.  我们可以把osu的规则简化与改编成以下的样子:  一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1 ...

  2. 【HDOJ2196】Computer(树的直径,树形DP)

    题意:给定一棵N个点树,询问这个树里面每个点到树上其他点的最大距离. n<=10000 思路:设f[u,1],f[u,2]为以U为根向下的最长与次长,g[u,1],g[u,2]为从哪个儿子转移来 ...

  3. one day php. alomost all;

    <? namespace Test; use \PhpProject\PhpApp as Other; $u=new Other("ns test"); echo $u-&g ...

  4. AC日记——绿色通道 codevs 3342

    3342 绿色通道  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description <思远高考绿色通道&g ...

  5. Toast问题记录:This Toast was not created with Toast.makeText()

    最近使用自己封装的Toast时,遇到一个问题 java.lang.RuntimeException: This Toast was not created with Toast.makeText() ...

  6. 利用github搭建个人网站

    1.注册一个github  https://github.com/ 2.新建一个仓库  仓库名 用 Owner.github.io 的格式,然后点击创建 3.源码上传至github 安装github桌 ...

  7. codeforces 997E(线段树)

    分析: 首先考虑如何计算整个数组有多少个good区间 容易发现一个区间是good区间当且仅当max-min-len=-1,且任意区间max-min-len>=-1 我们可以枚举右端点,然后维护前 ...

  8. Java创建和解析Json数据方法(三)——json-lib包的使用

    (三)json-lib包的使用         这篇笔记主要介绍json-lib包的创建和解析json数据的方式,主要是的JSONObject.JSONArray和Java对象:beans, maps ...

  9. JS中原型链中的prototype与_proto_的个人理解与详细总结(**************************************************************)

    一直认为原型链太过复杂,尤其看过某图后被绕晕了一整子,今天清理硬盘空间(渣电脑),偶然又看到这图,勾起了点回忆,于是索性复习一下原型链相关的内容,表达能力欠缺逻辑混乱别见怪(为了防止新人__(此处指我 ...

  10. js和jquery 实现网站来消息网站标题闪动提示

    js版 <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"&g ...