HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0930
26℃エクスプローラのリストビュー17解決


26℃

リンク

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



この記事に返信する


26℃

リンク

2015/9/30(Wed) 21:52:37|NO.72063

諦めずにフォルダ弄ってたら、変化発見
エクスプローラ開いた後に、フラグ変えて、その後にエクスプローラで別のフォルダを開いたら
DIRECTUIHWNDがSYSLISTVIEW32に変化してました

別窓で開いたらダメ、ハンドルを維持する必要があるので左側のツリービューでフォルダ切り替える必要がある
…思ってたのと違う



26℃

リンク

2015/9/30(Wed) 22:49:01|NO.72068

spy++でハンドルとクラス名とオブジェクト数を取るツールも置いとこう
http://oirahakobito.up.seesaa.net/image/spypp.zip
ここ参考につくりました
http://monooki.ldblog.jp/archives/32180721.html



26℃

リンク

2015/9/30(Wed) 23:12:06|NO.72069

DIRECTUIHWNDの状態でもオブジェクトの数はIAccessibleのプロパティaccChildCountで取得できるけど不完全
エクスプローラーをspy++で見るとオブジェクトの数=ファイル数なのですが
表示されているぶんしか取得できない、スクロールバーが表示されていたらその非表示部分は取得不能
FVO_VISTALAYOUTに変えてあげて、フォルダの階層を切り替える処理をすると(めんどくせぇ)非表示部分も
accChildCountで取得できるようになるっぽい



26℃

リンク

2015/10/1(Thu) 00:16:49|NO.72070

階層を変えるというか親のハンドルIDは変わらないけどリストビューのハンドルIDが変わってるようなので
リストビューを再描画させればいいのかな、問題はその方法か



26℃

リンク

2015/10/1(Thu) 01:00:49|NO.72071

Runメソッドでエクスプローラーを非表示で起動させたあとに、フォルダの切り替えを行って
必要なファイルの並び順リスト手に入れたらポイする感じでいいか



26℃

リンク

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



26℃

リンク

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
エラー音がでて閉じるを失敗してしまうんですよね、どうしよ…



26℃

リンク

2015/10/3(Sat) 15:58:48|NO.72100

GetListの下で終了命令させたらエラーでなくなった、そもそも上のほうでウィンドウ消したらウィンドウリスト取得できないけど…
GetListをコメントアウトしたらエラーがでるからGetList内でなにか良い作用が起こっているんだろか



26℃

リンク

2015/10/4(Sun) 09:55:30|NO.72101

ここを参考に他プロセスのリストビューの文字列取得をこころみたところ
http://www.inasoft.org/lv2csv/lvcsvcom/chapter3.html
エクスプローラのリストビューで文字列が返ってこない…
デスクトップのリストビューでも文字列が返ってこない…
それ以外のリストビューでは文字列取得に成功したんだけどね…

取得方法はこれ以外にもまだありそうなので試してみます
http://hp.vector.co.jp/authors/VA016117/explorer1.html
http://www.eonet.ne.jp/~maeda/winc/mycomp.htm



26℃

リンク

2015/10/4(Sun) 15:06:20|NO.72103

あー、リストビューで取得しなきゃ羅列の順番が取得できないのと一緒じゃねえか



26℃

リンク

2015/10/5(Mon) 10:03:36|NO.72116

再度IAccessibleつかってAccessibleChildrenで子オブジェクトを取得する方法を試みたけど
配列のvariant受け取る方法なんて知らねえ、行き詰った

もう一回リストビューで取得方法考えてみてダメなら諦めようと思い
ほんとにエクスプローラのリストビューを取得できるのかを他の人が作ったソフトで検証してみた
ListView to CSV:http://www.inasoft.org/lv2csv/
検証した結果は、FVO_VISTALAYOUTのフラグを変えたエクスプローラのリストビューを取得できました
前回自分が取得試みて失敗した理由はまだわかりませんが、エクスプローラは64bitのプロセスなのが関係してるかも?



26℃

リンク

2015/10/5(Mon) 21:02:53|NO.72120

hspのプロセスは32bitなのでどうあがいても64bitのプロセスから取得は無理だな…
エクスプローラを32bitのバージョンのやつ起動させればいいじゃんとおもい調べたところ
C:\windows\syswow64\explorer.exe /separate
これで起動できるらしいけど64bitしか起動しない
かなり前からバグが確認されてるけどマイクロソフトが修正してないみたい



26℃

リンク

2015/10/5(Mon) 23:08:32|NO.72126

うおおお成功した
プロセス弄るのは諦めて、再度IAccessibleで列挙させるためにAccessibleChildrenの使い方聞こうと
質問文したためてたらaccNameというプロパティを見つけたので試してみたところ
リストが並び順通りに表示されました、AccessibleChildrenとかいらんかったんや!
変な先入観というかサンプルソース理解できてないのが原因ですけど…
次回まとめのソースはってひとりごと終わろうと思います

他プロセスからのやりとりは32bitと64bitの弊害があると思ったのに、Accessibleで成功したのは謎ですね
APIでも色々あるってことで済ませとこう



mirage17

リンク

2015/10/5(Mon) 23:45:32|NO.72130

独り言の話題からは話がそれますが、HSPプログラムコンテスト2015
のタイトルとサムネイルを考えてみました。タイトルはズバリ、
「マジカルモンキー(魔法のサル)」です。
詳しくはコンテスト内のおかずの友のコメントに記述しましたので、
見ていただけると、ありがたいです。
26℃様、どうかよろしくお願いします。



26℃

リンク

2015/10/5(Mon) 23:56:57|NO.72132

mirage17さん名前かんがえていただきありがとうございます
健全なもの作ることに方針転換したのでバナナはなしのほうこうになりました



mirage17

リンク

2015/10/6(Tue) 00:10:10|NO.72134

26℃様、お返事いただきありがとうございます。
方針転換とても良い考えだと思います。
私のコメントを見ていただけただけでも幸いです。
今後も、よろしくお願いします。
ありがとうございました。



26℃

リンク

2015/10/7(Wed) 16:59:57|NO.72154

ながながと書いてきたけどファイルの並び順の取得はあきらめることにしました
フォルダの開き方によって、並び順が統一されているという保証がないんですよね
デスクトップ画面からフォルダクリックして開く方法と、スタートメニューの検索バーにフォルダパス入力
して開く方法で比べるとおなじフォルダなのに表示の仕方が違うのがわかると思います
直接開いているフォルダにFVO_VISTALAYOUTフラグを変更させて、いったん別のフォルダを表示させて切り替える処理
させる方法が確実なのですが
見栄えが非常にわるいのでそれはやりたくない…



ONION software Copyright 1997-2023(c) All rights reserved.