【问题标题】:What is involve in creating a music player in .NET? [closed]在 .NET 中创建音乐播放器涉及什么? [关闭]
【发布时间】:2010-02-14 15:27:53
【问题描述】:

我一直想做一个音乐播放器。但我不知道该怎么做。我不需要它是跨游戏形式,只要它有效。

每个部分都有自己的问题,但如果我遗漏任何部分,请告诉我。我把它分解成简单的、未知的和冗长的

简单

  • 使用对话框选择文件/目录
  • 保存播放列表和其他设置(json 我选你!)
  • 在 GUI 中对数据进行排序

有点困难

  • 全局键,所以我不需要切换到播放器窗口(我知道 .NET 不支持这个:()
  • 搜索歌曲(允许艺术家和专辑与标题混合并获得认为最好的结果)

未知

  • 在 MP3、AAC 和 OGG 支持的情况下播放带有暂停和停止的实际音乐
  • 歌曲信息(艺术家、专辑、标题、年份)

当我开始时,我有一种感觉,这需要很长时间才能完成。 我计划在 C# 中执行此操作。我必须使用外部库来获取歌曲信息吗?其中之一比某些人可能认为的更难吗?关于上述任何一项的任何警告?

【问题讨论】:

    标签: .net


    【解决方案1】:

    我认为了解如何构建音乐播放器的最佳方法是检查现有播放器的来源:) 在这种情况下,我建议查看Banshee,它是用 C# 编写的,是一个领先的 Linux 音乐播放器之一 - 即将在 Windows 上发布。

    【讨论】:

      【解决方案2】:

      我建议,与其尝试自己承担这样的项目,不如在 SourceForge、GitHub 或其他 OS 项目网站上找到一个开源音乐播放器,然后加入该项目。有很多开源媒体播放器,所以我相信其中一个会符合您的目标。

      祝你好运,

      【讨论】:

      • 尽管我同意,但我相信这也取决于他是否正在尝试构建一个项目以作为产品发布并与其他解决方案共享相同的市场,或者他是否将其作为一个教训,如果他想让这个玩家学习,首先从头开始可能会教授许多概念,这些概念对于初学者来说在成熟的代码库上很难掌握 - 并不是说​​开源项目不会提供很多知识,它肯定一个来源。
      【解决方案3】:

      首先,虽然您可能会通过加入现有项目为世界做出更多贡献,但我要说:我的乐趣在哪里?因此,如果您这样做是为了学习和享受乐趣,那么您应该全力以赴。

      全局键

      是的,可以通过挂钩到 Windows 消息循环来实现。它需要 user32.dll 和 kernel32.dll 的 dll 导入。我以前做过这样的事情:

      using System;
      using System.Diagnostics;
      using System.Runtime.InteropServices;
      
      namespace DevBoard.App
      {
          internal class InterceptKeys
          {
              #region Delegates
      
              public delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
      
              #endregion
      
              private const int WH_KEYBOARD_LL = 13;
              private const int WM_KEYDOWN = 0x0100;
      
              public static IntPtr SetHook(LowLevelKeyboardProc proc)
              {
                  using (Process curProcess = Process.GetCurrentProcess())
                  using (ProcessModule curModule = curProcess.MainModule)
                  {
                      return SetWindowsHookEx(WH_KEYBOARD_LL, proc,GetModuleHandle(curModule.ModuleName), 0);
                  }
              }
      
              [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
              private static extern IntPtr SetWindowsHookEx(int idHook,
                                                            LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
      
              [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
              [return: MarshalAs(UnmanagedType.Bool)]
              public static extern bool UnhookWindowsHookEx(IntPtr hhk);
      
              [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
              public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
                                                         IntPtr wParam, IntPtr lParam);
      
              [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
              private static extern IntPtr GetModuleHandle(string lpModuleName);
          }
      }
      

      搜索

      如果您想做一些高级索引搜索,可以查看Lucene.Net

      编码愉快! :)

      【讨论】:

      • -1:您绝对不想设置低级键盘挂钩。病毒扫描程序会发疯是有充分理由的。
      • 据我所知,没有其他方法可以实现全局挂钩,他要求一种方法来做到这一点。而且我从未遇到过病毒扫描程序的任何问题。
      • 还有另一种添加全局挂钩的方法——而且更安全。 SetWindowsHookEx 的文档清楚地表明,低级挂钩对于产品发布来说是绝对不可接受的选项。
      • 你能解释一下这种替代方式吗?
      【解决方案4】:

      我在一个开源项目中使用了 .NET 中的全局热键

      http://skd.codeplex.com/SourceControl/changeset/view/1306#28124

      我想我在 Codeplex 文章中得到了代码

      【讨论】:

        【解决方案5】:

        我知道这仅解决了您问题的一小部分,但我看到了几个过于复杂(或在一种情况下完全错误)的示例,并认为我应该添加这个。

        添加系统热键的最简单方法是使用ManagedWinapi 项目。添加对项目的引用后,您可以在应用程序启动代码中放置如下内容:

        hotkey = new ManagedWinapi.Hotkey();
        hotkey.WindowsKey = true;
        hotkey.KeyCode = System.Windows.Forms.Keys.Space;
        hotkey.HotkeyPressed += new EventHandler(hotkey_HotkeyPressed);
        try
        {
            hotkey.Enabled = true;
        }
        catch (ManagedWinapi.HotkeyAlreadyInUseException)
        {
            System.Windows.MessageBox.Show("Could not register hotkey (already in use).", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
        }
        

        【讨论】:

          猜你喜欢
          • 2017-11-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多