使用Java调用VC音量控制程序

  这篇文章通过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>&gt;='0'&&chr<i>&lt;='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秒&gt;0.0)
  {
  int num=20;
  int进度=(int)(t秒/持续时间*num);
  双hh=((双)(d.height-4)/(双)num);
  双ww=(int)(d.width-4);
  双x=0.0;
  for(;x&lt;进度;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&lt;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一个对话框来显示创建上个步骤生成的框架,并提供事件控制容器。事件流向---&gt;JVolumeDlg--VolumeControl---VolumeTracker总结Java Runtime接口提供了调用其他应用程序的接口,通过该接口,可以实现对计算机硬件的控制和监控。同时通过界面线程可以实现相对复杂的应用程序界面的开发。