既存のアプリケーションにあるコンポーネント「syslistview32」から文字列取得を取得したいのです。
自分なりに調べてみましたが、SendMessageを使用するのだと思いますが、具体的な記述(流れ)の方法をどうしていいのか分かりません。
解る方いましたら、ご教授ください。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

>SendMessageを使用するのだと思いますが


SendMessageを利用するのであれば、共有メモリを利用します。

最初に
http://oshiete1.goo.ne.jp/kotaeru.php3?q=817941
の#2の参考URLを見てから#2の回答を見てください。
CをVB化しています。
(実を言うと、これ私が別のメーリングリストで公開したのに非常に似ているのですが^^;)
あとはLVM_GETITEMを確保した共有メモリ部に、書き込む処理を行っていきます。


共有メモリを利用するには、OS別の方法を考慮しなければならないのです。
SendMessage以外の別方法が手元にあるので、それを張ってきますね^^

デスクトップもsyslistview32でできてますので、それを捕らえる方法です。

要参照設定
oleacc.dll
(NT4ならばService Pack 6a)
(Win98ならば `ユーザ補助`をインストール)

んでもってサンプル
Option Explicit

Private Type UUID
  Data1 As Long
  Data2 As Integer
  Data3 As Integer
  Data4(7) As Byte
End Type

Private Const CHILDID_SELF = 0&
Private Const OBJID_CLIENT = &HFFFFFFFC

Private Declare Function AccessibleObjectFromWindow Lib "oleacc" _
  (ByVal hWnd As Long, _
  ByVal dwObjectID As Long, _
  ByRef riid As UUID, _
  ByRef ppvObject As Any) As Long

Private IID_IAccessible As UUID

Private Enum NVADIRConstants
  NAVDIR_MIN
  NAVDIR_UP
  NAVDIR_DOWN
  NAVDIR_LEFT
  NAVDIR_RIGHT
  NAVDIR_NEXT
  NAVDIR_PREVIOUS
  NAVDIR_FIRSTCHILD
  NAVDIR_LASTCHILD
  NAVDIR_MAX
End Enum

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWndParent As Long, ByVal hWndChildAfter As Long, ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Sub Main()
  Dim lngWnd As Long
  Dim colWk  As Collection
  Dim i    As Integer
  
  Call UUID_Init
  
  lngWnd = GetSysLVHwnd
  If Not GetListViewItems(lngWnd, colWk) Then
    MsgBox "失敗"
  End If
  
  For i = 1 To colWk.Count
    Debug.Print colWk(i)
  Next i
  
End Sub

Private Sub UUID_Init()
  With IID_IAccessible
    .Data1 = &H618736E0
    .Data2 = &H3C3D
    .Data3 = &H11CF
    .Data4(0) = &H81
    .Data4(1) = &HC
    .Data4(2) = &H0
    .Data4(3) = &HAA
    .Data4(4) = &H0
    .Data4(5) = &H38
    .Data4(6) = &H9B
    .Data4(7) = &H71
  End With
End Sub

Private Function GetSysLVHwnd() As Long
  Dim h As Long
  h = FindWindow("Progman", vbNullString)
  h = FindWindowEx(h, 0, "SHELLDLL_defVIEW", vbNullString)
  GetSysLVHwnd = FindWindowEx(h, 0, "SysListView32", vbNullString)
End Function

Private Function GetListViewItems(ByVal inWnd As Long, Optional otCol As Collection) As Boolean
  Dim objAcc   As IAccessible
  Dim varChild  As Variant
  
  Set otCol = Nothing

  Call AccessibleObjectFromWindow(inWnd, OBJID_CLIENT, IID_IAccessible, objAcc)

  If objAcc Is Nothing Then
    Exit Function
  End If
  
  Set otCol = New Collection
  
  varChild = objAcc.accNavigate(NAVDIR_FIRSTCHILD, CHILDID_SELF)
  Do Until IsEmpty(varChild)
    otCol.Add objAcc.accName(varChild)
    varChild = objAcc.accNavigate(NAVDIR_NEXT, varChild)
  Loop
  Set objAcc = Nothing
  GetListViewItems = True
End Function

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=817941
    • good
    • 0
この回答へのお礼

ご親切な回答ありがとうございました。
勉強したいと思います。

お礼日時:2005/04/16 13:09

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCanon IIs と IID の違いを教えてください

