|
 |
|
2015/9/30(Wed) 19:57:42|NO.72060
エクスプローラーのファイルの並び順の情報がほしくて、リストビューのハンドルを取得しようとspy++をつかって
ハンドルとクラス名を調べたらリストビューの場所がSYSLISTVIEW32でなくDIRECTUIHWNDというクラス名になっていました
どうやらwin7からエクスプローラーのリストビューを取得できない仕様になっているようで
打開案を探していたところこんな方法が
ttp://uisteven.blog.fc2.com/?tag=UI&page=3
ttps://groups.google.com/forum/#!topic/microsoft.public.platformsdk.shell/kScZFuAE0Hk
簡単に言うとSetFolderViewOptionsでFVO_VISTALAYOUT設定したらいいよということらしい
1日かけてその設定までできるようになったのですが、DIRECTUIHWNDがSYSLISTVIEW32に変わるという結果にもならず
意気消沈中FVO_VISTALAYOUTっていったい何なんだ…、ソースだけさらしときます
;os win10でテスト行いました、FVO_VISTALAYOUTに設定しても特に変化は見られず…
;表示中のエクスプローラ全てに、SetFolderViewOptionsを設定
#define IID_IWebBrowserApp "{0002DF05-0000-0000-C000-000000000046}"
#usecom IWebBrowserApp IID_IWebBrowserApp
#comfunc get_HWND 37 var;ハンドル返す
;
#define IID_IServiceProvider "{6D5140C1-7436-11CE-8034-00AA006009FA}"
#usecom IServiceProvider IID_IServiceProvider
SID_STopLevelBrowser_A = 0x4C96BE40, 0x11CF915C, 0xAA00D399, 0x37E84A00;{4C96BE40-915C-11CF-99D3-00AA004AE837}
IID_IShellBrowser_A = 0x000214E2, 0x00000000, 0x000000C0, 0x46000000;{000214E2-0000-0000-C000-000000000046}
#comfunc QueryService 3 var,var,int;
;
#define IID_IShellBrowser "{000214E2-0000-0000-C000-000000000046}"
#usecom IShellBrowser IID_IShellBrowser
#comfunc GetControlWindow 13 int,var ;8
;
#define IID_IFolderViewOptions "{3cc974d2-b302-4d36-ad3e-06d93f695d3f}"
#usecom IFolderViewOptions IID_IFolderViewOptions
#comfunc SetFolderViewOptions 3 int,int
#comfunc GetFolderViewOptions 4 var
//
newcom sa, "Shell.Application"
comres wc
sa->"Windows"
i=wc("Count")//ファイルエクスプローラーの数
mes "総数 = "+i
repeat i
comres shellWindow //結果が返る
wc->"Item" cnt
fn=shellWindow("LocationURL")//ファイルのフルパス取得
mes "----------------------"
mes fn
;***********
;ウィンドウハンドル取得:インターフェースIWebBrowserAppのメソッドget_HWNDを利用する
querycom browserApp, shellWindow, IWebBrowserApp;インタフェースを問い合わせ、取得する
get_HWND browserApp,a
mes "ウィンドウハンドル="+a
;***********
;インターフェースIServiceProviderのメソッドQueryServiceを利用する
querycom provider, browserApp, IServiceProvider;インタフェースを問い合わせ、取得する
dimtype browser,6;仮でcom変数作成
QueryService provider, SID_STopLevelBrowser_A, IID_IShellBrowser_A, varptr(browser)
if 0{
;***********
;IShellBrowserを取得できたか確認テスト
FCW_STATUS = 0x0001
FCW_TOOLBAR = 0x0002
FCW_TREE = 0x0003
FCW_INTERNETBAR = 0x0006
FCW_PROGRESS = 0x0008
GetControlWindow browser, FCW_PROGRESS, a
mes "インタフェースが機能しているか確認 hwnd="+a
}
;***********
;フラグの変更
querycom options, browser, IFolderViewOptions;インタフェースを問い合わせ、取得する
;オプション
FVO_DEFAULT = 0x0
FVO_VISTALAYOUT = 0x1
FVO_CUSTOMPOSITION = 0x2
FVO_CUSTOMORDERING = 0x4
FVO_SUPPORTHYPERLINKS = 0x8
FVO_NOSCROLLTIPS = 0x20
SetFolderViewOptions options, FVO_VISTALAYOUT, 1;設定 on
;SetFolderViewOptions options, FVO_VISTALAYOUT, 0;設定 off
GetFolderViewOptions options, get;取得
mes "取得オプションフラグ="+ get
delcom options
delcom browser
delcom provider
delcom browserApp
delcom shellWindow
loop
delcom wc

