gpt4 book ai didi

java - 如何在 Java 中模拟按下媒体键?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:09:07 25 4
gpt4 key购买 nike

如何在 Java 中模拟按下媒体键?如播放/暂停、下一首/上一首、音量控制。

C#有VK_MEDIA_PLAY_PAUSEVK_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\includeC:\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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com