Canonキャノンの古いカメラで「Canon IIs」があります。私はこれを所有しているつもりでいたのですが、「Canon IID」じゃないのか?と指摘されました。
「Canon IIs」と「Canon IID」の違いがよく分からないのでどなたかご教授頂ければ幸いです。
念の為、私が所有しているカメラの写真を添付致します。
ご協力の程よろしくお願い致します。

Aベストアンサー

Canon SIIでは? でも、ちょっと違う気がする。
http://global.canon/ja/c-museum/product/film9.html

どちらかと言えば、ⅡDに近いと思う。
http://global.canon/ja/c-museum/product/film17.html

なお、SⅡは発売当初、ネジピッチ1mmの J マウント(キヤノン独自規格)であったが後にライカ L マウントに変更されています。

Jマウントカメラボディー[編集]

QVBで他アプリの「syslistview32」のテキストを取得したい

VB6で他アプリの「syslistview32」のテキストを取得したいのです。
取得するためにはAPIを使用すると思うのですが、
使用するAPIが分かりません。

記述方法など分かる方、簡単でいいので教えて頂けるとありがたいです。

また、解説しているHP等がありましたら紹介頂けるとありがたいです。
よろしくお願いします。

Aベストアンサー

C++の例
http://www.est.hi-ho.ne.jp/getchan/junks/junk01.html

VBでの宣言例
http://wk.doubleukay.com/unlinked/source/LVMacros_471.bas

Q自分のIID_IUnKnown取得について

実際自分でも言ってることが正しいものなのか疑問なのですが、よろしくお願いします。

ActiveX+SDKを用いて、HTTPS接続を行いファイルをダウンロードプログラムを組んでいるのですが、
先輩が言うには

