服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

用java调用vc音量控制程序


  前言

  本文通过java的runtime接口来实现调用其他语言实现的应用程序,进而来实现对计算机硬件信息的监控和控制.本文是多媒体信息系统的一个部分,就是调整计算机音量。

  使用vc编写音量控制程序

  本控制示例使用vc6.0编写,主要是调用系统的api来实现,

   mixergetlineinfo 获取master volume control.

   mixergetcontroldetails 获取 volume control 信息

   mixersetcontroldetails 设置 volume control 信息

  最终编译成console类型的dos执行的程序volumecontrol.exe。这个程序实现三个功能:

  1.获取音量 volumecontrol.exe 0

  2.增加音量 volumecontrol.exe 1

  3.减少音量 volumecontrol.exe 2

  下面我们用java设计创建一个panel用于显示音量并调用应用程序实现对音量的实际控制,本例中使用自定义progress显示volumetracker.java

  实现原理如下:

  使用一个线程动态刷新页面,主线程用来实现对音量的控制.其实现代码如下:

import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.awt.event.*;
import java.text.attributedstring;
import java.text.attributedcharacteriterator;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;
import javax.swing.event.*;
import java.io.*;
public class volumetracker extends jpanel implements runnable
{
 string welcomestr = "welcome to java sound";
 thread pbthread;
 color background = color.white;
 //new color(20, 20, 20);
 color jfcblue = color.blue;
 //new color(204, 204, 255);
 color jfcdarkblue = jfcblue.darker();
 font font24 = new font("serif", font.bold, 24);
 font font28 = new font("serif", font.bold, 28);
 font font42 = new font("serif", font.bold, 42);
 fontmetrics fm28, fm42;
 string errstr=null;
 string currentname=null;
 double duration = 100.0;
 double seconds = 82.0;
 boolean midieom, audioeom;
 public volumetracker()
 {
  fm28 = getfontmetrics(font28);
  fm42 = getfontmetrics(font42);
  initvolume();
  start();
 }

 private void initvolume()
 {
  try
   {
    //这一段小程序实现对vc创建程序的调用
     runtime rt = runtime.getruntime(); //time and date.
    //mngpathtool类,提供了一个获取当前路径的方法
    mngpathtool tool = new mngpathtool();
    string sexec = tool.getcurpath()+ "//binex//volumecontrol.exe 0";
    process child = rt.exec(sexec);
    //获取控制台输出的内容,进而获得音量的大小
    inputstreamreader reader = new inputstreamreader(child.getinputstream());
    char[] chr = new char[5];
    reader.read(chr) ;
    string s="";
    for(int i=0;i<5;i++)
    {
     if(chr[i]>='0' && chr[i]<='9') s+=chr[i];
    }
    //system.out.println(s);
    integer nvolume = new integer(s);
    seconds = nvolume.intvalue();
    child.waitfor();
    //这一段小程序实现对vc创建程序的调用
   }
  catch(exception e1)
   {
    e1.printstacktrace();
   }
 }
  
 public void paint(graphics g)
 {
  //画图来实现百分比tracker
  graphics2d g2 = (graphics2d) g;
  dimension d = getsize();
  g2.setbackground(background);
  g2.clearrect(0, 0, d.width, d.height);
  g2.setrenderinghint(renderinghints.key_antialiasing, renderinghints.value_antialias_on);
  g2.setcolor(jfcblue);
  double tseconds = duration-seconds;
  if (tseconds > 0.0)
  {
   int num = 20;
   int progress = (int) (tseconds / duration * num);
   double hh = ((double) (d.height - 4) / (double) num);
   double ww = (int)(d.width-4);
   double x = 0.0;
   for ( ; x < progress; 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 (exception e)
   {
    break;
   }
   repaint();
  }
  pbthread = null;
 }

 public void addvolume()
 {
  changevolume(false);
  initvolume();
 }

 public void minusvolume()
 {
  changevolume(true);
  initvolume();
 }

 //control sound volume.

 private void changevolume(boolean bisminus)
 {
  try
  {
   runtime rt = runtime.getruntime();
   //sound control mngpathtool
   tool = new mngpathtool();
   string sexec;
   if(bisminus)
    sexec= tool.getcurpath()+ "//binex//volumecontrol.exe 2";
   else
    sexec= tool.getcurpath()+ "//binex//volumecontrol.exe 1";
    rt.exec(sexec);
  }catch(exception e1){e1.printstacktrace(); }
 }
}
// end volumetracker

  创建一个jframe用于显示 volumecontrol.java

  设置页面背景,创建显示上述panel的容器.

  创建对话框用于弹出显示音量控制界面 jvolumedlg.java

  创建一个对话框来显示上个步骤生成的frame,并提供事件控制容器.

  事件流向---> jvolumedlg -- volumecontrol --- volumetracker

  总结

  java runtime 接口提供了调用其他应用程序的接口,通过这个接口,可以实现对计算机硬件的控制和监控. 同时通过界面线程可以实现相对复杂的应用程序界面的开发。

扫描关注微信公众号