|
現在UWSCをWin7、Win8で使用していますが、 Win7以降、64bitPCでリストビューが取得できなくなってしまっており支障をきたしています
ACC以外の方法でどうにかして一覧の取得、クリックを行いたいのですが APIを利用して何とかできないものか相談させてください
理屈では SendMessageA で取得できるようなのですが UWSCでは直接構造体が渡せない、分解して渡してもうまく動かない VOIDマクロはDLL関数としては定義できない、と困っております。
APIに精通している方、お知恵を貸していただけませんでしょうか
-------------------------------------------------------- DEF_DLL SendMessageA(HWND, UINT, Long, var Long) :Long :user32.DLL
CONST LVM_GETITEMCOUNT = $1004 CONST LVM_DELETEITEM = $1008 CONST LVM_GETITEMTEXTA = $1045
WinID = GetID("のプロパティ","#32770") B_HNDL = GETCTLHND(WinID, "SysListView32", 0)
// この関数はOK。ちゃんと個数が返ってくる BCnt = SendMessageA(B_HNDL, LVM_GETITEMCOUNT, 0, 0) // リスト項目が消えるけど役に立たないよ… BHDL = SendMessageA(B_HNDL, LVM_DELETEITEM, 0, 0)
// 構造体 LVITEM が引き渡せない、というより作成できない? // DEF_DLL SendMessageA(HWND, UINT, Long, var Long) :Long :user32.DLL // SendMessageA(B_HNDL, LVM_GETITEMTEXTA, 0, LVITEM)
// メモリを破壊してExplorerがぶっ壊れる // DEF_DLL SendMessageA(HWND, UINT, Long, UINT, Long, Long, UINT, UINT, var Long, Long) :Long :user32.DLL // SendMessageA(B_HNDL, LVM_GETITEMTEXTA, 0, $0001, 0, $0000, -1, Buff, $FF)
// ListView_GetItemText 関数がVOIDマクロなのでだめ。定義できない // DEF_DLL ListView_GetItemText(HWND, Int, Int, var String, Int)::user32.dll // ListView_GetItemText(B_HNDL, 1, 0, Buff, $FF)
// LVITEMの構造体 TEXTBLOCK LVITEM { mask: ['UINT'] iItem: ['int'] iSubItem: ['int'] state: ['UINT'] stateMask: ['UINT'] pszText: ['LPTSTR'] cchTextMax: ['int'] iImage: ['int'] lParam: ['LPARAM'] iIndent: ['int'] iGroupId: ['int'] cColumns: ['UINT'] puColumns: ['UINT'] piColFmt: ['int'] iGroup: ['int'] } ENDTEXTBLOCK --------------------------------------------------------
やりたいこと
?@ネットワーク接続のアイコン(ncpa.cpl)を確実に取得したい (ACC指定だとウインドウが小さかったり画面外だった場合にすべて取得・クリックできない) (接続先が大量に追加されているPCでは目的のアダプタがどこにあるのか判断できない)
?Aネットワークアダプタのプロパティ画面で「TCP/IPv4」をセレクトしてプロパティを開きたい (これもACC指定だとプロトコルが大量に追加されているPCだとリストの場所が確定できない) (リスト外、画面外にあってクリックに失敗していてもACC指定では 戻り値がすべて成功になっており、確実な動作を期待できない)
UWSC本体側の対応(ITM_ListViewの復活)はできないのでしょうか? 合わせてよろしくお願いします
|
No.1032 2015/03/24(Tue) 02:51:17
|
☆ Re: Win7 64bitPCで Itm_ListView の代替 / stuncloud |
|
|
ヘルプより > 構造体:型を { } にて展開して書く 関数名( double, {int, int, int} )
LVM_GETITEMTEXTでぐぐったら茨の道が垣間見えたのであまりやりたくない感じですねぇ… 僕ならdoscmdでnetshを検討します
|
No.1035 2015/03/24(Tue) 11:43:40
|
|
☆ Re: Win7 64bitPCで Itm_ListView の代替 / えあり |
|
|
Netshでサポートされていない、PoweShellでもできない、WMIコントロールでも変更不能 レジストリ操作でもバイナリのために参照出来ない値を変更するために、 どうしてもプロパティからGUI操作が必要なのです
よろしくお願いします
----------------------- DEF_DLL SendMessageA(HWND, UINT, Long, var DWORD[]) :Long :user32.DLL Dim LSTVEW[99] SendMessageA(B_HNDL, LVM_GETITEMTEXTW, 0, LSTVEW) ----------------------- 配列リストで送ってみた場合、動作はするようですがやはり取得できませんでした
C++のサイト等で見てみると バーチャルメモリ空間を作ってそこへコピーして参照する方法等もあるようで UWSCでも内部的な処理でうまいこと出来そうなのですが・・・
|
No.1036 2015/03/24(Tue) 13:14:15
|
|
☆ Re: Win7 64bitPCで Itm_ListView の代替 / stuncloud |
|
|
> Netshでサポートされていない、PoweShellでもできない、WMIコントロールでも変更不能 > レジストリ操作でもバイナリのために参照出来ない値を変更するために、 > どうしてもプロパティからGUI操作が必要なのです なるほど、そういうことでしたか… ちなみに具体的には何を設定するのでしょうか
> ?@ネットワーク接続のアイコン(ncpa.cpl)を確実に取得したい > (ACC指定だとウインドウが小さかったり画面外だった場合にすべて取得・クリックできない) ・ウィンドウサイズが小さい場合は十分に大きくする ・画面外だった場合は画面内に移動させる ・それでも表示しきれない部分でクリックに失敗する場合は、スクロール後に再クリックという動作を目的のダイアログが表示されるまで繰り返す といった対処を入れたらどうでしょう
> ?Aネットワークアダプタのプロパティ画面で「TCP/IPv4」をセレクトしてプロパティを開きたい > (これもACC指定だとプロトコルが大量に追加されているPCだとリストの場所が確定できない) > (リスト外、画面外にあってクリックに失敗していてもACC指定では > 戻り値がすべて成功になっており、確実な動作を期待できない) こちらもスクロールを併用してクリック後に対象のプロパティダイアログが表示されるまで繰り返す、で対処出来ないでしょうか
> バーチャルメモリ空間を作ってそこへコピーして参照する方法 過去にそういうモジュールを作っていたので久しぶりに引っ張りだして使ってみたんですがうまく行きませんでした https://stuncloud.wordpress.com/2012/08/10/uwsc_module_structures/ ぐぐったらx64アプリ相手だとポインタのサイズが変わるんだよ、という話を見つけたのでそういうことだったのかもしれません、longlongで対応出来るのかな
あと、実は32bitのexplorerだったらlistview系の操作が出来るのではないか?と仮定して32bitのexplorerを起動してみたかったんですけど、どうやら7のx64だと無理みたいですね
|
No.1038 2015/03/24(Tue) 18:03:46
|
|
☆ Re: Win7 64bitPCで Itm_ListView の代替 / えあり |
|
|
>stuncloud 様
何度もありがとうございます。
実際にやりたいことは ?@すべてのアダプタでネットワーク接続のプロトコル欄にあるチェックボックスをOFFにしたい (ACC指定だと戻値が期待できないので成功判定があいまい) ?Aこの接続のアドレスをDNSに登録するをOFFにしたい (これは新たにウインドウが出る上にボタンなので、プロトコルさえ選択できればできる)
?@がHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network にある KEY:Config に バイナリデータとして格納されています。これが読み解けません。 この要件を満たすためには確実にネットワークアダプタアイコンを把握して プロトコルをクリックしなければなりません
ACC指定の場合ネットワークアダプタアイコン「名」がネックとなり、 画面からはみ出したり画面外にあった場合、最前面指定の駐在ソフトがあった場合に 意図した動作が期待できないので Clk_LstViewができないのならばGETITEMTEXTWで選択した状態にしたいということでした。 (選択さえできればVK_Appsを投げるだけでプロパティが開く)
ListView to CVS ttp://www.inasoft.org/lv2csv/ というツールを作っている作者が実際にListViewを抜きだすツールとソースコードを出しているので 絶対にできるはずなのですが、UWSCに変換する技術が私にはまだまだ足りないようで悔しくてなりません。
引き続き情報を募集しますのでよろしくお願いいたします。
|
No.1039 2015/03/24(Tue) 19:10:17
|
|
☆ Re: Win7 64bitPCで Itm_ListView の代替 / umiumi |
|
|
>UWSC本体側の対応(ITM_ListViewの復活)はできないのでしょうか? 確認しました。 対処します。
|
No.1041 2015/03/24(Tue) 22:16:48
|
|
☆ Re: Win7 64bitPCで Itm_ListView の代替 / stuncloud |
|
No.1043 2015/03/24(Tue) 23:27:12
|
|
☆ Re: Win7 64bitPCで Itm_ListView の代替 / えあり |
|
|
>umiumi 様
>確認しました。 >対処します。
対処ありがとうございます。 よろしくお願いします。
ついでに言うとツリービューもダメです
リストのチェックボックス付拡張スタイルにて APIからだとそのチェック状態も取得できるようなので CHKBTN に一つ機能追加していただけると更に助かります
>stuncloud 様
重ね重ね、何度もありがとうございます。
>nvspbindというのがあるようです
こんなものが出たのですね・・・ netshコマンドもWin10以降ではサポート外になるオプションがあるようで 今後OS標準搭載になっていく流れなのでしょうか
ただ、残念なことに許可アプリ以外は動かせないルールがありまして 非常に歯がゆいですがこの方法は今回は利用できません UWSCか、OS標準構成での実現を考えております
|
No.1045 2015/03/25(Wed) 00:49:21
|
|
☆ Re: Win7 64bitPCで Itm_ListView の代替 / しゅん |
|
|
私のStructモジュールを使われているようなので、私もやってみましたが、、、上手くいきません。 (Structモジュールは、UINTはDWORDとかLPARAMはintとかにしないと、そもそもダメですが、それを直してもダメ)
んで苦闘してたのですが、わかりました。 SendMessageのLPARAM、多分そのまま渡ってます。(まー、それもそうか) 何がまずいかと言うと、LPARAMのポインターは、UWSCのメモリーです。 がListView側で期待するのは、ListView側で書けるメモリーです。
ということで、x86空間にいるUWSCには、x64のリストビューには厳密には手出しができません。 (が、まあ、レアケースでListView側が落ちるのを許容するなら、なんとかなります)
メモリー空間を意識しながら取得するアプリケーションを書いたところ、 ・x86アプリがx86ListViewを読む ・x86アプリがx64ListViewを読む(リスクあり) ・x64アプリがx86ListViewを読む(こっちは安全) ・x64アプリがx64ListViewを読む の組み合わせで可能なことを確認しました。 一応、x86版はUWSCのスクリプトに直せると思います。
ただ、、、これ、厳密には危険行為なので、公開の掲示板に書きたくありません。(すみません) ここまでのヒントで頑張れるなら頑張って、そうでなければumiumiさんの修正を気長に待つかしてください。 また、チェックの状態はCHKIMGやPEEKCOLOR等で判別する方法もあるとは思います。
|
No.1048 2015/03/25(Wed) 21:52:37
|
|