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

网友投稿 346 2022-11-12

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

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

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

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

·SQL CE数据库的C#编程

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

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

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

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

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

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

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

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

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

{

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

else return hfile.AddrOfPinnedObject();

}

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

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

}

}

[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)

{

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函数里面添加自己需要进行的操作即可了。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:基于智能合约技术的HOQU分散营销平台介绍
下一篇:详解如何实现在线聊天系统中的实时消息获取
相关文章

 发表评论

暂时没有评论,来抢沙发吧~