【WP8.1开发】用手机来控制电脑的多媒体播放

为了用电脑看电影时方便控制,我就突发其想,做一个手机app来通过无线网络远程调节电脑上的音量。后来进行尝试成功后,我就想,光是调音量似乎单调了些,就把播放/暂停,上一首,下一首,等多媒体控制功能也加上,这样好玩一点。

下面向大家简单介绍一下原理,整个解决方案的源代码我会共享给大家,以作参考。

先说服务器,因为控制命令比较简单,我直接用一个WPF应用程序来完成,这样方便运行,用socket来通信比较麻烦,我就用WCF来做服务,使用WebServiceHoset,让WP手机客户端用HTTP-POST的方式来调用。

这个相信大家都会,还有一个核心,就是如何控制系统的多媒体功能? 其实大家应该发现在你的笔记本键盘上,有一排功能按钮,可以通过按这些键来调整音量,控制播放、上一首歌曲等,还有各种功能开关,比如打开/关闭无线功能等。

也就是说,只要代码能够模拟发出这些按键就可以实现控制了,这就要用到Win32 API中的SendInput函数。在最初尝试时,我将SendInput函数导进托管代码中,但调用没有反应,不知道是不是我Import不对。

后来,我干脆用C++来写一个dll,把各个控制操作都用独立的导出函数来包装,再把自己写的dll中的导出函数在托管项目中DllImport。

自己编写的dll的头文件如下:

#pragma once
#include "stdafx.h"

/* 增大音量 */
extern "C" __declspec(dllexport) void volume_up();

/* 减小音量 */
extern "C" __declspec(dllexport) void volume_down();

/* 静音/恢复 */
extern "C" __declspec(dllexport) void volume_mute();

/* 下一首 */
extern "C" __declspec(dllexport) void media_next_track();

/* 上一首 */
extern "C" __declspec(dllexport) void media_prev_track();

/* 播放/暂停 */
extern "C" __declspec(dllexport) void media_play_pause();

/* 停止 */
extern "C" __declspec(dllexport) void media_stop();

void send_input_core(WORD vkey);

__declspec(dllexport)注明的函数为导出函数,即可以在其他代码中使用,而最后的send_input_core函数只供dll内部使用,就不再导出了。

注意要加上extern "C",让函数以C语言的规范进行导出,由于C语言不支持函数重载,在编译时编译器不会改变函数的名字,所以加上extern "C"让托管代码在Dll Import时可以直接使用函数的原名,这样就不需要编写复杂的模块定义文件来重命名符号了,这种方法写dll是最方便的。

下面在cpp文件中实现send_input_core函数:

void send_input_core(WORD vkey) {
    INPUT input;
    input.type = INPUT_KEYBOARD;
    input.ki.dwFlags = NULL;
    input.ki.wVk = vkey;
    SendInput(1, &input, sizeof(INPUT));
}

用vkey参数来接收要模拟的按键,这样就不用重复写SendInput的调用代码了,其余的函数可以直接调用该函数,然后传递按键值就可以了。

void volume_up() {
    send_input_core(VK_VOLUME_UP);
}

void volume_down()
{
    send_input_core(VK_VOLUME_DOWN);
}

void volume_mute() {
    send_input_core(VK_VOLUME_MUTE);
}

void media_next_track()
{
    send_input_core(VK_MEDIA_NEXT_TRACK);
}

void media_prev_track() {
    send_input_core(VK_MEDIA_PREV_TRACK);
}

void media_play_pause() {
    send_input_core(VK_MEDIA_PLAY_PAUSE);
}

void media_stop()
{
    send_input_core(VK_MEDIA_STOP);
}

完成dll后,就导入到C#托管代码中:

namespace DllAPIs
{
    using System;
    using System.Runtime.InteropServices;

    public sealed class MediaControlAPIs
    {
        // dll文件的名字
        const string DLL_NAME = "mediactrllib.dll";

        #region 从dll导入的API

        [DllImport(DLL_NAME)]
        extern static void volume_up();

        [DllImport(DLL_NAME)]
        extern static void volume_down();

        [DllImport(DLL_NAME)]
        extern static void volume_mute();

        [DllImport(DLL_NAME)]
        extern static void media_next_track();

        [DllImport(DLL_NAME)]
        extern static void media_prev_track();

        [DllImport(DLL_NAME)]
        extern static void media_play_pause();

        [DllImport(DLL_NAME)]
        extern static void media_stop();