呼び出す自身のIID_IUnKnownを取得の仕方を調べることで問題が解決するそうなのですが、いまいちというか、まったく分からない状態です(泣

現在のソースの一部を乗せておきます。
といっても現在ソースが手元にないので記憶からほりおこしてます・・・
QueryInterface(IID_IUnKnown ,※ )

※この部分わすれました

実際、自分でもこんな説明であっているのかなどもわかりません、足りない情報があるなら補足いたします。ちなみにC言語をまだ1ヶ月ほどのレベルです。

どうか、よろしくお願いいたします。

Aベストアンサー

自信はないですが。。。

>result = URLDownloadToFile( punk, szURL, szFileName, 0, NULL);//<-第一引数で取得したポインタをセットしたい

URLDownloadToFileの第5引数をNULL(進行状況を取得しない)にするのでしたら、第1引数もNULLのままで大丈夫だと思います。試してみてはどうでしょうか?

Qvb2008で文字列から文字列コードを取得する方法

サイトHTMLをWebBrowserを使用せずに取得するために、
Dim stream As System.IO.Stream = client.OpenRead(tbItemURL.Text)
Dim reader As New System.IO.StreamReader(stream)
Dim strHtml = reader.ReadToEnd()
reader.Close()
stream.Close()

のような形で文字列を取得しています。
しかし、この場合Sift-jis等の場合、後の作業(一部データ取得)で文字化けに悩まされます。

http://dobon.net/vb/dotnet/string/detectcode.html
上記サイトで「バイト配列」に格納して判別する方法があります。

そこで、文字列をバイト配列に格納しようとしますが…。
文字列→バイト配列には文字コードが必要となります。

Dim data() As Byte = Encoding.UTF8.GetBytes(text)

なんだか鶏と卵のような感じになってしまいます。

文字列から文字コードを判別する方法はないでしょうか?
よろしくお願いします。

サイトHTMLをWebBrowserを使用せずに取得するために、
Dim stream As System.IO.Stream = client.OpenRead(tbItemURL.Text)
Dim reader As New System.IO.StreamReader(stream)
Dim strHtml = reader.ReadToEnd()
reader.Close()
stream.Close()

のような形で文字列を取得しています。
しかし、この場合Sift-jis等の場合、後の作業(一部データ取得)で文字化けに悩まされます。

http://dobon.net/vb/dotnet/string/detectcode.html
上記サイトで「バイト配列」に格納して判別する方法があります。
...続きを読む

Aベストアンサー

#1 Wizard_Zeroです。すみません、ちゃんとテストしないで投稿してしまいました。

以下、修正したコードです。
srmBuffの内容を全てメモリストリームへコピーしてバイト配列を得るようにしました。

Dim client As New Net.WebClient
Dim srmBuff As IO.Stream = client.OpenRead("http://hoge")
Dim bytBuff As Byte() = {}

Using srmMemory As New IO.MemoryStream
Dim bytRead As Byte() = {}, intRead As Integer = 0
Call Array.Resize(bytRead, 1024)

intRead = srmBuff.Read(bytRead, 0, bytRead.Length)

Do While intRead > 0
Call srmMemory.Write(bytRead, 0, intRead)
intRead = srmBuff.Read(bytRead, 0, bytRead.Length)
Loop

bytBuff = srmMemory.ToArray
End Using

#1 Wizard_Zeroです。すみません、ちゃんとテストしないで投稿してしまいました。

以下、修正したコードです。
srmBuffの内容を全てメモリストリームへコピーしてバイト配列を得るようにしました。

Dim client As New Net.WebClient
Dim srmBuff As IO.Stream = client.OpenRead("http://hoge")
Dim bytBuff As Byte() = {}

Using srmMemory As New IO.MemoryStream
Dim bytRead As Byte() = {}, intRead As Integer = 0
Call Array.Resize(bytRead, 1...続きを読む

QDX7-IIDに詳しい方よろしくお願いします。

初歩的な質問で申し訳ありません。DX7-IIDはFDドライブがありませんが、この場合は音色はRAMに保存するしかないのでしょうか?
MIDIを利用してPCにデータ保存する方法などがありましたらお教え頂ければ幸いです。
宜しくお願い致します。

Aベストアンサー

DX7-IIDは、RAMカートリッジが入手可能であれば、それに保存するのが一番手軽でスピーディーですね。
(今となっては入手はけっこう難しいとは思いますが…)

DX7-IIDで、MIDIを使って音色データ等を出力することは可能です。
こういうMIDIデータの事を「エクスクルーシブメッセージ」と呼びます。
ほとんどのシンセでエクスクルーシブメッセージの入出力は可能です。(一般にちょっとめんどくさいです…。)

余談ですが、DX7-IIDが現役だった頃は、YAMAHAからMDF2というエクスクルーシブメッセージをファイルする為の
”データファイルの為の専用機”なるものが販売されてました。(こっちの方が今となっては入手は不可能かと思いますが…。)

MIDIインターフェイスを介してDX7-IIDをPCに繋いで、エクスクルーシブメッセージをPCに取り込む事は、出来なくは無いと思いますが、
そういった用途のPCソフトが有るか無いかについては、よく知りません。
DAWソフトでリアルタイムレコーディング中に、DX7-IIDからエクスクルーシブメッセージを送信したら、たぶん取り込めます。
(すいませんが現在手元に無いので試しておりません…)

DX7-IIDの操作については、マニュアルの84ページあたりです。
リンクはマニュアルライブラリーです。
http://www.yamaha.co.jp/manual/japan/result.php?div_code=

回答になっているか分かりませんが、
ご参考まで。

DX7-IIDは、RAMカートリッジが入手可能であれば、それに保存するのが一番手軽でスピーディーですね。
(今となっては入手はけっこう難しいとは思いますが…)

DX7-IIDで、MIDIを使って音色データ等を出力することは可能です。
こういうMIDIデータの事を「エクスクルーシブメッセージ」と呼びます。
ほとんどのシンセでエクスクルーシブメッセージの入出力は可能です。(一般にちょっとめんどくさいです…。)

余談ですが、DX7-IIDが現役だった頃は、YAMAHAからMDF2というエクスクルーシブメッセージをファ...続きを読む

QASP.NET WEBアプリケーションで作成されたページより他の既存ペ

ASP.NET WEBアプリケーションで作成されたページより他の既存ページへデータを投げたいと考えているのですがセキュリティ上難しいのでは?と考えています。しかし、なんとか代替案がないかと思っておりどなたかヒントをいただけないでしょうか?
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
<asp:TextBox ID="TextBox3" runat="server" Height="72px" TextMode="MultiLine"
Width="651px"></asp:TextBox>
<br />
<asp:Button ID="Button1" runat="server" Text="Button" />
<asp:Button ID="Button2" runat="server" Text="Button" />
<br />
<br />
<asp:Label ID="Label1" runat="server"></asp:Label>

例えばこんな簡単なaspxのページで構成されているとします。
テキストボックスに入れた値を既存のWEBページ(Yahooへのログインだとか)へ入れ込みたいのですが・・・クライアントにスクリプトで作ってとかなら余裕で出来ると思うのですがサーバサイドで仕込むことは難しいでしょうか?回避策とかもあるとなおうれしいのですが・・・よろしくお願いします。

ASP.NET WEBアプリケーションで作成されたページより他の既存ページへデータを投げたいと考えているのですがセキュリティ上難しいのでは?と考えています。しかし、なんとか代替案がないかと思っておりどなたかヒントをいただけないでしょうか?
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
<asp:TextBox ID="TextBox3" runat="server" Height="72px" TextMode="MultiLine"
Width="651px"></asp:TextBox>
<br />
<asp:Button ID="Button1" runat="server" Text="Button" />&nbs...続きを読む

Aベストアンサー

別サーバーとなるとそれはサーバーサイドでやる処理ではないかと・・・
一応TextBoxの値をSessionで保持しておき入れることは出来そうな気がしますが、やはりクライアント側でやるべきですね^^;

Qx1とx2を独立、同一に分布している(iid)

x1とx2を独立、同一に分布している(iid)
(1)連続のランダム変数
(2)離散のランダム変数
だとします。

(1),(2)においてP[x1<=x2]は計算できるのでしょうか。
計算できるならば計算の仕方、値を算出できないのならばその理由を知りたいです。

Aベストアンサー

「連続かどうか」というよりは「確率密度関数が全ての x で有界かどうか」の方が重要です.
まず, 連続だろうと離散だろうと iid という仮定から P[x1 ≦ x2] = P[x2 ≦ x1] (= P[x1 ≧ x2]) です. で, P[x1 ≧ x2] = P[x1 > x2] + P[x1 = x2] なので
2 P[x1 ≦ x2] = P[x1 ≦ x2] + P[x2 ≦ x1] = 1 + P[x1 = x2] つまり
P[x1 ≦ x2] = (1 + P[x1 = x2])/2
です. #1 で P[x1 = x2] を書いたのはこれが理由.
ここまでは連続か離散かに関係なく成り立ちます. 問題はここからで, 確率密度が全ての x で有界のときには P[x1 = x2] = 0 です. これは積分してもわかりますし, 直感的には「x1 = x2 を満たす領域の面積は 0」ということからもわかると思います. ということは, 最終的に P[x1 ≦ x2] = 1/2 です.
一方 (離散分布で典型的ですが) 確率密度が ∞ になることがあるような分布の場合には P[x1 = x2] が 0 にはならないので, P[x1 ≦ x2] の値も分布が与えられないと答えられないということになります.

「連続かどうか」というよりは「確率密度関数が全ての x で有界かどうか」の方が重要です.
まず, 連続だろうと離散だろうと iid という仮定から P[x1 ≦ x2] = P[x2 ≦ x1] (= P[x1 ≧ x2]) です. で, P[x1 ≧ x2] = P[x1 > x2] + P[x1 = x2] なので
2 P[x1 ≦ x2] = P[x1 ≦ x2] + P[x2 ≦ x1] = 1 + P[x1 = x2] つまり
P[x1 ≦ x2] = (1 + P[x1 = x2])/2
です. #1 で P[x1 = x2] を書いたのはこれが理由.
ここまでは連続か離散かに関係なく成り立ちます. 問題はここからで, 確率密度が全ての x で有界のときには P[x1 = ...続きを読む

QWebBrowserコンポーネントでリンク先を取得したい

コンポーネントの、Microsoft Internet Controls の
Web Browser を使って、ブラウザソフトを作ろうと思っています。

カーソルがハイパーリンクに乗った時に、
リンク先を取得したいのですが、方法が分かりません。

StatusTextChange() で取得できると聞いたのですが、
そこで、何をやったらいいいのかが分かりません。


プロパティの StatusTextを使って、

Private Sub Browser1_StatusTextChange(ByVal Text As String)

Label1.Caption = Browser1.StatusText

End Sub

ではエラーが出ました。

もしかしたらこのイベント自体が的を外しているのかも知れませんが、
Labelに、普通のWebBrowserのステータスバーと
同じ働きをさせたいと思っています。
どなたかご存じの方は、どうぞご教授下さいませ。


趣味の範囲で作っているのでそんなに困ってはいません。
どなたか、お時間に余裕があるときに
ご教授いただけたらと思います。

よろしくお願いいたします。

コンポーネントの、Microsoft Internet Controls の
Web Browser を使って、ブラウザソフトを作ろうと思っています。

カーソルがハイパーリンクに乗った時に、
リンク先を取得したいのですが、方法が分かりません。

StatusTextChange() で取得できると聞いたのですが、
そこで、何をやったらいいいのかが分かりません。


プロパティの StatusTextを使って、

Private Sub Browser1_StatusTextChange(ByVal Text As String)

Label1.Caption = Browser1.StatusText

End Sub

ではエラーが出...続きを読む

Aベストアンサー

>Private Sub Browser1_StatusTextChange(ByVal Text As String)
>Label1.Caption = Browser1.StatusText
>End Sub
となっていますが
Label1.Caption = Text
で言いと思います。
これは、URLだけじゃなくて、他の情報(「ページが表示されました」とか、「Web サイトが見つかりました。応答を待っています..」等)も取得されます。
的違いかもしれないですが、たぶん大丈夫でしょう。

QMSXML3でerror: 'C2065 IID_IXMLDOMSelection' :定義されていない識別子です。 が出てコンパイルできない。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" rename_namespace("MSXML2") rename("EOF", "EndOfFile")
#import "msxml3.dll"
using namespace MSXML2;

というようにMSXML3をimportし以下のようなソースを
書いたのですがコンパイルエラーになってしまいます。

IXMLDOMDocumentPtr pDoc;
IXMLDOMNodeListPtr pNodeList;

pDoc.CreateInstance(__uuidof(DOMDocument30));
pDoc->put_async(VARIANT_FALSE);
pDoc->validateOnParse = FALSE;

pDoc->load( _variant_t(XMLファイル) );

pNodeList = pDoc->selectNodes("//rs:data");

IXMLDOMSelection *pIXMLDOMSelection=NULL;
pNodeList->QueryInterface(IID_IXMLDOMSelection, (void**)&pIXMLDOMSelection );

ヘッダがないとよく出てくるエラーだと思いMSDNで調べたらmsxml2.hというヘッダがあるようなことが書かれていました。
そこで
#include <msxml2.h>
というコードを追加したのですが"見つかりません"と言われてしまいます。

http://cvs.sourceforge.net/viewcvs.py/libxml2-pas/dom2/Attic/MSXML3.pas?rev=1.3
上記のサイトに
IID_IXMLDOMSelection: TGUID = '{AA634FC7-5888-44A7-A257-3A47150D3A0E}';
という記載がありこれが見つからないのではと思っていますがどうしたらよいのか分かりません。

アドバイスお願いします。

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" rename_namespace("MSXML2") rename("EOF", "EndOfFile")
#import "msxml3.dll"
using namespace MSXML2;

というようにMSXML3をimportし以下のようなソースを
書いたのですがコンパイルエラーになってしまいます。

IXMLDOMDocumentPtr pDoc;
IXMLDOMNodeListPtr pNodeList;

pDoc.CreateInstance(__uuidof(DOMDocument30));
pDoc->put_async(VARIANT_FALSE);
pDoc->validateOnParse = FALSE;

pDoc->load( _variant_t(XMLファイ...続きを読む

Aベストアンサー

MSXML (Microsoft XML Parser) 3.0 Software Development Kit (SDK)
http://www.microsoft.com/downloads/details.aspx?FamilyID=2cf40ae6-368c-4b6b-a185-2dfa92fb7993&DisplayLang=en
は、ダウンロード済みでしょうか?
上記をインストールしたフォルダのincフォルダの中に
msxml2.h
はあります。

QVBに既存のアプリケーションを組み込むには?

VBに既存のアプリケーションを組み込むことは可能なのでしょうか?
あらかじめパソコンにアプリケーションがインストールされてあれば呼び出せることができますが、インストールされていなかったらどのようにして組み込めばいいのですか?


例)コマンドボタンを押したらゲーム(ベクターで配られている無料)がひらく等・・

ゲームをインストールしてから自作のVBアプリをインストールしていては2度でまなので1度で済ませたいのですが可能でしょうか?
よろしくお願いしますm( _ _ )m

--------------------------------------
環境はVB6です OSはXPProです

Aベストアンサー

 その既存のアプリケーションが自作のものであれば、呼び出し側のプログラムと一緒に配布してしまえばいいのです。

 しかしベクターで配られているフリーゲームと連携する場合、1度で済ますことはできません。
 技術的には可能ですが、著作権上やってはいけないのです。

 もちろん、作者の方からOKをもらうことができればいいんですが、そうでない場合は無料だからとて勝手にやっていいわけではないのです。
 ましてや他人が作ったプログラムを、自分のプログラムの中に埋め込むなんてのは、著作権法違反の最たるものです。

 作者の方に連絡して許可がもらえなかった場合、あきらめて2度手間を踏みましょう。


人気Q&Aランキング