アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

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が見つからない時は、教えて!gooで質問しましょう!

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