| |
|
2015/9/30(Wed) 21:52:37|NO.72063
諦めずにフォルダ弄ってたら、変化発見
エクスプローラ開いた後に、フラグ変えて、その後にエクスプローラで別のフォルダを開いたら
DIRECTUIHWNDがSYSLISTVIEW32に変化してました
別窓で開いたらダメ、ハンドルを維持する必要があるので左側のツリービューでフォルダ切り替える必要がある
…思ってたのと違う
|
|
2015/9/30(Wed) 22:49:01|NO.72068
|
|
2015/9/30(Wed) 23:12:06|NO.72069
DIRECTUIHWNDの状態でもオブジェクトの数はIAccessibleのプロパティaccChildCountで取得できるけど不完全
エクスプローラーをspy++で見るとオブジェクトの数=ファイル数なのですが
表示されているぶんしか取得できない、スクロールバーが表示されていたらその非表示部分は取得不能
FVO_VISTALAYOUTに変えてあげて、フォルダの階層を切り替える処理をすると(めんどくせぇ)非表示部分も
accChildCountで取得できるようになるっぽい
|
|
2015/10/1(Thu) 00:16:49|NO.72070
階層を変えるというか親のハンドルIDは変わらないけどリストビューのハンドルIDが変わってるようなので
リストビューを再描画させればいいのかな、問題はその方法か
|
|
2015/10/1(Thu) 01:00:49|NO.72071
Runメソッドでエクスプローラーを非表示で起動させたあとに、フォルダの切り替えを行って
必要なファイルの並び順リスト手に入れたらポイする感じでいいか
|
|
2015/10/3(Sat) 11:26:15|NO.72097
起動したエクスプローラのウィンドウハンドルを取得したいのだけどいい方法があまりなかった
ShellExecuteExでエクスプローラを起動すると、プロセスIDが取得できない
CreateProcessでエクスプローラを起動すると、プロセスIDが取得できるけど、エクスプローラのプロセスIDではなかった…
FindWindowSWでウィンドウハンドルを取得しようとしたが、VARIANTがよくわからず断念
そもそもエクスプローラのプロセスIDはぜんぶ同じ値なのでそこからハンドルIDを取得できない
そこでエクスプローラを起動する前に、現在起動しているエクスプローラを列挙ウィンドウハンドルも確保
(GetClassNameとCharUpperクラス名を取得し"CABINETWCLASS"と照らし合わせる)
その後に、エクスプローラを起動してエクスプローラを列挙
起動前のウィンドウハンドルと照らし合わせ、照合しなかったものを起動したウィンドウハンドとして取得
という方法を取ることにした
#module
#uselib "user32.dll"
#func GetWindow "GetWindow" sptr,sptr
#func GetTopWindow "GetTopWindow" sptr
#func GetWindowThreadProcessId "GetWindowThreadProcessId" sptr,sptr
#func IsWindowVisible "IsWindowVisible" sptr
#func GetWindowLong "GetWindowLongA" sptr,sptr
#func GetClassName "GetClassNameA" int,var,int
#func CharUpper_ "CharUpperA" var
#define GW_HWNDNEXT $00000002
#define GWL_HWNDPARENT $FFFFFFF8
#define WM_GETTEXT $0000000D
;
#deffunc getClasshList str _name, array _hlist, var _max
dim _hlist,256;
_max=0
sdim wndtxt, 256
GetTopWindow 0
hw = stat
sdim String,260
i=0
repeat
if hw = 0 : break
IsWindowVisible hw
if stat=0{ ; stat=0不可視
GetWindowLong hw, GWL_HWNDPARENT
if stat = 0 { ; 親ウィンドウを持たないウィンドウ
GetClassName hw,String,260 : CharUpper_ String
if _name=String{
_hlist._max = hw
_max++
}
}
}
GetWindow hw, GW_HWNDNEXT ; 次のウィンドウハンドル取得
hw = stat
await
loop
return
#global
getClasshList "CABINETWCLASS", oldhlist, oldmax
#uselib "kernel32.dll"
#cfunc OpenProcess "OpenProcess" sptr,sptr,sptr
#func GetExitCodeProcess "GetExitCodeProcess" sptr,sptr
#func CloseHandle "CloseHandle" sptr
#cfunc GetProcessId "GetProcessId" sptr
#uselib "shell32.dll"
#cfunc ShellExecuteEx "ShellExecuteExA" sptr
#define SW_HIDE 0
#define SW_SHOW $00000005
#define SEE_MASK_NOCLOSEPROCESS $00000040
#define PROCESS_QUERY_INFORMATION $00000400
#define STILL_ACTIVE $00000103
#define hInstApp 8
#define hProcess 14
//マイコンピュータ
dim sei, 15 ;SHELLEXECUTEINFO 構造体
Verb = "explore"
File = "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}";マイコンピュータ
sei = 60, SEE_MASK_NOCLOSEPROCESS, hwnd, varptr(Verb), varptr(File), 0, 0, SW_HIDE
if ShellExecuteEx(varptr(sei)) = 0 :mes "失敗"
breakF=0
repeat
waitcnt=cnt
getClasshList "CABINETWCLASS", newhlist, newmax
repeat newmax
temp = newhlist.cnt
cnt0=cnt
repeat oldmax
if oldhlist.cnt=temp : newhlist.cnt0=-1 : break
loop
if newhlist.cnt!=-1{
breakF=1
get=newhlist.cnt
dialog "起動したのこいつです="+newhlist.cnt+"\n起動に待った回数="+waitcnt
break
}
loop
if breakF=1:break
if waitcnt>50:break
wait 1
loop
;表示に切り替える
#include "user32.as"
ShowWindow get,5
end