        #endregion

        #region 公共方法

        /// <summary>
        /// 增大音量
        /// </summary>
        public static void VolumeUp()
        {
            volume_up();
        }

        /// <summary>
        /// 减小音量
        /// </summary>
        public static void VolumeDown()
        {
            volume_down();
        }

        /// <summary>
        /// 静音/恢复
        /// </summary>
        public static void VolumeMute()
        {
            volume_mute();
        }

        /// <summary>
        /// 下一曲目
        /// </summary>
        public static void MediaNextTrack()
        {
            media_next_track();
        }

        /// <summary>
        /// 上一曲目
        /// </summary>
        public static void MediaPrevTrack()
        {
            media_prev_track();
        }

        /// <summary>
        /// 播放/暂停
        /// </summary>
        public static void MediaPlayPause()
        {
            media_play_pause();
        }

        /// <summary>
        /// 停止播放
        /// </summary>
        public static void MediaStop()
        {
            media_stop();
        }

        #endregion
    }
}

我想,这样导入要比直接导入Win32 API要简便得多。

接着,完成WCF服务。

    [ServiceContract]
    public interface IService
    {
        [OperationContract]
        [WebInvoke(UriTemplate = "invoke?action={act}")]
        void Invoke(string act);
    }

    public class WcfService : IService
    {
        public void Invoke(string act)
        {
            switch (act)
            {
                case "vu": //增大音量
                    DllAPIs.MediaControlAPIs.VolumeUp();
                    break;
                case "vd": //减小音量
                    DllAPIs.MediaControlAPIs.VolumeDown();
                    break;
                case "vm": //静音/恢复
                    DllAPIs.MediaControlAPIs.VolumeMute();
                    break;
                case "mn": //下一首
                    DllAPIs.MediaControlAPIs.MediaNextTrack();
                    break;
                case "mp": //上一首
                    DllAPIs.MediaControlAPIs.MediaPrevTrack();
                    break;
                case "mpp": //播放/暂停
                    DllAPIs.MediaControlAPIs.MediaPlayPause();
                    break;
                case "ms": //停止
                    DllAPIs.MediaControlAPIs.MediaStop();
                    break;
            }
        }
    }

其他代码就不介绍了,大家看源码吧。

最后是实现手机客户端,其实就是用HTTP-POST向刚才的WCF服务发数据即可。

        private async Task PostActionAsync(string action)
        {
            string postUri = string.Format("http://{0}:{1}/invoke?action={2}", HostName, Port, action);
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(postUri);
            request.Method = "POST";
            var rep = await request.GetResponseAsync();
        }

最后看看结果:

 

源代码下载:http://files.cnblogs.com/tcjiaan/RemoteMediaControlSlsn.zip

时间: 2024-10-28 10:10:45

【WP8.1开发】用手机来控制电脑的多媒体播放的相关文章

Window phone用手机来控制电脑的多媒体播放

为了用电脑看电影时方便控制,我就突发其想,做一个手机app来通过无线网络远程调节电脑上的音量.后来进行尝试成功后,我就想,光是调音量似乎单调了些,就把播放/暂停,上一首,下一首,等多媒体控制功能也加上,这样好玩一点. 下面向大家简单介绍一下原理,整个解决方案的源代码我会共享给大家,以作参考. 先说服务器,因为控制命令比较简单,我直接用一个WPF应用程序来完成,这样方便运行,用socket来通信比较麻烦,我就用WCF来做服务,使用WebServiceHoset,让WP手机客户端用HTTP-POST

Andy - 又一款速度流畅的免费安卓 Android 模拟器 (支持手机无线控制电脑模拟器)

随着 Genymotion.BlueStacks 等电脑上的 Android 模拟器流行起来之后,似乎很多人都发现在电脑上运行使用安卓APP软件.畅玩手机游戏确实很有乐趣. 今天我们又发现了一款全新免费的 Android 模拟器——Andy!官方表示 Andy 将支持 Windows.Mac 以及 Linux (目前仅发布了Win版).模拟器的使用效果基本上和前两者一样,都可以比较流畅地在电脑上运行安卓应用程序.而 Andy 有特色的地方是提供了远程控制功能,可以在 Android 手机/平板上

开发时手机连接连接电脑局域网

