ワード・エクセル開いているかな? [JavaScript]
前回の「ウィンドウを検索する」でアプリケーションのclass nameを知ることができました。
(ワードやエクセルならネットで検索すれば出てきますが、、)
このclass nameをもとに、ウインドウのタイトルバーの文字列を取得して表示します。
UTF-8、拡張子は.HTAで以下のテキストを保存。
(ワードやエクセルならネットで検索すれば出てきますが、、)
このclass nameをもとに、ウインドウのタイトルバーの文字列を取得して表示します。
UTF-8、拡張子は.HTAで以下のテキストを保存。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ワード・エクセル開いているかな?</title>
<script>
var excel = new ActiveXObject('Excel.Application'); // Excelオブジェクト生成
function officeInfo( className ) {
var resultHtml = ''; // ↓指定したクラス名の1つめのウィンドウのハンドルを取得
var hWnd = excel.ExecuteExcel4Macro( 'CALL("user32", "FindWindowA", "JCJ", "' + className + '", 0)' );
if( hWnd ) { // 取得できたら(0でなければ)、、
do { // ↓ウィンドウが表示状態ならば、ウィンドウハンドルからウィンドウ名を取得
if( excel.ExecuteExcel4Macro( 'CALL("user32", "IsWindowVisible", "JJ", ' + hWnd + ')' ) ) {
resultHtml += '<p>' + excel.ExecuteExcel4Macro( 'CALL("user32", "GetWindowTextA", "2JFJ", ' + hWnd +', 0, 64)' );
} // ↓デスクトップを親ウィンドウとし(0)、現在(hWnd)の次の子ウィンドウを検索
hWnd = excel.ExecuteExcel4Macro( 'CALL("user32", "FindWindowExA", "JJJCJ", 0, ' + hWnd + ', "' +className + '", 0)' );
} while( hWnd );
}
if( !resultHtml ) resultHtml = '<p>Not found (' + className + ')';
document.getElementById('result').innerHTML = resultHtml;
}
</script>
</head>
<body>
<h1>ワード・エクセル開いているかな?</h1>
<p>
<form>
<input type="button" value="Word" onclick="officeInfo('OpusApp')" >
<input type="button" value="Excel" onclick="officeInfo('XLMAIN')" >
<input type="button" value="PowerPoint" onclick="officeInfo('PPTFrameClass')" >
<input type="button" value="Access" onclick="officeInfo('OMain')" >
<input type="reset" value="clear" onclick="document.getElementById('result').innerHTML=''" >
</form>
<p><div id="result"></div>
</body>
</html>
タグ:HTA
ウィンドウを検索する [JavaScript]
他のプログラムが表示しているデータを欲しいときってあるけど、まあ無理。
せめてウインドウのタイトルだけでも、、ということでまずは調査。
以下のサイトを参考というか、HTMLアプリケーション(HTA)用に書き直しました。
Win32API ウィンドウを検索する FindWindowEx - s-kita’s blog
https://s-kita.hatenablog.com/entry/20121218/1355839657
コールバック関数、、よくわからなかったので、とりあえず動けばということで作りました。
IE9モードにしたのは、表を「しましま」にするためだけです。
excel.ExecuteExcel4Macro(’CALL(~)’) でWindowsAPI関数を実行しています。
なので、エクセルがインストールされていることが前提です。
JJ、2JFJ、JJJJJとかは「CALL 関数と REGISTER 関数の使い方 - Microsoft Support」で。
せめてウインドウのタイトルだけでも、、ということでまずは調査。
以下のサイトを参考というか、HTMLアプリケーション(HTA)用に書き直しました。
Win32API ウィンドウを検索する FindWindowEx - s-kita’s blog
https://s-kita.hatenablog.com/entry/20121218/1355839657
コールバック関数、、よくわからなかったので、とりあえず動けばということで作りました。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=9" >
<title>ウィンドウを検索する</title>
<style>
table { width: 100%; border-collapse: collapse; border-spacing: 0; }
th, td { padding: 0px; text-align: left; }
tr:nth-child(odd){ background-color: #eee; }
tr:nth-child(1) { background-color: #ccc; }
</style>
<script>
var excel = new ActiveXObject( 'Excel.Application' ); // Excelオブジェクト生成
var tableHtml; // 表示する表のHTML
var depth; // ウインドウ階層の深さ
function EnumetareWindows(hWndParent) {
var strClassName, strCaption;
var isWinVisible = excel.ExecuteExcel4Macro( 'CALL("user32", "IsWindowVisible", "JJ", ' + hWndParent + ')' )
if( isWinVisible || !document.getElementById( 'limitVisible' ).checked ) { // 可視Windowか、可視のみの指定がないなら表示する
strClassName = excel.ExecuteExcel4Macro( 'CALL("user32", "GetClassNameA" , "2JFJ", ' + hWndParent +', 0, 128)' );
strCaption = excel.ExecuteExcel4Macro( 'CALL("user32", "GetWindowTextA" , "2JFJ", ' + hWndParent +', 0, 128)' );
tableHtml += ( isWinVisible ? '<tr>' : '<tr style="color:#aaa">' ) // 非可視Windowはグレーで表示
+ '<td style="text-indent:' + depth + 'rem">' + hWndParent + '</td><td>' + strClassName + '</td><td>' + strCaption + '</td></tr>';
}
var hWndChild = excel.ExecuteExcel4Macro( 'CALL("user32", "FindWindowExA" , "JJJJJ", ' + hWndParent + ', 0, 0, 0)' );
if( !hWndChild ) return;
if( document.getElementById( 'limitDepth' ).checked && depth ) return;
depth++;
do {
EnumetareWindows(hWndChild);
hWndChild = excel.ExecuteExcel4Macro( 'CALL("user32", "FindWindowExA" , "JJJJJ", ' + hWndParent + ', ' + hWndChild + ', 0, 0)' );
} while ( hWndChild );
depth--;
}
function getWindowInfo() {
var hWndParent = excel.ExecuteExcel4Macro( 'CALL("user32", "GetDesktopWindow", "J")' );
tableHtml = '<table><tr><th>window handle</th><th>class name</th><th>caption</th></tr>';
depth = 0;
EnumetareWindows( hWndParent );
tableHtml += '</table>';
document.getElementById( 'result' ).innerHTML = tableHtml;
}
</script>
</head>
<body>
<h1>ウィンドウを検索する</h1>
<p>
<form>
<input type="checkbox" id="limitVisible" checked ><label for="limitVisible">可視ウィンドウのみ</label>
<input type="checkbox" id="limitDepth" checked ><label for="limitDepth" >親ウィンドウのみ</label>
<input type="button" value="検索" onclick="getWindowInfo()" >
<input type="reset" value="クリア" onclick="document.getElementById('result').innerHTML=''" >
</form>
<p><div id="result"></div>
</body>
</html>
IE9モードにしたのは、表を「しましま」にするためだけです。
excel.ExecuteExcel4Macro(’CALL(~)’) でWindowsAPI関数を実行しています。
なので、エクセルがインストールされていることが前提です。
JJ、2JFJ、JJJJJとかは「CALL 関数と REGISTER 関数の使い方 - Microsoft Support」で。
タグ:HTA