| |
|
2015/10/3(Sat) 15:27:17|NO.72099
リストビューのハンドル取得までできたのでまとめて貼っときます
;win7からエクスプローラのリストビューが取得困難になっているので取得を試みるサンプル
;流れ
; エクスプローラを列挙し、ウィンドウハンドルを取得
; 非表示でエクスプローラ起動、マイコンピュータを開く
; エクスプローラを列挙し、ウィンドウハンドルを比べて、起動したエクスプローラのウィンドウハンドルを取得
; 目的のウィンドウのFVO_VISTALAYOUTのフラグをONにする
; 指定フォルダパスに移動(FVO_VISTALAYOUTの設定がここで反映される)
; ウィンドウハンドルの階層を調べ、リストビューが取得できているか調べる、クラス名がSYSLISTVIEW32だったら成功
;********
;指定されたクラス名のウィンドウを列挙しハンドルを配列で渡す
#module
#uselib "user32.dll"
#func GetWindow "GetWindow" sptr,sptr
#func GetTopWindow "GetTopWindow" sptr
#func GetWindowThreadProcessId "GetWindowThreadProcessId" sptr,sptr
#func IsWindowVisible "IsWindowVisible" sptr
#func GetWindowLong "GetWindowLongA" sptr,sptr
#func GetClassName "GetClassNameA" int,var,int
#func CharUpper_ "CharUpperA" var
#define GW_HWNDNEXT $00000002
#define GWL_HWNDPARENT $FFFFFFF8
#define WM_GETTEXT $0000000D
;
#deffunc getClasshList str _name, array _hlist, var _max
dim _hlist,256;
_max=0
sdim wndtxt, 256
GetTopWindow 0
hw = stat
sdim String,260
i=0
repeat
if hw = 0 : break
IsWindowVisible hw
if stat=0{ ; stat=0不可視
GetWindowLong hw, GWL_HWNDPARENT
if stat = 0 { ; 親ウィンドウを持たないウィンドウ
GetClassName hw,String,260 : CharUpper_ String
if _name=String{
_hlist._max = hw
_max++
}
}
}
GetWindow hw, GW_HWNDNEXT ; 次のウィンドウハンドル取得
hw = stat
await
loop
return
#global
;********
;エクスプローラでexplorerを開きインスタントハンドルを返す
#module
#uselib "kernel32.dll"
#cfunc OpenProcess "OpenProcess" sptr,sptr,sptr
#func GetExitCodeProcess "GetExitCodeProcess" sptr,sptr
#func CloseHandle "CloseHandle" sptr
#cfunc GetProcessId "GetProcessId" sptr
#uselib "shell32.dll"
#cfunc ShellExecuteEx "ShellExecuteExA" sptr
#uselib "user32.dll"
#func ShowWindow "ShowWindow" int,int
#define SW_HIDE $00000000
#define SW_SHOW $00000005
#define SEE_MASK_NOCLOSEPROCESS $00000040
#define PROCESS_QUERY_INFORMATION $00000400
#define STILL_ACTIVE $00000103
#define hInstApp 8
#define hProcess 14
//
#deffunc OpenExplorer var _hid
;エクスプローラ列挙
getClasshList "CABINETWCLASS", oldhlist, oldmax
;
dim sei, 15 ;SHELLEXECUTEINFO 構造体
Verb = "explore"
File = "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}";マイコンピュータ
sei = 60, SEE_MASK_NOCLOSEPROCESS, hwnd, varptr(Verb), varptr(File), 0, 0, SW_HIDE
if ShellExecuteEx(varptr(sei)) = 0 : return -1
breakF=0
repeat
waitcnt=cnt
getClasshList "CABINETWCLASS", newhlist, newmax
repeat newmax
temp = newhlist.cnt
cnt0=cnt
repeat oldmax
if oldhlist.cnt=temp : newhlist.cnt0=-1 : break
loop
if newhlist.cnt!=-1{
breakF=1
_hid = newhlist.cnt
break
}
loop
if breakF=1:break
if waitcnt>50:break
wait 1
loop
;wait 10
;ShowWindow _hid,5
return
#global
;********
;http://dev.onionsoft.net/seed/info.ax?id=838 ここからダウンロードしてください
#include "mod_clbk2.hsp"
;********
;
#module
#uselib "user32.dll"
#func EnumChildWindows "EnumChildWindows" int,int,int
;
#deffunc getchildwindows int targetwnd,array arr
dim arr
dim clbkptr,1
dim i,1
sdim tmpwns,64
sdim wns
ewlb=*ew
newmod clbk,modclbk,clbkptr,2,ewlb
EnumChildWindows targetwnd,clbkptr,0
return
;
*ew
dupptr winh,lparam,wparam*4,4
arr(i) = winh(0)
i++
return 1
#global
;********
;ウィンドウハンドルの階層を調べる
#module
#define IID_IAccessible_ori "{618736E0-3C3D-11CF-810C-00AA00389B71}"
#usecom IAccessible IID_IAccessible_ori "{}"
;
#uselib "oleacc.dll"
#func AccessibleObjectFromWindow "AccessibleObjectFromWindow" int,int,var,int
;
#uselib "user32.dll"
#func GetForegroundWindow_ "GetForegroundWindow"
#func FindWindowExA_ "FindWindowExA" sptr,sptr,sptr,sptr
#func GetClassName_ "GetClassNameA" int,var,int
#func CharUpper_ "CharUpperA" var
;
#deffunc GetList int p_hwnd
IID_IAccessible = 0x618736E0, 0x11CF3C3D, 0xAA000C81, 0x719B3800;コンバートした{618736E0-3C3D-11CF-810C-00AA00389B71}
String=""
GetClassName_ p_hwnd,String,64 : CharUpper_ String
sdim text
//
OBJID_WINDOW = 0x00000000
OBJID_SELF = 0x00000000
OBJID_SYSMENU = 0xFFFFFFFF
OBJID_TITLEBAR = 0xFFFFFFFE
OBJID_MENU = 0xFFFFFFFD
OBJID_CLIENT = 0xFFFFFFFC
OBJID_VSCROLL = 0xFFFFFFFB
OBJID_HSCROLL = 0xFFFFFFFA
OBJID_SIZEGRIP = 0xFFFFFFF9
OBJID_CARET = 0xFFFFFFF8
OBJID_CURSOR = 0xFFFFFFF7
OBJID_ALERT = 0xFFFFFFF6
OBJID_SOUND = 0xFFFFFFF5
OBJID_QUERYCLASSNAMEIDX = 0xFFFFFFF4
OBJID_NATIVEOM = 0xFFFFFFF0
NAVDIR_MIN = 0
NAVDIR_UP = 1
NAVDIR_DOWN = 2
NAVDIR_LEFT = 3
NAVDIR_RIGHT = 4
NAVDIR_NEXT = 5
NAVDIR_PREVIOUS = 6
NAVDIR_FIRSTCHILD = 7
NAVDIR_LASTCHILD = 8
NAVDIR_MAX = 9
CHILDID_SELF = 0
S_FALSE = 1
DISP_E_MEMBERNOTFOUND = 0x80020003
E_INVALIDARG = 0x80070057
;----------------------
test = 0
AccessibleObjectFromWindow p_hwnd, OBJID_CLIENT, IID_IAccessible, varptr(test)
newcom hoge, IAccessible, -1, test
count = hoge("accChildCount")
objcnt=hoge("accChildCount")
text+="親ハンドル="+p_hwnd+" : clasname="+String+" : オブジェクト"+ objcnt+"個\n"
text+="--------------------------------------------------------\n"
delcom hoge
;----------------------
getchildwindows p_hwnd,arr
//↑getchildwindows
// 一つ目の引数には親のウィンドウハンドル
// 2つ目の引数には小ウィンドウハンドルを受け取るための配列
// を指定する。
foreach arr
//↓ウィンドウハンドルを表示する
String=""
GetClassName_ arr(cnt),String,64 : CharUpper_ String
objcnt=0
if arr(cnt)!0{
AccessibleObjectFromWindow arr(cnt), OBJID_CLIENT, IID_IAccessible, varptr(test)
newcom hoge, IAccessible, -1, test
objcnt = hoge("accChildCount")
delcom hoge
}
if arr(cnt)=0:continue
text+="子ハンドル="+arr(cnt)+" : clasname="+String+" : オブジェクト"+ objcnt+"個\n"
loop
pos 200,0
mesbox text,400,480
return
#global
;********
;SetFolderViewOptionsを設定
#module
;
#define IID_IWebBrowserApp "{0002DF05-0000-0000-C000-000000000046}"
#usecom IWebBrowserApp IID_IWebBrowserApp
#comfunc Quit 32 ;終了
#comfunc get_HWND 37 var;ハンドル返す
;
#define IID_IServiceProvider "{6D5140C1-7436-11CE-8034-00AA006009FA}"
#usecom IServiceProvider IID_IServiceProvider
#comfunc QueryService 3 var,var,int;
;
#define IID_IShellBrowser "{000214E2-0000-0000-C000-000000000046}"
#usecom IShellBrowser IID_IShellBrowser
#comfunc GetControlWindow 13 int,var ;8
#comfunc BrowseObject 11 int,int ;6
;
#define IID_IFolderViewOptions "{3cc974d2-b302-4d36-ad3e-06d93f695d3f}"
#usecom IFolderViewOptions IID_IFolderViewOptions
#comfunc SetFolderViewOptions 3 int,int
#comfunc GetFolderViewOptions 4 var
;
#include "ole32.as"
#include "shell32.as"
#define IID_IShellFolder "{000214E6-0000-0000-C000-000000000046}"
#usecom IShellFolder IID_IShellFolder "{}"
#comfunc ISF_ParseDisplayName 3 int,int,wstr,int,var,int
;
#uselib "user32.dll"
#func ShowWindow "ShowWindow" int,int
#func GetClassName "GetClassNameA" int,var,int
#func CharUpper_ "CharUpperA" var
;
#define WM_SYSCOMMAND $00000112
#define SC_CLOSE $0000F060
//ウィンドウを列挙しハンドルを比べる、当たったらFVO_VISTALAYOUTをONにして、フォルダのパスを目的場所に移し替える
#deffunc SetExplorerFlag int _hwnd, str _path
SID_STopLevelBrowser_A = 0x4C96BE40, 0x11CF915C, 0xAA00D399, 0x37E84A00 ;{4C96BE40-915C-11CF-99D3-00AA004AE837}
IID_IShellBrowser_A = 0x000214E2, 0x00000000, 0x000000C0, 0x46000000 ;{000214E2-0000-0000-C000-000000000046}
;
newcom sa, "Shell.Application"
sdim String,256
repeat;エクスプローラ起動直後は列挙に挙がってこないので引っかかるまで何度も試す
comres wc
sa->"Windows"
find=0
i=wc("Count")//ファイルエクスプローラーの数
repeat i
comres shellWindow //結果が返る
wc->"Item" cnt
fn=shellWindow("LocationURL")//ファイルのフルパス取得
;***********
;ウィンドウハンドル取得:インターフェースIWebBrowserAppのメソッドget_HWNDを利用する
querycom browserApp, shellWindow, IWebBrowserApp;インタフェースを問い合わせ、取得する
get_HWND browserApp,rehwnd
GetClassName rehwnd,String,260 : CharUpper_ String
;mes ""+rehwnd+" "+fn+" "+String
if _hwnd!rehwnd{
delcom browserApp
delcom shellWindow
continue
}
find=1
;***********
;インターフェースIServiceProviderのメソッドQueryServiceを利用する
querycom provider, browserApp, IServiceProvider;インタフェースを問い合わせ、取得する
dimtype browser,6;仮でcom変数作成
QueryService provider, SID_STopLevelBrowser_A, IID_IShellBrowser_A, varptr(browser)
;***********
;フラグの変更
querycom options, browser, IFolderViewOptions;インタフェースを問い合わせ、取得する
;オプション
FVO_DEFAULT = 0x0
FVO_VISTALAYOUT = 0x1
FVO_CUSTOMPOSITION = 0x2
FVO_CUSTOMORDERING = 0x4
FVO_SUPPORTHYPERLINKS = 0x8
FVO_NOSCROLLTIPS = 0x20
SetFolderViewOptions options, FVO_VISTALAYOUT, FVO_VISTALAYOUT;設定 on
;SetFolderViewOptions options, FVO_CUSTOMPOSITION, FVO_CUSTOMPOSITION;設定 on
;SetFolderViewOptions options, FVO_CUSTOMORDERING, FVO_CUSTOMORDERING;設定 on
;SetFolderViewOptions options, FVO_SUPPORTHYPERLINKS, FVO_SUPPORTHYPERLINKS;設定 on
;SetFolderViewOptions options, FVO_NOSCROLLTIPS, FVO_NOSCROLLTIPS;設定 on
;SetFolderViewOptions options, FVO_VISTALAYOUT, 0;設定 off
;SetFolderViewOptions options, FVO_CUSTOMPOSITION, 0;設定 off
;SetFolderViewOptions options, FVO_CUSTOMORDERING, 0;設定 off
;SetFolderViewOptions options, FVO_SUPPORTHYPERLINKS, 0;設定 off
;SetFolderViewOptions options, FVO_NOSCROLLTIPS, 0;設定 off
;GetFolderViewOptions options, get;確認用取得
;***********
;フォルダパス変更
;オプション
SBSP_DEFBROWSER = 0x0000
SBSP_SAMEBROWSER = 0x0001
SBSP_NEWBROWSER = 0x0002
SBSP_DEFMODE = 0x0000
SBSP_OPENMODE = 0x0010
SBSP_EXPLOREMODE = 0x0020
SBSP_HELPMODE = 0x0040
SBSP_NOTRANSFERHIST = 0x0080
SBSP_ABSOLUTE = 0x0000
SBSP_RELATIVE = 0x1000
SBSP_PARENT = 0x2000
SBSP_NAVIGATEBACK = 0x4000
SBSP_NAVIGATEFORWARD = 0x8000
SBSP_ALLOW_AUTONAVIGATE = 0x10000
SBSP_CALLERUNTRUSTED = 0x00800000
SBSP_TRUSTFIRSTDOWNLOAD = 0x01000000
SBSP_UNTRUSTEDFORDOWNLOAD = 0x02000000
SBSP_NOAUTOSELECT = 0x04000000
SBSP_WRITENOHISTORY = 0x08000000
SBSP_TRUSTEDFORACTIVEX = 0x10000000
SBSP_REDIRECT = 0x40000000
SBSP_INITIATEDBYHLINKFRAME = 0x80000000
;フォルダパスを指定してアイテムID取得
shf = 0
SHGetDesktopFolder varptr(shf);IShellFolderインターフェイス取得
if ( stat == 0 ){
newcom shell, IShellFolder, -1, shf
dispName = _path
ISF_ParseDisplayName shell, 0, 0, dispName, 0, item, 0;LPITEMIDLIST取得
if ( stat == 0 ){
BrowseObject browser, item, SBSP_SAMEBROWSER;フォルダパス変更
CoTaskMemFree item
}
delcom shell
}
;***********
;破棄
mes "end"
;Quit browserApp
;mes stat
delcom options
delcom browser
delcom provider
delcom browserApp
delcom shellWindow
break
loop
delcom wc
;見つけた?
if find=1{
break;終わり
}else{
wait 1;もう一回
mes "まだ〜?"
}
loop
delcom sa
;表示
ShowWindow rehwnd,5
;閉じる
;sendmsg rehwnd,WM_SYSCOMMAND,SC_CLOSE, 0
//リストビューを探す
GetList rehwnd
return
#global
;********
;
#module
#deffunc GetExplorerList str _path
//フォルダパスに変更
folder = getpath(_path,32)
//非表示でエクスプローラ起動 マイコンピュータを開く
OpenExplorer hid
;wait 10
;dialog
//フラグ変更、パス変更
SetExplorerFlag hid, folder
return
#global
//ディレクトリCを開いて、リストビューのハンドル取得
GetExplorerList "C:\\"
非表示の状態でエクスプローラを開き指定パスに移動したあとにエクスプローラを閉じると
sendmsg rehwnd,WM_SYSCOMMAND,SC_CLOSE, 0
エラー音がでて閉じるを失敗してしまうんですよね、どうしよ…