首先通过   方法一:命令查看法   点击电脑左下方“开始”   点击”运行”   在“运行”里输入:cmd  然后回车.如下图:   在出现的对话框内输入:ipconfig   接下来直接回车了,就可以了查看到电脑IP了.   方法二:网上邻居查看法   找到桌面上的“网上邻居”——“属性”进入如下图界面:   接下来有两种方法直接查看电脑IP地址: 第一种方法查看:直接双击“本地连接”——选择”支持“如下图所示:   第二种方法查看:右击“本地连接”——“属性”——“常规”——“Intern

触控鼠标 (使用手机控制电脑,支持IOS,android.OSx 和windows)进入初步推广阶段

这款应用主要是用于使用手机控制电脑,几乎涉猎全平台(android 和 ios,windows 和os x),其实在1个月之前已经上线了,一直也比较忙,也就没有对这个应用进行一个系统的介绍和推广,今天就先写篇博文对这款应用进行一下系统的介绍和推广.从开始有一个开发自己的app 到有了这个开发思路,再到最后的app store 上线大概用了2个半月吧.因为是个人开发所以大部分都是用晚上和周末的时间做的,所以开发周期也就比较长点了. 从网站,到电脑服务端再到android 和iphone 手机端,完

“小懒虫”安卓手机控制电脑关机

背景 好多次晚上,躺在床上听着电脑放的音乐休息,听着听着眼睛睁不开,睡意涌上来,往往这时候我实在是不舍得起来关灯,关电脑,因为起来了很可能浓浓的睡意就没有了,又有精神了,所以就想着写个东西能用手机控制把灯和电脑关掉.今天上海的天气很热,看书实在是看不下去,敲敲程序吧,然后就有了"小懒虫". 解决方案 写这个软件的时候,想着两种解决方案,如下图 之所以有方案2,是我当时想不到怎么用手机APP获取到运行在电脑的服务端的IP,总不能我起床看看服务端IP是多少,然后再输入IP关机吧,那样的话我

手机控制电脑,在WIFI局域网下(关机,重启,遥控)

这个软件叫百变遥控:http://blog.sina.com.cn/s/blog_9abc7dbc0101hmut.html 今天周末,在家里看电影,家里用的是台式电脑,我自己买了一个投影仪来专门看视频节目的,因为投影仪是和电脑连接的,所以每次换集啊,想快进啊,就非常不方便,得跑去操作电脑,天冷啊,躺在床上不想动啊,所以想能用手机来操作电脑,于是在网上找了找. 我以前是用的TeamViewer和花生壳来远程控制我的公司里的办公电脑的,但这两个玩意有个问题,它们是需要通过这两个软件的中央服务器来转

手机控制电脑定时关机,重启WiFi

需求 晚上上床,电脑开着WiFi让手机上网.要么上床之前就给电脑设置定时关机:要么就电脑开通宵:要么就待会下来关电脑.这3种情况都非常不好,要么麻烦,要么浪费. 最无奈的是电脑刚开好WiFi,上床后才发现,手机虽然连上了WiFi,但是不能上网.于是蛋疼的从床上爬下来重启WiFi. 昨晚突发奇想如果能够在床上用手机控制电脑定时关机该多好.刚好今天凌晨咳嗽到睡不着,干脆起来实现它. 想法 因为电脑和手机在以上2种情况都是连通的,所以手机可以轻松访问电脑,那么就要把电脑部署成服务器. 然后让手机以网页

配个小黑盒,手机也能控制电脑来办公

供职于一家广告策划公司的我,日常会在路上接收到甲方突如其来的修改意见.你说要是改个普通的Word文档那还算简单.但,很多时候并没有这么简单.很多时候,往往是PPT的配图.Word的排版.甚至还方案里面杂七杂八的数据矫正等等一起都要修改.都不是手机能够简单搞定的. 甲方往往也不会管你现在是六点还是八点,不管你是在公交车上还是地铁里,一个电话.一条信息,你就得马上改并且反馈新的方案版本. --大哥!我可是在路上啊!你让我怎么改啊? 接下来的要介绍的小黑盒子就可以为各位从事策划的同行们解决这个烦恼.

C#开发Android手机应用全接触(mono for android)

    .NET 也能开发Android手机应用了 (交流学习QQ:1337192913)     分享的这套课程是随风老师的关于C#开发Android手机应用全接触. Mono for Android就是原先的MonoDroid,由于商标问题(名称中含有Droid),现在改名为Mono for Android. Mono for Android提供了一个基于Android的Mono虚拟机,让开发者可以用C#开发Android应用程序.另外,Dalvik API已经被绑定至C#,你可以用C#方便