0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

英创信息技术WinCE平台C#例程要点介绍

英创信息技术 来源:英创信息技术 作者:英创信息技术 2019-11-15 10:01 次阅读

英创嵌入式ARM9主板采用微软的Windows CE操作系统,可以采用eVC或者VS2005进行应用开发。C#作为一种简单易用的编程语言工具,由于其在结构构建和API界面上的优势,受到广大客户的喜爱,并为很多用户所选用。为了让广大选用C#的用户能够方便快捷地完成应用开发,英创提供了一些C#的应用例程。一些例程我们已经提供了一些说明文档,发表在英创网站上,它们是:

·基于WINCE平台C#编程要点之一

·基于WINCE平台C#编程要点之二

·使用C#进行CAN总线编程—基于WINCE平台C#编程要点之三

·CAN接口COM组件在C#语言中的使用

·SQL CE数据库的C#编程

·C#使用COM组件接口操作精简ISA总线

·C#使用COM组件接口进行串口操作

·C#调用COM组件的效率分析

英创不停地根据客户的需求添加相应的应用例程,本文将对下面两个新的要点进行浅析说明(光盘上均有相关例程):

·使用C#播放MP3或WAV音频文件

·如何定义和使用键盘热键

1、使用C#播放MP3或WAV音频文件

英创的EM9000和EM9161等嵌入式工控主板进行音频硬件扩展后,可以支持音频的播放,如果客户要在应用产品中播放MP3和WAV等音频文件,我们的例程采用了著名的第三方音频动态链接库fmodce.dll,客户可以按照如下方法进行使用:

首先,可以在应用工程中创建一个新的音频类文件,如sound.cs,在这个类文件里定义一个音频类,对fmodce.dll的音频函数进行DllImport定义,以便在应用程序中可以调用:

public static IntPtr GetStream(string filename) // 获得音频文件的IntPtr

{

byte[] filenamebytes = System.Text.Encoding.Default.GetBytes(filename + null);

GCHandle hfile = GCHandle.Alloc(filenamebytes, GCHandleType.Pinned);

if (Environment.Version.Major == 1) return new IntPtr(hfile.AddrOfPinnedObject().ToInt32() + 4);

else return hfile.AddrOfPinnedObject();

}

