程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 用Java調用VC音量控制程序

用Java調用VC音量控制程序

編輯:關於JAVA

前言

本文通過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 接口提供了調用其他應用程序的接口,通過這個接口,可以實現對計算機硬件的控制和監控. 同時通過界面線程可以實現相對復雜的應用程序界面的開發。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved