- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
如何在 Java 中模拟按下媒体键?如播放/暂停、下一首/上一首、音量控制。
C#有VK_MEDIA_PLAY_PAUSE
、VK_MEDIA_NEXT_TRACK
等。
Java 有类 Robot
用于处理键,但没有媒体键。
最佳答案
我使用 JNI 库来模拟使用 C 编写的代码的按键操作。我创建了一个 .dll 文件和一个 .java 文件来按下“降低音量”、“提高音量”、“静音”、“上一首轨道”、“下一首轨道”和“播放/暂停轨道”媒体键。
这是一个link到完整的存储库,但是,我将在下面更详细地解释它。
MediaKeys.java 必须位于名为“commands”的包中才能工作。
编译时,MediaKeys.dll 必须与“src”文件夹位于同一路径或与 .class 文件位于同一路径。
MediaKeys.java 文件包含以下内容:
package commands
public class MediaKeys {
//loads library from "MediaKeys.dll"
static {
System.loadLibrary("MediaKeys");
}
public static native void volumeMute();
public static native void volumeDown();
public static native void volumeUp();
public static native void songPrevious();
public static native void songNext();
public static native void songPlayPause();
//test driver
public static void main(String[] args) {
//volumeMute();
}
}
静态 block 加载 .dll 文件,然后使用 native
关键字声明用 C 编写的函数。
如果您只需要这些功能,那么您可以使用 Windows 的 .dll 文件。如果您需要 .dll 的源代码,它包含在 link 中以上,我将在下面更详细地解释。
.dll 由两个文件组成,一个是函数源代码的 C 文件,另一个是头文件。 (命名为 MediaKeys.c 和 MediaKeys.h)
MediaKeys.c 包含按下所需键的代码。为了节省空间,以下 C 文件和头文件的代码块仅针对“下一首轨道”、“上一首轨道”和“暂停/播放轨道”功能进行格式化。
头文件:媒体键.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class MediaKeys */
#ifndef _Included_MediaKeys
#define _Included_MediaKeys
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: MediaKeys
* Method: songPrevious
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_commands_MediaKeys_songPrevious
(JNIEnv *, jclass);
/*
* Class: MediaKeys
* Method: songNext
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_commands_MediaKeys_songNext
(JNIEnv *, jclass);
/*
* Class: MediaKeys
* Method: songPlayPause
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_commands_MediaKeys_songPlayPause
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
头文件包含以下格式所需的每个方法的声明:
JNIEXPORT void JNICALL Java_{package_name}_{class_name}_{method_name}
(JNIEnv *, jclass);
C 文件必须与头文件相对应。媒体键.c
//standard dependencies for C and the JNI Library
#include <jni.h>
#include <stdio.h>
#include "MediaKeys.h"
//dependencies required to hit the media keys
#define WINVER 0x0500
#include <windows.h>
//hits the previous track key
JNIEXPORT void JNICALL Java_commands_MediaKeys_songPrevious (JNIEnv *env, jobject thisObj) {
KEYBDINPUT kbi;
//specific keycode
kbi.wVk = VK_MEDIA_PREV_TRACK; //this can be changed depending on the key
kbi.wScan = 0;
kbi.dwFlags = 0;
kbi.time = 0;
kbi.dwExtraInfo = (ULONG_PTR) GetMessageExtraInfo();
INPUT input;
input.type = INPUT_KEYBOARD;
input.ki = kbi;
SendInput(1, &input, sizeof(INPUT));
return;
}
//hits the next track key
JNIEXPORT void JNICALL Java_commands_MediaKeys_songNext (JNIEnv *env, jobject thisObj) {
KEYBDINPUT kbi;
//specific keycode
kbi.wVk = VK_MEDIA_NEXT_TRACK;
kbi.wScan = 0;
kbi.dwFlags = 0;
kbi.time = 0;
kbi.dwExtraInfo = (ULONG_PTR) GetMessageExtraInfo();
INPUT input;
input.type = INPUT_KEYBOARD;
input.ki = kbi;
SendInput(1, &input, sizeof(INPUT));
return;
}
//hits the play/pause key
JNIEXPORT void JNICALL Java_commands_MediaKeys_songPlayPause (JNIEnv *env, jobject thisObj) {
KEYBDINPUT kbi;
//specific keycode
kbi.wVk = VK_MEDIA_PLAY_PAUSE;
kbi.wScan = 0;
kbi.dwFlags = 0;
kbi.time = 0;
kbi.dwExtraInfo = (ULONG_PTR) GetMessageExtraInfo();
INPUT input;
input.type = INPUT_KEYBOARD;
input.ki = kbi;
SendInput(1, &input, sizeof(INPUT));
return;
}
C 文件包含每个 header 语句的相应函数,格式如下:
JNIEXPORT void JNICALL Java_{package_name}_{class_name}_{method_name} (JNIEnv *env, jobject thisObj) {
//specific code goes here
return;
}
如代码中所述,您可以通过更改以下内容来更改特定 key :kbi.wVk = specific_key_goes_here;
。可以找到可用 key 的列表 here .
一旦创建了 C 文件和头文件,就可以将它们编译成 dll 文件。为此,我使用 Code::Blocks 创建了一个新的动态链接库项目,添加了 MediaKeys.c 和 MediaKeys.h 文件,然后单击构建。
由于我的 JVM 是 64 位的,而 Code::Blocks 默认编译器是 32 位的,所以我不得不 install a 64-bit compiler进入代码:: block 。
您还必须添加指向 jni.h
库的链接。要在 Code::Blocks 中执行此操作,请转到 Settings>Compiler>Search Directories
并添加目录 C:\Program Files\Java\jdk1.8.0_171\include
和 C:\Program Files\Java\jdk1.8.0_171\include\win32
。您很可能必须根据您的 jdk 版本更改文件路径。
构建完成后,将dll文件复制到java程序需要的位置。
有关设置 Java native 接口(interface)的更多信息,我找到了 this link非常有帮助。
我知道这篇文章有点旧,但我认为这些信息可能对其他人有帮助。
关于java - 如何在 Java 中模拟按下媒体键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30221022/
我是一名优秀的程序员,十分优秀!