4040|5

67

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

WinCE外部程序调用!!!如何实现!!!50分~! [复制链接]

C#语言,谢谢,C++,VB等的都会,只需要C#的,求解,
此帖出自WindowsCE论坛

最新回复

使用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 );   详情 回复 发表于 2008-8-29 09:28
点赞 关注
 

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
这种没有边际的问题估计没有人能回答上来。。。。
此帖出自WindowsCE论坛
 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
什么意思?WINCE调用C#语言?貌似没有哪个系统能这么做。
问题描述清楚一点,系统,环境,平台,语言,希望做什么,你已经尝试了怎么做,碰到什么问题。
此帖出自WindowsCE论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

4
 
要在程序1中调用程序2来运行,这个怎么来实现?
此帖出自WindowsCE论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

5
 
http://hi.baidu.com/k_falcon/blog/item/293f41ee494df6ffb2fb95a9.html

帮你搜了一个,你看能实现否。
此帖出自WindowsCE论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

6
 
使用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 );
此帖出自WindowsCE论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表