こんにちは。
AccExplorerのファインダーツールがVistaから正常に機能しないのですが、
バージョンアップされてる気配もないですし、何か対応策はあるのでしょうか。
仕組みは以下の様な感じなのでしょうけど。
http://support.microsoft.com/kb/143045/ja
# 回答に非ず。
…板違いかと。VBとは何の関係も無い話題に見えます。
それとも、VB で Vista 対応版のツールを作ろうとしているのでしょうか。
> バージョンアップされてる気配もないですし
単体の MSAA SDK は、おそらく 2.0 で更新が止まっているようですが、技術情報は
Platform SDK 等で提供されていますね。IAccessible自体は、Vista や 7 でも
もちろん使えますが、MSAA SDK 2.0 の付属ツール群については、Vista 以降の
スケーリングや UAC 等を考慮してはいないと思いますよ。詳しく調べたわけでは無いですけれども。
http://msdn.microsoft.com/ja-jp/library/aa970067.aspx
http://msdn.microsoft.com/en-us/library/dd317984.aspx
魔界の仮面弁士さん、回答ありがとうございます。
> …板違いかと。VBとは何の関係も無い話題に見えます。
> それとも、VB で Vista 対応版のツールを作ろうとしているのでしょうか。
失礼しました。正直、どちらで尋ねればいいのか分かりませんでしたので。
> スケーリングや UAC 等を考慮してはいないと思いますよ。詳しく調べたわけでは無いですけれども。
> http://msdn.microsoft.com/ja-jp/library/aa970067.aspx
> http://msdn.microsoft.com/en-us/library/dd317984.aspx
理由が分かってスッキリしました。
本家(英語版)はちょっと書いてあることが違うので両方載せて頂いて勉強になりました。
取りあえず、DetoursでDLL_PROCESS_ATTACHで
> SetProcessDPIAware 関数
> Windows Vista の SetProcessDPIAware 関数 (英語) を使用すると、現在のプロセスを DPI 対応にすることができます。ただし、SetProcessDPIAware 関数の使用は推奨されていません。
http://msdn.microsoft.com/ja-jp/windows/dd630126.aspx
を呼び出すか、AccessibleObjectFromPointをフックして、
第一引数(ptScreen)をGetPhysicalCursorPosで得た座標値に置き換えるかで対応したいと思います。
> 単体の MSAA SDK は、おそらく 2.0 で更新が止まっているようですが、技術情報は
その他のツールは最新のSDKに含まれてるのだから
AccExplorerも対応してくれればいいのにとは思いました。
(特にVBAはウィンドウレスコントロールの操作で需要があるのに)
http://blogs.msdn.com/b/winuiautomation/archive/2009/06/03/windows-automation-api-sdk-tools.aspx
# 一応、全部書いておきます。
> 起動時に Win32 関数の SetProcessDPIAware を呼び出します。
http://msdn.microsoft.com/ja-jp/library/aa970067(VS.80).aspx
Detoursを用いるのはアプリケーションの起動時にSetProcessDPIAwareが呼び出される必要があるためです。
1) AccExpHook.js実行でAccExpHook.dllを作成。
2) withDll_AccExpHook.js実行で確認。
UIPIに付いては下記を参照。
http://ebi.dyndns.biz/diary/20080813.html
環境 Windows 7 SP1β/IE9β/VC++2010/Excel2010
AccExpHook.bat
call "C:\Program Files\Microsoft Visual Studio 10\VC\Vcvarsall.bat" x86
cl.exe AccExpHook.cpp /LD /MT User32.lib .\lib\detours.lib .\lib\detoured.lib
AccExpHook.cpp
#include <windows.h>
#include ".\include\detours.h"
__declspec(dllexport)void hoge(){return;}
BOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)
{
if (dwReason == DLL_PROCESS_ATTACH) {
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
SetProcessDPIAware();
DetourTransactionCommit();
}
else if (dwReason == DLL_PROCESS_DETACH) {
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourTransactionCommit();
}
return TRUE;
}
AccExpHook.js
var FolderPath = "C:\\Temp\\Detours\\";
var FilePath1 = "AccExpHook.bat";
var FilePath2 = "AccExpHook.txt";
var wsh = new ActiveXObject("WScript.Shell");
wsh.CurrentDirectory = FolderPath;
wsh.Run("cmd.exe /C " + FilePath1 + " > " + FilePath2,0,true);
WScript.Echo("finished!");
withDll_AccExpHook.js
var FolderPath = "C:\\Temp\\Detours\\";
var CmdLine = ".\\bin\\withdll.exe /d:AccExpHook.dll /p:.\\bin\\detoured.dll AccExplorer32.exe";
var wsh = new ActiveXObject("WScript.Shell");
wsh.CurrentDirectory = FolderPath;
wsh.Run(CmdLine,1,false);
> AccessibleObjectFromPointをフックして、
> 第一引数(ptScreen)をGetPhysicalCursorPosで得た座標値に置き換えるかで対応したいと思います。
こちらは上手くいきませんでした。
# 眠い。orz