# Ahk + mpv

**URL:** https://meta.appinn.net/t/topic/36985
**Category:** 讨论分享
**Created:** [2022 年10 月 11 日 15:06 UTC](https://meta.appinn.net/t/topic/36985 "2022-10-11T15:06:25Z")
**Posts on this page:** 11
**Page:** 1

<div class="post-metadata">

### 作者： ![foyax](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/foyax/32/27434_2.png) [@foyax](https://meta.appinn.net/u/foyax)
#### 发布日期： [2022 年10 月 11 日 15:06 UTC](https://meta.appinn.net/t/topic/36985/1 "2022-10-11T15:06:25Z")

</div>

测试用 ahk 调用 libmpv 完全OK。我打算写个纯VIM式操控的播放器。  
我苦各播放器的简陋接口久矣，获取当前视频的路径都TM千难万难。  
我要写三套不同接口，窗口消息命名管道ZMQ都用上。。  
我还要写播放器会话，批量恢复视频。。

```auto
ui:=gui("-Caption +AlwaysOnTop +ToolWindow -DPIScale")
DllCall("LoadLibrary", "str", "mpv.dll","Cdecl UPtr")
mpv:=DllCall("mpv.dll\mpv_create","Cdecl UPtr")

DllCall("mpv.dll\mpv_set_option","ptr", mpv, "astr", "wid","int64", 4, "ptrp", &j:=ui.hwnd, "Cdecl int")

S1 := "loadfile"
S2 := "Z:\2.mp4"
l1 := StrPut(s1, "cp0")
l2 := StrPut(s2, "utf-8")
buf := Buffer(3 * A_Ptrsize + l1 + l2)
StrPut(s1, pl := buf.Ptr + 3 * A_Ptrsize, "cp0")
StrPut(s2, p2 := pl + 11, "utf-8")
NumPut("ptr", pl, "ptr", p2, "ptr", 0, buf)
DllCall("mpv.dll\mpv_initialize","ptr", mpv, "Cdecl int")
DllCall("mpv.dll\mpv_command_async","ptr", mpv, "int", 0, "ptr", buf.ptr, "Cdecl UPtr")
ui.show("w2800 h1620")

```

---

<div class="post-metadata">

### 作者： ![foyax](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/foyax/32/27434_2.png) [@foyax](https://meta.appinn.net/u/foyax)
#### 发布日期： [2022 年10 月 11 日 15:27 UTC](https://meta.appinn.net/t/topic/36985/2 "2022-10-11T15:27:37Z")

</div>

> **[GitHub - MoeDisk/My\_MPV\_Qt\_demo](https://github.com/MoeDisk/My_MPV_Qt_demo)**
>
> 通过在 GitHub 上创建帐户来为 MoeDisk/My\_MPV\_Qt\_demo 开发做出贡献。

---

<div class="post-metadata">

### 作者： ![foyax](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/foyax/32/27434_2.png) [@foyax](https://meta.appinn.net/u/foyax)
#### 发布日期： [2022 年10 月 11 日 15:28 UTC](https://meta.appinn.net/t/topic/36985/3 "2022-10-11T15:28:25Z")

</div>

-\>mpv\_create，创建实例。

-\>mpv\_set\_option，设置播放句柄。

-\>mpv\_set\_property，设置属性。

-\>mpv\_set\_option，设置参数。

-\>mpv\_initialize，初始化实例。

-\>mpv\_command\_async，拉流。

-\>mpv\_terminate\_destroy，释放实例。

你可以基于如下官方提供的手册来为它添加其他功能。

[https://mpv.io/manual/master](https://mpv.io/manual/master)

---

<div class="post-metadata">

### 作者： ![sanmaodo](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/sanmaodo/32/44912_2.png) [@sanmaodo](https://meta.appinn.net/u/sanmaodo)
#### 发布日期： [2023 年5 月 17 日 11:30 UTC](https://meta.appinn.net/t/topic/36985/5 "2023-05-17T11:30:10Z")

</div>

@foyax 谢谢你分享的代码和资料！  
现在有个问题，mpv.dll 和 mpv.exe 不一样，它不接受按键发送，无法显示 osc 控制面板，请问你是如何解决的？  
另外，能让它执行 mpv.conf 配置吗？

---

<div class="post-metadata">

### 作者： ![foyax](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/foyax/32/27434_2.png) [@foyax](https://meta.appinn.net/u/foyax)
#### 发布日期： [2023 年5 月 17 日 12:14 UTC](https://meta.appinn.net/t/topic/36985/6 "2023-05-17T12:14:25Z")

</div>

我是禁用了 mpv 显示视频之外其他交互的，所有需要的信息通过主动获取或者回调接收。  
启用 mpv 的交互也简单，不设置 AutoHotkey 窗口作为容器就行了。这样除了没有 mpv 进程就和普通 mpv 没有区别，热键应该也会生效。

设置配置：  
DllCall(“libmpv-2.dll\mpv\_set\_option\_string”, “ptr”, g\_mpv, “astr”, “include”, “ptr”, StrBuf(“mpv.conf”), “Cdecl int”)

---

<div class="post-metadata">

### 作者： ![sanmaodo](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/sanmaodo/32/44912_2.png) [@sanmaodo](https://meta.appinn.net/u/sanmaodo)
#### 发布日期： [2023 年5 月 17 日 13:22 UTC](https://meta.appinn.net/t/topic/36985/7 "2023-05-17T13:22:33Z")

</div>

谢谢！很高兴这么快的回复 ：）  
你说的方法，我需要花些时间去弄明白，以前写过调用mpv.exe的脚本，这跟调用dll有很多不同。

---

<div class="post-metadata">

### 作者： ![sanmaodo](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/sanmaodo/32/44912_2.png) [@sanmaodo](https://meta.appinn.net/u/sanmaodo)
#### 发布日期： [2023 年5 月 17 日 14:05 UTC](https://meta.appinn.net/t/topic/36985/8 "2023-05-17T14:05:09Z")

</div>

呵，加载配置文件生效了。  
mpv\_set\_opt\_st(mpvhd, “include”, “mpv.conf”)

但是，不管是否绑定 AHK 窗口，mpv 都不响应按键，osc 也显示不出来。

---

<div class="post-metadata">

### 作者： ![sanmaodo](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/sanmaodo/32/44912_2.png) [@sanmaodo](https://meta.appinn.net/u/sanmaodo)
#### 发布日期： [2023 年5 月 17 日 18:03 UTC](https://meta.appinn.net/t/topic/36985/9 "2023-05-17T18:03:32Z")

</div>

找到一些资料， 加入下面三项设置，不绑定 AHK 窗口，可以响应按键，显示 osc，基本与直接运行 mpv.exe 无异，就是点击窗口关闭按钮时，不能正常关闭。

```auto
mpv_set_option_string(mpv, "input-default-bindings", "yes") ;启用默认的按键绑定
mpv_set_option_string(mpv, "input-vo-keyboard", "yes") ;启用 X11 窗口的键盘输入
mpv_set_option_string(mpv, "osc", "yes")

```

如果绑定 AHK 窗口，能接收到 ControlSend 发送的按键，不能显示 osc

---

<div class="post-metadata">

### 作者： ![haitao](https://meta-edge.appinn.com/letter_avatar_proxy/v4/letter/h/958977/32.png) [@haitao](https://meta.appinn.net/u/haitao)
#### 发布日期： [2023 年5 月 17 日 18:37 UTC](https://meta.appinn.net/t/topic/36985/10 "2023-05-17T18:37:57Z")

</div>

说到 gui程序控制命令行的视频播放，  
作为QQ影音3.9的用户，因为它很多新格式不支持了，支持多一点的potplayer又没有画面x1、x2的快捷按钮，而且目录里视频列表连刷新功能都没有，很想写个gui程序操控mpv或vlc。  
不知道mpv/vlc打开的视频播放窗口，是否支持被别的gui程序接管？  
完整过程是：gui程序选择文件开始播放，播放窗口也在gui程序的主窗口里，另外还有一些快捷按钮：画面x1,x2,全屏，播放速度x1,x2，目录里的视频列表和刷新、排序按钮，标准的进度条及其操作功能

---

<div class="post-metadata">

### 作者： ![sanmaodo](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/sanmaodo/32/44912_2.png) [@sanmaodo](https://meta.appinn.net/u/sanmaodo)
#### 发布日期： [2023 年5 月 19 日 06:46 UTC](https://meta.appinn.net/t/topic/36985/11 "2023-05-19T06:46:30Z")

</div>

可以的，参考顶楼的代码，新建一个窗口，然后把 mpv 绑定到这个窗口

---

<div class="post-metadata">

### 作者： ![haitao](https://meta-edge.appinn.com/letter_avatar_proxy/v4/letter/h/958977/32.png) [@haitao](https://meta.appinn.net/u/haitao)
#### 发布日期： [2023 年5 月 19 日 13:03 UTC](https://meta.appinn.net/t/topic/36985/12 "2023-05-19T13:03:27Z")

</div>

看来mpv可以，就可以先查一下它的使用方式。。。。
