使用Java调用VC音量控制程序
2024年03月08日
这篇文章通过Java的Runtime接口来实现调用其他语言实现的应用程序,首先来实现对计算机硬件信息的监控和控制。这篇文章是多媒体信息系统的一部分,就是调整计算机音量。使用VC编写的音量控制程序
本控制示例使用VC6.0编写,主要是调用系统的API来实现,
mixerGetLineInfo获取主音量控制。
mixerGetControlDetails获取音量控制信息
mixerSetControlDetails设置音量控制信息
最终编译成Console类型的Dos执行的程序VolumeControl.exe。该程序实现三个功能:
1.获取音量VolumeControl.exe 0
2.增加音量VolumeControl.exe 1
3.减少音量VolumeControl.exe 2
下面我们用Java设计创建一个Panel用于显示音量并调用应用程序实现对音量的实际控制,本例中使用自定义Progress显示VolumeTracker.java
实现原理如下:
使用一个线程动态刷新页面,主线程用于实现对音量的控制。其实现代码如下:
import java.awt.*;
导入java.awt.font.*;
导入java.awt.geom.*;
导入java.awt.event.*;
导入java.text.AttributedString;
导入java.text.AttributedCharacterIterator;
导入javax.swing.*;
导入javax.swing.border.*;
导入javax.swing.table.*;
导入javax.swing.event.*;
导入java.io.*;
public class VolumeTracker extends JPanel Implements Runnable
{
StringwelcomeStr="欢迎使用Java Sound";
线程pbThread;
颜色背景=Color.white;
//新颜色(20,20,20);
颜色jfcBlue=Color.blue;
//新颜色(204,204,255);
颜色jfcDarkBlue=jfcBlue.darker();
字体font24=new Font("serif",Font.BOLD,24);
字体font28=new Font("serif",Font.BOLD,28);
字体font42=new Font("serif",Font.BOLD,42);
FontMetrics fm28、fm42;
字符串errStr=null;
字符串当前名称=null;
双倍持续时间=100.0;
双秒=82.0;
布尔midiEOM,audioEOM;
公共VolumeTracker()
{
fm28=getFontMetrics(font28);
fm42=getFontMetrics(font42);
初始化体积();
开始();
}
private void initVolume()
{
try
{
//这一段小程序实现对VC创建程序的调用
Runtime rt=Runtime.getRuntime();//时间和日期。
//mngPathTool类,提供了一个获取当前路径的方法
mngPathTool tool=new mngPathTool();
String sexec=tool.getCurPath()+"\\binex\\VolumeControl.exe 0";
进程子进程=rt.exec(sexec);
//获取控制台输出的内容,再次获取音量的大小
InputStreamReader reader=new InputStreamReader(child.getInputStream());
char[]chr=新的char[5];
reader.read(chr);
字符串s="";
for(int i=0;i<5;i++)
{
if(chr<i>>='0'&&chr<i><='9')s+=chr<i>;
}
//System.out.println(s);
整数nVolume=新整数;
秒=nVolume.intValue();
child.waitFor();
//这一段小程序实现对VC创建程序的调用
}
catch(Exception e1)
{
e1.printStackTrace();
}
}
public void Paint(Graphics g)
{
//画图来实现人口Tracker
Graphics2D g2=(Graphics2D)g;
维度d=getSize();
g2.setBackground(背景);
g2.clearRect(0,0,d.宽度,d.高度);
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(jfcBlue);
double tseconds=持续时间秒;
if(t秒>0.0)
{
int num=20;
int进度=(int)(t秒/持续时间*num);
双hh=((双)(d.height-4)/(双)num);
双ww=(int)(d.width-4);
双x=0.0;
for(;x<进度;x+=1.0)
{
g2.fill(new Rectangle2D.Double(d.width-ww-2,x*hh+2,ww,hh));
g2.fill3DRect((int)(d.width-ww-2),(int)(x*hh+2),(int)ww,(int)hh,true);
g2.setColor
(jfcDarkBlue);
for(;x<num;x+=1.0)
{
g2.fill(new Rectangle2D.Double(d.width-ww-2,x*hh+2,ww,hh));
g2.fill3DRect((int)(d.width-ww-2),(int)(x*hh+2),(int)ww,(int)hh,true);
}
}
}
public void start()
{
pbThread=new Thread(this);
pbThread.setName("PlaybackMonitor");
pbThread.start();
}
public void stop()
{
if(pbThread!=null)
{
pbThread.interrupt();}
}
pbThread=null;
}
public void run()
{
while(pbThread!=null)
{
try
{
pbThread.sleep(99);}
}
catch(异常e)
{
中断;
重绘
();
}
pbThread=null;
}
公共无效addVolume()
{
changeVolume(假);
初始化体积();
}
公共无效minusVolume()
{
changeVolume(true);
初始化体积();
}
//控制音量。
私人无效changeVolume(布尔bIsMinus)
{
尝试
{
运行时rt=Runtime.getRuntime();
//声音控制mngPathTool
tool=new mngPathTool();
字符串sexec;
if(bIsMinus)
sexec=tool.getCurPath()+"\\binex\\VolumeControl.exe 2";
否则
sexec=tool.getCurPath()+"\\binex\\VolumeControl.exe 1";
rt.exec(sexec);
}catch(异常e1){e1.printStackTrace();//End VolumeTracker创建一个JFrame用于显示VolumeControl.java设置页面背景,创建显示
上述面板的容器。创建对话框用于弹出显示音量控制界面JVolumeDlg.java一个对话框来显示创建上个步骤生成的框架,并提供事件控制容器。事件流向--->JVolumeDlg--VolumeControl---VolumeTracker总结Java Runtime接口提供了调用其他应用程序的接口,通过该接口,可以实现对计算机硬件的控制和监控。同时通过界面线程可以实现相对复杂的应用程序界面的开发。