| |
|
2015/10/3(Sat) 15:58:48|NO.72100
GetListの下で終了命令させたらエラーでなくなった、そもそも上のほうでウィンドウ消したらウィンドウリスト取得できないけど…
GetListをコメントアウトしたらエラーがでるからGetList内でなにか良い作用が起こっているんだろか
|
|
2015/10/4(Sun) 09:55:30|NO.72101
|
|
2015/10/4(Sun) 15:06:20|NO.72103
あー、リストビューで取得しなきゃ羅列の順番が取得できないのと一緒じゃねえか
|
|
2015/10/5(Mon) 10:03:36|NO.72116
再度IAccessibleつかってAccessibleChildrenで子オブジェクトを取得する方法を試みたけど
配列のvariant受け取る方法なんて知らねえ、行き詰った
もう一回リストビューで取得方法考えてみてダメなら諦めようと思い
ほんとにエクスプローラのリストビューを取得できるのかを他の人が作ったソフトで検証してみた
ListView to CSV: http://www.inasoft.org/lv2csv/
検証した結果は、FVO_VISTALAYOUTのフラグを変えたエクスプローラのリストビューを取得できました
前回自分が取得試みて失敗した理由はまだわかりませんが、エクスプローラは64bitのプロセスなのが関係してるかも?
|
|
2015/10/5(Mon) 21:02:53|NO.72120
hspのプロセスは32bitなのでどうあがいても64bitのプロセスから取得は無理だな…
エクスプローラを32bitのバージョンのやつ起動させればいいじゃんとおもい調べたところ
C:\windows\syswow64\explorer.exe /separate
これで起動できるらしいけど64bitしか起動しない
かなり前からバグが確認されてるけどマイクロソフトが修正してないみたい
|
|
2015/10/5(Mon) 23:08:32|NO.72126
うおおお成功した
プロセス弄るのは諦めて、再度IAccessibleで列挙させるためにAccessibleChildrenの使い方聞こうと
質問文したためてたらaccNameというプロパティを見つけたので試してみたところ
リストが並び順通りに表示されました、AccessibleChildrenとかいらんかったんや!
変な先入観というかサンプルソース理解できてないのが原因ですけど…
次回まとめのソースはってひとりごと終わろうと思います
他プロセスからのやりとりは32bitと64bitの弊害があると思ったのに、Accessibleで成功したのは謎ですね
APIでも色々あるってことで済ませとこう
|
|
2015/10/5(Mon) 23:45:32|NO.72130
独り言の話題からは話がそれますが、HSPプログラムコンテスト2015
のタイトルとサムネイルを考えてみました。タイトルはズバリ、
「マジカルモンキー(魔法のサル)」です。
詳しくはコンテスト内のおかずの友のコメントに記述しましたので、
見ていただけると、ありがたいです。
26℃様、どうかよろしくお願いします。
|
|
2015/10/5(Mon) 23:56:57|NO.72132
mirage17さん名前かんがえていただきありがとうございます
健全なもの作ることに方針転換したのでバナナはなしのほうこうになりました
|
|
2015/10/6(Tue) 00:10:10|NO.72134
26℃様、お返事いただきありがとうございます。
方針転換とても良い考えだと思います。
私のコメントを見ていただけただけでも幸いです。
今後も、よろしくお願いします。
ありがとうございました。
|
|
2015/10/7(Wed) 16:59:57|NO.72154
ながながと書いてきたけどファイルの並び順の取得はあきらめることにしました
フォルダの開き方によって、並び順が統一されているという保証がないんですよね
デスクトップ画面からフォルダクリックして開く方法と、スタートメニューの検索バーにフォルダパス入力
して開く方法で比べるとおなじフォルダなのに表示の仕方が違うのがわかると思います
直接開いているフォルダにFVO_VISTALAYOUTフラグを変更させて、いったん別のフォルダを表示させて切り替える処理
させる方法が確実なのですが
見栄えが非常にわるいのでそれはやりたくない…
|
|