[DllImport(‘fmodce.dll’, EntryPoint = ‘FSOUND_Init’, SetLastError = true, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]

public static extern bool Init(int mixrate, int maxsoftwarechannels, int flags); // 初始化

[DllImport(‘fmodce.dll’, EntryPoint = ‘FSOUND_Stream_GetLength’, SetLastError = true, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]

public static extern int GetLength(IntPtr fstream); // 获得流媒体的长度

[DllImport(‘fmodce.dll’, EntryPoint = ‘FSOUND_Stream_GetPosition’, SetLastError = true, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]

public static extern UInt32 GetPosition(IntPtr fstream); // 获得流媒体当前播放位置

[DllImport(‘fmodce.dll’, EntryPoint = ‘FSOUND_Stream_Open’, SetLastError = true, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]

public static extern IntPtr Open(IntPtr data, int mode, int offset, int length); // 打开音频文件

[DllImport(‘fmodce.dll’, EntryPoint = ‘FSOUND_Stream_Play’, SetLastError = true, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]

public static extern int Play(int channel, IntPtr fstream); // 播放音频文件

[DllImport(‘fmodce.dll’, EntryPoint = ‘FSOUND_Stream_SetPosition’, SetLastError = true, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]

public static extern bool SetPosition(IntPtr fstream, UInt32 position); // 定位音频文件播放位置

[DllImport(‘fmodce.dll’, EntryPoint = ‘FSOUND_Stream_Stop’, SetLastError = true, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]

public static extern bool Stop(IntPtr fstream); // 停止播放

[DllImport(‘fmodce.dll’, EntryPoint = ‘FSOUND_Close’, SetLastError = true, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]

public static extern void Close(); // 关闭音频文件

[DllImport(‘coredll.dll’, SetLastError = true)]

public static extern int SetSystemPowerState(string psState, int StateFlags, int Options);

const int POWER_FORCE = 0x1000;

const int POWER_STATE_ON = 0x10000;

有了这些方便易用的音频函数,而后就可以在应用程序里面自由操作音频文件了。比如,播放一首songmother.mp3歌曲:

string currentSoundTrack = @‘\NandFlash\songmother.mp3’;

Sound.Init(44100, 16, 0); // 初始化为44.1kHz

IntPtr soundStream = Sound.GetStream(currentSoundTrack);

IntPtr soundHandle = Sound.Open(soundStream, 16 | 32 | 256, 0, 0);

Sound.Play(0, soundHandle);

2、如何定义和使用键盘热键

在客户的应用开发中,很多终端设备是使用小键盘相应热键来执行相应的应用操作的。WinCE操作系统有很完善的消息传递机制,我们提供了一个热键例程来说明这个过程。

首先,可以在应用工程中创建一个新的MessageWindow类文件,如MyMessageWindow.cs,以便监视键盘操作并作出实时响应:

class MyMessageWindow : MessageWindow

{

private Form1 msgform = null;

// 注意,程序的主窗体名称是Form1,所以在此定义一个msgform的Form1以便接收传递的消息

// 下面是构造函数,注意在Form1.cs是通过

// keyUsage = new MyMessageWindow(this);彼此建立关联的

public MyMessageWindow(Form1 msgform)

{

this.msgform = msgform;

}

protected override void WndProc(ref Message m) // 监视Windows消息

{

const int WM_HOTKEY = 0x0312; // 如果m.Msg的值为0x0312那么表示用户按下了热键

switch (m.Msg)

{

case WM_HOTKEY:

Form1.ProcessHotkey(m); // 按下热键时调用Form1主窗体的ProcessHotkey()函数

break;

}

base.WndProc(ref m); // 将系统消息传递自父类的WndProc

}

}

在主窗体需要对Win32 API热键函数进行声明:

[DllImport(‘coredll.dll’)] // 定义一个系统范围的热键

public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, Keys vk);

[DllImport(‘coredll.dll’)] // 在系统中注消热键

public static extern bool UnregisterHotKey(IntPtr hWnd, int id);

// 下面的fsModifoers:定义为了产生WM_HOTKEY消息而必须与由nVirtKey参数定义的键一起按下的键

public enum KeyModifiers

{

None = 0, // 该键不按下

Alt = 1, // 该键为ALT键

Control = 2, // 该键为CTL键

Shift = 4, // 该键为Shift键

Windows = 8 // 该键为任意Windows键

}

在主窗体函数中定义热键:

public Form1()

{

InitializeComponent();

keyUsage = new MyMessageWindow(this);

// 通过构造函数中参数this的传递,主窗体被传入MessageWindow中,主窗体的消息循环按照新的消息循环进行

RegisterHotKey(keyUsage.Hwnd, 100, 0, Keys.D1);

// 定义热键数字键‘1’,请注意句柄是keyUsage.Hwd(而不是Handle)

RegisterHotKey(keyUsage.Hwnd, 200, 0, Keys.D2); // 定义热键数字键‘2’

RegisterHotKey(keyUsage.Hwnd, 300, 0, Keys.D3); // 定义热键数字键‘3’

RegisterHotKey(keyUsage.Hwnd, 400, 0, Keys.D4); // 定义热键数字键‘4’

}

接收MyMessageWindow传递过来的热键消息,并作进一步处理的函数:

public static void ProcessHotkey(Message m)

{

IntPtr id = m.WParam; // IntPtr用于表示指针或句柄的平台特定类型

string sid = id.ToString();

switch (sid)

{

case ‘100’: // 按下了热键‘1’,执行action1()函数

{

action1();

break;

}

case ‘200’: // 按下了热键‘2’,执行action2()函数

{

action2();

break;

}

case ‘300’: // 按下了热键‘3’,执行action3()函数

{

action3();

break;

}

case ‘400’: // 按下了热键‘4’,执行action4()函数

{

action4();

break;

}

}

}

那么接下来,用户只需要在action函数里面添加自己需要进行的操作即可了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • WINDOWS
    +关注

    关注

    3

    文章

    3544

    浏览量

    88666
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6085

    浏览量

    35319
收藏 人收藏

    评论

    相关推荐

    嵌入式主板C#应用程序开发方法

    基于WINCE平台C#编程要点之二
    发表于 09-26 08:09

    信息技术CAN接口COM组件在C#语言领域应用

     ARM9工控主板的一个很大的特色就是提供了标准的CAN总线通讯接口,客户可以方便地在工业现场、汽车、船舶等等领域进行CAN通信应用。由于ARM9嵌入式主板采用
    的头像 发表于 11-12 10:34 2454次阅读
    <b class='flag-5'>英</b><b class='flag-5'>创</b><b class='flag-5'>信息技术</b>CAN接口COM组件在<b class='flag-5'>C#</b>语言领域应用

    信息技术C#使用COM组件接口进行串口操作介绍

    SerialPort供客户使用,该串口类可以灵活方便地进行串口设置、收发等操作,也提供了基于该串口类的C#例程供客户参考。但是,微软所提供的串口类虽然方便灵活,但是没有提供RTS控
    的头像 发表于 11-14 09:37 2327次阅读
    <b class='flag-5'>英</b><b class='flag-5'>创</b><b class='flag-5'>信息技术</b><b class='flag-5'>C#</b>使用COM组件接口进行串口操作<b class='flag-5'>介绍</b>

    信息技术工控主板的复位管理介绍

     公司的工控主板是基于ARM9 CPU、预装正版WinCE的嵌入式主板产品。作为嵌入式应用,系统的可靠启动是其可靠性的重要组成部分。本文针对嵌入式应用的特点、介绍
    的头像 发表于 11-14 10:03 1673次阅读
    <b class='flag-5'>英</b><b class='flag-5'>创</b><b class='flag-5'>信息技术</b>工控主板的复位管理<b class='flag-5'>介绍</b>

    信息技术如何实现WinCE系统中USB设备自动检测概述

    公司ARM9系列工控主板预装正版WinCE操作系统,提供标准USB接口,本文介绍如何在应用程序中判断USB存储设备的插入和移出操作。
    的头像 发表于 11-18 09:44 1387次阅读
    <b class='flag-5'>英</b><b class='flag-5'>创</b><b class='flag-5'>信息技术</b>如何实现<b class='flag-5'>WinCE</b>系统中USB设备自动检测概述

    信息技术WinCE工控主板的数据库配置简介

    。由于公司的产品处于不断发展之中,WinCE也在不断的发展之中,导致在不同型号的产品中存在配置的数据库的情况有所不同,本文的主要目的是详细介绍
    的头像 发表于 01-14 11:35 1478次阅读

    信息技术嵌入式系统设备驱动接口的C#编程

    ARM9系列嵌入式主板,均预装了WinCE 5.0、WinCE 6.0操作系统,用户可使用标准的C/
    的头像 发表于 01-15 11:29 1297次阅读

    信息技术WinCE远程桌面介绍

    公司WinCE系列工控主板,即可以支持多种格式的单色点阵液晶,也可以支持从320240到1024768的各种分辨率的彩色TFT LCD,借助WinCE强大的GUI,用户可以很容易的
    的头像 发表于 01-16 10:24 2958次阅读
    <b class='flag-5'>英</b><b class='flag-5'>创</b><b class='flag-5'>信息技术</b><b class='flag-5'>WinCE</b>远程桌面<b class='flag-5'>介绍</b>

    信息技术C/C#开发基于WEC7的CAN通讯介绍

    EM335x工控主板,使用的Cortex-A8及WEC7操作系统。本文以EM335x工控主板光盘例程为例,简单介绍一下C
    的头像 发表于 01-17 10:01 2709次阅读
    <b class='flag-5'>英</b><b class='flag-5'>创</b><b class='flag-5'>信息技术</b><b class='flag-5'>C</b>/<b class='flag-5'>C#</b>开发基于WEC7的CAN通讯<b class='flag-5'>介绍</b>

    信息技术WinCE平台下通过系统异常信息定位程序bug位置

    使用基于WINCE平台系列工控主板进行应用程序开发时,当程序产生异常退出,CE操作系统将通过调试串口打印类似如下错误信息。根据这些
    的头像 发表于 01-17 11:14 1323次阅读
    <b class='flag-5'>英</b><b class='flag-5'>创</b><b class='flag-5'>信息技术</b><b class='flag-5'>WinCE</b><b class='flag-5'>平台</b>下通过系统异常<b class='flag-5'>信息</b>定位程序bug位置

    信息技术主板WinCE应用程序的FTP远程更新介绍

    公司推出的嵌入式工控主板产品系列,均预装了正版的WinCE5.0、WinCE6.0、WCE7操作系统。微软的WINCE实时多任务操作系统
    的头像 发表于 02-03 09:00 1496次阅读
    <b class='flag-5'>英</b><b class='flag-5'>创</b><b class='flag-5'>信息技术</b>主板<b class='flag-5'>WinCE</b>应用程序的FTP远程更新<b class='flag-5'>介绍</b>

    信息技术WinCE工控主板开发常见问题介绍

    开发工具选择 嵌入式主板,预装操作系统可以分为WinCE5.0、WinCE6.0、WEC7、WEC2013,不同主板适用的开发工具不同,适用情况见下表。 型号 操作系统 支持的开发
    的头像 发表于 02-04 11:43 1918次阅读
    <b class='flag-5'>英</b><b class='flag-5'>创</b><b class='flag-5'>信息技术</b><b class='flag-5'>WinCE</b>工控主板开发常见问题<b class='flag-5'>介绍</b>

    信息技术WinCE主板与STM32多功能模块通讯介绍

    ETA321是推出的基于STM32单片机的多功能扩展模块,可为现有的WinCE系统增加AD、DA、PWM、脉冲计数等功能。ETA32
    的头像 发表于 02-06 11:12 2081次阅读

    信息技术WinCE6系统CEDB故障分析介绍

    导致的。直到近期,公司通过大量实验,找到了触发CEDB故障的原因。本文将介绍我们的实验结果,为防止CEDB故障,希望客户注意: 使用WINCE6
    的头像 发表于 02-07 10:30 1061次阅读
    <b class='flag-5'>英</b><b class='flag-5'>创</b><b class='flag-5'>信息技术</b><b class='flag-5'>WinCE</b>6系统CEDB故障分析<b class='flag-5'>介绍</b>

    信息技术WinCE文件系统测试及故障分析简介

    进行了长期分析测试,希望能找到有效办法来规避WINCE文件系统故障。本文主要介绍在这方面的工作及获得的成果。 先前的工作 过去多年,
    的头像 发表于 02-07 11:15 1457次阅读
    <b class='flag-5'>英</b><b class='flag-5'>创</b><b class='flag-5'>信息技术</b><b class='flag-5'>WinCE</b>文件系统测试及故障分析简介