vlcPlayer是一款免费开源的播放器项目,可以播放几乎所有的视频格式。

第一步:获取dll

安装vlcplayer视频播放器,在安装目录下面获取所需的dll。

dll文件夹:plugins

还有2个dll:libvlc.dll,libvlccore.dll

第二步:获取播放器对象基类VlcPlayerBase

  1. using System;
  2. using System.Runtime.InteropServices;
  3. using System.Security;
  4. using System.Text;
  5.  
  6. namespace VlcPlayer
  7. {
  8. public class VlcPlayerBase
  9. {
  10. private IntPtr libvlc_instance_;
  11. private IntPtr libvlc_media_player_;
  12.  
  13. /// <summary>
  14. /// 视频时长
  15. /// </summary>
  16. private double duration_;
  17.  
  18. /// <summary>
  19. /// VLC 播放器。
  20. /// </summary>
  21. /// <param name="pluginPath"></param>
  22. public VlcPlayerBase(string pluginPath)
  23. {
  24. //string pluginPath = Environment.CurrentDirectory + "\\vlc\\plugins\\"; //插件目录
  25. string plugin_arg = "--plugin-path=" + pluginPath;
  26. string[] arguments = { "-I", "dummy", "--ignore-config", "--no-video-title", plugin_arg };
  27. libvlc_instance_ = LibVlcAPI.libvlc_new(arguments);
  28.  
  29. libvlc_media_player_ = LibVlcAPI.libvlc_media_player_new(libvlc_instance_); //创建 libvlc_media_player 播放核心
  30. }
  31.  
  32. /// <summary>
  33. /// 设置播放容器
  34. /// </summary>
  35. /// <param name="wndHandle">播放容器句柄</param>
  36. public void SetRenderWindow(int wndHandle)
  37. {
  38. if (libvlc_instance_ != IntPtr.Zero && wndHandle != )
  39. {
  40. LibVlcAPI.libvlc_media_player_set_hwnd(libvlc_media_player_, wndHandle); //设置播放容器
  41. }
  42. }
  43.  
  44. /// <summary>
  45. /// 播放指定媒体文件
  46. /// </summary>
  47. /// <param name="filePath"></param>
  48. public void LoadFile(string filePath)
  49. {
  50. IntPtr libvlc_media = LibVlcAPI.libvlc_media_new_path(libvlc_instance_, filePath); //创建 libvlc_media_player 播放核心
  51. if (libvlc_media != IntPtr.Zero)
  52. {
  53. LibVlcAPI.libvlc_media_parse(libvlc_media);
  54. duration_ = LibVlcAPI.libvlc_media_get_duration(libvlc_media) / 1000.0; //获取视频时长
  55.  
  56. LibVlcAPI.libvlc_media_player_set_media(libvlc_media_player_, libvlc_media); //将视频绑定到播放器去
  57. LibVlcAPI.libvlc_media_release(libvlc_media);
  58.  
  59. //LibVlcAPI.libvlc_media_player_play(libvlc_media_player_); //播放
  60. }
  61. }
  62.  
  63. /// <summary>
  64. /// 播放
  65. /// </summary>
  66. public void Play()
  67. {
  68. if (libvlc_media_player_ != IntPtr.Zero)
  69. {
  70. LibVlcAPI.libvlc_media_player_play(libvlc_media_player_);
  71. }
  72. }
  73.  
  74. /// <summary>
  75. /// 暂停播放
  76. /// </summary>
  77. public void Pause()
  78. {
  79. if (libvlc_media_player_ != IntPtr.Zero)
  80. {
  81. LibVlcAPI.libvlc_media_player_pause(libvlc_media_player_);
  82. }
  83. }
  84.  
  85. /// <summary>
  86. /// 停止播放
  87. /// </summary>
  88. public void Stop()
  89. {
  90. if (libvlc_media_player_ != IntPtr.Zero)
  91. {
  92. LibVlcAPI.libvlc_media_player_stop(libvlc_media_player_);
  93. }
  94. }
  95.  
  96. public void Release()
  97. {
  98. if (libvlc_media_player_ != IntPtr.Zero)
  99. {
  100. LibVlcAPI.libvlc_media_release(libvlc_media_player_);
  101. }
  102. }
  103.  
  104. /// <summary>
  105. /// 获取播放时间进度
  106. /// </summary>
  107. /// <returns></returns>
  108. public double GetPlayTime()
  109. {
  110. return LibVlcAPI.libvlc_media_player_get_time(libvlc_media_player_) / 1000.0;
  111. }
  112.  
  113. /// <summary>
  114. /// 设置播放时间
  115. /// </summary>
  116. /// <param name="seekTime"></param>
  117. public void SetPlayTime(double seekTime)
  118. {
  119. LibVlcAPI.libvlc_media_player_set_time(libvlc_media_player_, (Int64)(seekTime * ));
  120. }
  121.  
  122. /// <summary>
  123. /// 获取音量
  124. /// </summary>
  125. /// <returns></returns>
  126. public int GetVolume()
  127. {
  128. return LibVlcAPI.libvlc_audio_get_volume(libvlc_media_player_);
  129. }
  130.  
  131. /// <summary>
  132. /// 设置音量
  133. /// </summary>
  134. /// <param name="volume"></param>
  135. public void SetVolume(int volume)
  136. {
  137. LibVlcAPI.libvlc_audio_set_volume(libvlc_media_player_, volume);
  138. }
  139.  
  140. /// <summary>
  141. /// 设置是否全屏
  142. /// </summary>
  143. /// <param name="istrue"></param>
  144. public void SetFullScreen(bool istrue)
  145. {
  146. LibVlcAPI.libvlc_set_fullscreen(libvlc_media_player_, istrue ? : );
  147. }
  148.  
  149. /// <summary>
  150. /// 视频时长
  151. /// </summary>
  152. /// <returns></returns>
  153. public double Duration { get { return duration_; } }
  154.  
  155. /// <summary>
  156. /// 是否正在播放
  157. /// </summary>
  158. public bool IsPlaying
  159. {
  160. get
  161. {
  162. if (Duration > && (int)GetPlayTime() == (int)Duration) this.Stop(); //如果播放完,关闭视频
  163.  
  164. return (int)GetPlayTime() < (int)Duration /* 播放时间进度小于视频时长 */
  165. && Duration > /* 播放时间进度大于0 */
  166. && GetPlayTime() > ; /* 视频时长大于0 */
  167. }
  168. }
  169.  
  170. /// <summary>
  171. /// 获取版本(VS2015 调试模式程序会直接崩掉)
  172. /// </summary>
  173. /// <returns></returns>
  174. public string Version { get { return LibVlcAPI.libvlc_get_version(); } }
  175.  
  176. }
  177.  
  178. #region vlclib.dll
  179.  
  180. internal static class LibVlcAPI
  181. {
  182. internal struct PointerToArrayOfPointerHelper
  183. {
  184. [MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
  185. public IntPtr[] pointers;
  186. }
  187.  
  188. /// <summary>
  189. /// 传入播放参数
  190. /// </summary>
  191. /// <param name="arguments"></param>
  192. /// <returns></returns>
  193. public static IntPtr libvlc_new(string[] arguments)
  194. {
  195. PointerToArrayOfPointerHelper argv = new PointerToArrayOfPointerHelper();
  196. argv.pointers = new IntPtr[];
  197.  
  198. for (int i = ; i < arguments.Length; i++)
  199. {
  200. argv.pointers[i] = Marshal.StringToHGlobalAnsi(arguments[i]); //将托管 System.String 中的内容复制到非托管内存,并在复制时转换为 ANSI 格式。
  201. }
  202.  
  203. IntPtr argvPtr = IntPtr.Zero;
  204. try
  205. {
  206. int size = Marshal.SizeOf(typeof(PointerToArrayOfPointerHelper)); //返回非托管类型的大小(以字节为单位)。
  207. argvPtr = Marshal.AllocHGlobal(size); //从进程的非托管内存中分配内存。
  208. Marshal.StructureToPtr(argv, argvPtr, false); //将数据从托管对象封送到非托管内存块。
  209.  
  210. return libvlc_new(arguments.Length, argvPtr); //创建一个libvlc实例,它是引用计数的
  211. }
  212. finally
  213. {
  214. for (int i = ; i < arguments.Length + ; i++)
  215. {
  216. if (argv.pointers[i] != IntPtr.Zero)
  217. {
  218. Marshal.FreeHGlobal(argv.pointers[i]); //释放以前使用 System.Runtime.InteropServices.Marshal.AllocHGlobal(System.IntPtr) 从进程的非托管内存中分配的内存。
  219. }
  220. }
  221.  
  222. if (argvPtr != IntPtr.Zero) { Marshal.FreeHGlobal(argvPtr);/* 释放以前使用 System.Runtime.InteropServices.Marshal.AllocHGlobal(System.IntPtr) 从进程的非托管内存中分配的内存。 */ }
  223. }
  224. }
  225.  
  226. /// <summary>
  227. /// 从本地文件系统路径新建,其他参照上一条
  228. /// </summary>
  229. /// <param name="libvlc_instance"></param>
  230. /// <param name="path"></param>
  231. /// <returns></returns>
  232. public static IntPtr libvlc_media_new_path(IntPtr libvlc_instance, string path)
  233. {
  234. IntPtr pMrl = IntPtr.Zero;
  235. try
  236. {
  237. byte[] bytes = Encoding.UTF8.GetBytes(path);
  238. pMrl = Marshal.AllocHGlobal(bytes.Length + );
  239. Marshal.Copy(bytes, , pMrl, bytes.Length);
  240. Marshal.WriteByte(pMrl, bytes.Length, );
  241. return libvlc_media_new_path(libvlc_instance, pMrl); // 从本地文件路径构建一个libvlc_media
  242. }
  243. finally
  244. {
  245. if (pMrl != IntPtr.Zero) { Marshal.FreeHGlobal(pMrl);/* 释放以前使用 System.Runtime.InteropServices.Marshal.AllocHGlobal(System.IntPtr) 从进程的非托管内存中分配的内存。 */ }
  246. }
  247. }
  248.  
  249. /// <summary>
  250. /// 使用一个给定的媒体资源路径来建立一个libvlc_media对象.参数psz_mrl为要读取的MRL(Media Resource Location).此函数返回新建的对象或NULL.
  251. /// </summary>
  252. /// <param name="libvlc_instance"></param>
  253. /// <param name="path"></param>
  254. /// <returns></returns>
  255. public static IntPtr libvlc_media_new_location(IntPtr libvlc_instance, string path)
  256. {
  257. IntPtr pMrl = IntPtr.Zero;
  258. try
  259. {
  260. byte[] bytes = Encoding.UTF8.GetBytes(path);
  261. pMrl = Marshal.AllocHGlobal(bytes.Length + );
  262. Marshal.Copy(bytes, , pMrl, bytes.Length);
  263. Marshal.WriteByte(pMrl, bytes.Length, );
  264. return libvlc_media_new_path(libvlc_instance, pMrl); // 从本地文件路径构建一个libvlc_media
  265. }
  266. finally
  267. {
  268. if (pMrl != IntPtr.Zero) { Marshal.FreeHGlobal(pMrl);/* 释放以前使用 System.Runtime.InteropServices.Marshal.AllocHGlobal(System.IntPtr) 从进程的非托管内存中分配的内存。 */ }
  269. }
  270. }
  271.  
  272. // ----------------------------------------------------------------------------------------
  273. // 以下是libvlc.dll导出函数
  274.  
  275. /// <summary>
  276. /// 创建一个libvlc实例,它是引用计数的
  277. /// </summary>
  278. /// <param name="argc"></param>
  279. /// <param name="argv"></param>
  280. /// <returns></returns>
  281. [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
  282. [SuppressUnmanagedCodeSecurity]
  283. private static extern IntPtr libvlc_new(int argc, IntPtr argv);
  284.  
  285. /// <summary>
  286. /// 释放libvlc实例
  287. /// </summary>
  288. /// <param name="libvlc_instance"></param>
  289. [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
  290. [SuppressUnmanagedCodeSecurity]
  291. public static extern void libvlc_release(IntPtr libvlc_instance);
  292.  
  293. /// <summary>
  294. /// 获取版本
  295. /// </summary>
  296. /// <returns></returns>
  297. [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
  298. [SuppressUnmanagedCodeSecurity]
  299. public static extern String libvlc_get_version();
  300.  
  301. /// <summary>
  302. /// 从视频来源(例如Url)构建一个libvlc_meida
  303. /// </summary>
  304. /// <param name="libvlc_instance"></param>
  305. /// <param name="path"></param>
  306. /// <returns></returns>
  307. [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
  308. [SuppressUnmanagedCodeSecurity]
  309. private static extern IntPtr libvlc_media_new_location(IntPtr libvlc_instance, IntPtr path);
  310.  
  311. /// <summary>
  312. /// 从本地文件路径构建一个libvlc_media
  313. /// </summary>
  314. /// <param name="libvlc_instance"></param>
  315. /// <param name="path"></param>
  316. /// <returns></returns>
  317. [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
  318. [SuppressUnmanagedCodeSecurity]
  319. private static extern IntPtr libvlc_media_new_path(IntPtr libvlc_instance, IntPtr path);
  320.  
  321. /// <summary>
  322. ///
  323. /// </summary>
  324. /// <param name="libvlc_media_inst"></param>
  325. [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
  326. [SuppressUnmanagedCodeSecurity]
  327. public static extern void libvlc_media_release(IntPtr libvlc_media_inst);
  328.  
  329. /// <summary>
  330. /// 创建libvlc_media_player(播放核心)
  331. /// </summary>
  332. /// <param name="libvlc_instance"></param>
  333. /// <returns></returns>
  334. [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
  335. [SuppressUnmanagedCodeSecurity]
  336. public static extern IntPtr libvlc_media_player_new(IntPtr libvlc_instance);
  337.  
  338. /// <summary>
  339. /// 将视频(libvlc_media)绑定到播放器上
  340. /// </summary>
  341. /// <param name="libvlc_media_player"></param>
  342. /// <param name="libvlc_media"></param>
  343. [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
  344. [SuppressUnmanagedCodeSecurity]
  345. public static extern void libvlc_media_player_set_media(IntPtr libvlc_media_player, IntPtr libvlc_media);
  346.  
  347. /// <summary>
  348. /// 设置图像输出的窗口
  349. /// </summary>
  350. /// <param name="libvlc_mediaplayer"></param>
  351. /// <param name="drawable"></param>
  352. [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
  353. [SuppressUnmanagedCodeSecurity]
  354. public static extern void libvlc_media_player_set_hwnd(IntPtr libvlc_mediaplayer, Int32 drawable);
  355.  
  356. #region 播放控制
  357. /// <summary>
  358. /// 播放
  359. /// </summary>
  360. /// <param name="libvlc_mediaplayer"></param>
  361. [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
  362. [SuppressUnmanagedCodeSecurity]
  363. public static extern void libvlc_media_player_play(IntPtr libvlc_mediaplayer);
  364.  
  365. /// <summary>
  366. /// 暂停
  367. /// </summary>
  368. /// <param name="libvlc_mediaplayer"></param>
  369. [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
  370. [SuppressUnmanagedCodeSecurity]
  371. public static extern void libvlc_media_player_pause(IntPtr libvlc_mediaplayer);
  372.  
  373. /// <summary>
  374. /// 停止
  375. /// </summary>
  376. /// <param name="libvlc_mediaplayer"></param>
  377. [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
  378. [SuppressUnmanagedCodeSecurity]
  379. public static extern void libvlc_media_player_stop(IntPtr libvlc_mediaplayer);
  380. #endregion
  381.  
  382. /// <summary>
  383. /// 释放播放文件
  384. /// </summary>
  385. /// <param name="libvlc_mediaplayer"></param>
  386. [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
  387. [SuppressUnmanagedCodeSecurity]
  388. public static extern void libvlc_media_player_release(IntPtr libvlc_mediaplayer);
  389.  
  390. /// <summary>
  391. /// 解析视频资源的媒体信息(如时长等)
  392. /// </summary>
  393. /// <param name="libvlc_media"></param>
  394. [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
  395. [SuppressUnmanagedCodeSecurity]
  396. public static extern void libvlc_media_parse(IntPtr libvlc_media);
  397.  
  398. /// <summary>
  399. /// 返回视频的时长(必须先调用libvlc_media_parse之后,该函数才会生效)
  400. /// </summary>
  401. /// <param name="libvlc_media"></param>
  402. /// <returns></returns>
  403. [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
  404. [SuppressUnmanagedCodeSecurity]
  405. public static extern Int64 libvlc_media_get_duration(IntPtr libvlc_media);
  406.  
  407. #region 播放时间进度
  408.  
  409. /// <summary>
  410. /// 当前播放的时间进度
  411. /// </summary>
  412. /// <param name="libvlc_mediaplayer"></param>
  413. /// <returns></returns>
  414. [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
  415. [SuppressUnmanagedCodeSecurity]
  416. public static extern Int64 libvlc_media_player_get_time(IntPtr libvlc_mediaplayer);
  417.  
  418. /// <summary>
  419. /// 设置播放位置(拖动)
  420. /// </summary>
  421. /// <param name="libvlc_mediaplayer"></param>
  422. /// <param name="time"></param>
  423. [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
  424. [SuppressUnmanagedCodeSecurity]
  425. public static extern void libvlc_media_player_set_time(IntPtr libvlc_mediaplayer, Int64 time);
  426.  
  427. #endregion
  428.  
  429. #region 音量
  430.  
  431. /// <summary>
  432. /// 获取音量
  433. /// </summary>
  434. /// <param name="libvlc_media_player"></param>
  435. /// <returns></returns>
  436. [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
  437. [SuppressUnmanagedCodeSecurity]
  438. public static extern int libvlc_audio_get_volume(IntPtr libvlc_media_player);
  439.  
  440. /// <summary>
  441. /// 设置音量
  442. /// </summary>
  443. /// <param name="libvlc_media_player"></param>
  444. /// <param name="volume"></param>
  445. [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
  446. [SuppressUnmanagedCodeSecurity]
  447. public static extern void libvlc_audio_set_volume(IntPtr libvlc_media_player, int volume);
  448.  
  449. #endregion
  450.  
  451. /// <summary>
  452. /// 设置全屏
  453. /// </summary>
  454. /// <param name="libvlc_media_player"></param>
  455. /// <param name="isFullScreen"></param>
  456. [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
  457. [SuppressUnmanagedCodeSecurity]
  458. public static extern void libvlc_set_fullscreen(IntPtr libvlc_media_player, int isFullScreen);
  459.  
  460. /// <summary>
  461. /// 获取播放状态。(Win10 不支持)
  462. /// </summary>
  463. /// <param name="libvlc_mediaplayer"></param>
  464. /// <returns></returns>
  465. //[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
  466. //[SuppressUnmanagedCodeSecurity]
  467. //public static extern Int64 libvlc_media_player_get_state(IntPtr libvlc_mediaplayer);
  468.  
  469. }
  470.  
  471. #endregion
  472.  
  473. }

第三步:写代码实现

  1. string pluginPath = Environment.CurrentDirectory + "\\plugins\\"; //插件目录
  2. player = new VlcPlayerBase(pluginPath);
  3. player.SetRenderWindow((int)pnlVideo.Handle);//panel
  4. player.LoadFile(videoName[]);//视频文件路径

设置音量:

int volume = this.player.GetVolume();
volume--;
if (volume <0) volume = 0;
this.player.SetVolume(volume);

还有播放状态设置:

this.player.Play();

this.player.Pause();

this.player.Stop();

其他设置:

int durationSecond = (int)this.player.Duration;
int playTimeSecond = (int)this.player.GetPlayTime();

this.player.SetPlayTime(this.tkbProgress.Value);

c# winform vlcPlayer播放器的更多相关文章

  1. WinForm媒体播放器

    媒体播放控件(Windows Media Player )的常用属性和方法,并且利用它设计一个简单的媒体应用程序——媒体播放器.该媒体播放器可以播放 wav.avi.mid 和 mp3 等格式的文件. ...

  2. c# winform DirectX播放器 可以任意设置宽高比 屏幕拉伸

    第一步:dll引用 Microsoft.DirectX.dll Microsoft.DirectX.AudioVideoPlayback.dll 如果没有的话,可能需要安装微软的DRECTX JDK ...

  3. winform音频播放器(有声小说[凡人修仙传])

    该程序采用多线程的技术及DataGridView单元格扩展的技术 1.获取下载列表 private void GetDownList() { //System.Web.HttpUtility.UrlD ...

  4. 小菜学习Winform(二)WMPLib实现音乐播放器

    前言 现在网上有很多的音乐播放器,但好像都不是.net平台做的,在.net中实现音乐文件的播放功能很简单,下面就简单实现下. SoundPlayer类 在.net提供了音乐文件的类:SoundPlay ...

  5. winform下的简易播放器

    编写这个播放器,遇到很多问题,比如目前只实现了wav音频文件的播放,而对于这个图中中间所标注的按钮 不能实现让其暂停的功能,同时当点击的时候,让其文本变为"▷",对于这部分功能不知 ...

  6. C# VLCPlayer视频播放器(附源码)

    VLCPlayer视频播放器. 支持本地播放,支持网络URL.支持全屏,截图. 基于VLCPlayer. 附带基本代码. 下载地址:http://pan.baidu.com/s/1nvjNvID

  7. .NET中使用APlayer组件自制播放器

    目录 说明 APlayer介绍 APlayer具备功能 APlayer使用 自制播放器Demo 未完成工作 源码下载 说明 由于需求原因,需要在项目中(桌面程序)集成一个在线播放视频的功能.大概要具备 ...

  8. AR播放器

    一.项目需求 AR播放器:将一系列带透明通道的图片以一定的帧率连续显示,叠加载摄像头采集的画面之上,并播放声音. 此为最初级的AR技术,因为画面是事先渲染好的,固定不变的,所以实际上并不能实现“互动” ...

  9. 在Winform中播放视频等【DotNet,C#】

    在项目中遇到过这样的问题,就是如何在Winform中播放视频.当时考察了几种方式,第一种是直接使用Windows Media Player组件,这种最简单:第二种是利用DirectX直接在窗体或者控件 ...

随机推荐

  1. 【30集iCore3_ADP出厂源代码(ARM部分)讲解视频】30-1 前言

    视频简介: 该视频介绍收到iCore3应用开发平台后如何获取出厂代码,以 及如何下载出厂代码到应用开发平台中. 源视频包下载地址: http://pan.baidu.com/s/1nuUZW17   ...

  2. CentOS 6.6 安装 Node.js

    node.js 的 GitHub 地址是:https://github.com/nodejs/node 官网源码包下载地址时:https://nodejs.org/en/download/ ① 获取并 ...

  3. 简单而兼容性好的Web自适应高度布局,纯CSS

    纯CSS实现的自适应高度布局,中间内容不符自动滚动条.兼容IE9以上.chrome.FF.关键属性是box-sizing: border-box. 不废话,直接上代码: <!doctype ht ...

  4. C# 关键字【转】

      C#中的关键字 关键字是对编译器具有特殊意义的预定义保留标识符.它们不能在程序中用作标识符,除非它们有一个 @ 前缀.例如,@if 是有效的标识符,但 if 不是,因为 if 是关键字. 下面是列 ...

  5. 使用Python写Windows Service服务程序

    1.背景 如果你想用Python开发Windows程序,并让其开机启动等,就必须写成windows的服务程序Windows Service,用Python来做这个事情必须要借助第三方模块pywin32 ...

  6. JMeter学习-039-JMeter 3.0 生成 dashboard HTML 报告图表中文乱码

    近期,经常有人问 JMeter 3.0 使用时,生成的 HTML 报告图表中的中文乱码问题.在此,简略的说一下解决的方法. 编码相关信息如下: 1.查看控制 csv.xml 等配置结果文件生成.读取的 ...

  7. JMeter学习-035-JMeter调试工具之二---Debug PostProcessor

    前文 JMeter学习-034-JMeter调试工具之一---HTTP Mirror Server讲述了HTTP镜像服务器在调试请求入参时的实例应用.此文我们讲述另一种测试脚本调试工具的使用. 前置处 ...

  8. SecureCRT连接VirtualBox下的ubuntu以及NMP的搭建与通过宿主机访问该NGINX服务器过程

    一直使用wamp作为开发环境,只是工作中时常会遇到在wamp下没问题但是提交到服务器生产环境会出现一些意想不到的情况,由此萌生了在本机搭建LNMP环境的想法,我个人不知道其他人的虚拟机搭建服务器环境是 ...

  9. EXC_ARM_DA_ALIGN

    ios 版本上的问题  armv7  ipad2 int64 t = *(int64*)pBuff; 如果pBuff不是8字节对齐的地址就 crash 变通的方法是通过memcpy __sync_fe ...

  10. DOM的概念(1)

    什么是DOM? 通过 JavaScript,您可以重构整个HTML文档.您可以添加.移除.改变或重排页面上的项目.要改变页面的某个东西,JavaScript就需要对HTML文档中所有元素进行访问的入口 ...