- 題名: デスクトップからアイコンテキストが返ってこない
- 日時: 2014/04/03 14:57:06
- ID: 32230
- この記事の返信元:
- (なし)
- この記事への返信:
- [32231] Re[1]: デスクトップからアイコンテキストが返ってこない2014/04/03 15:15:40
- ツリーを表示
■No32232に返信(/400さんの記事) > デスクトップです(ポイントしたアイコンのテキストを取得してました) であれば、IAccessible インターフェイスの方が手っ取り早いかも。 Imports System.Runtime.InteropServices Public Class Form1 'Accessibility.dll を参照設定しておくこと <DllImport("oleacc")> _ Private Shared Function AccessibleObjectFromPoint _ (ByVal xScreen As Integer, _ ByVal yScreen As Integer, _ ByRef ppvObject As Accessibility.IAccessible, _ ByRef pvarChild As Object) As Integer End Function Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick 'マウス座標 Dim pos As Point = Cursor.Position Dim acc As Accessibility.IAccessible = Nothing Dim child As Object = Nothing AccessibleObjectFromPoint(pos.X, pos.Y, acc, child) Label1.Text = "" Label2.Text = "" Try Label1.Text = acc.accName(child) Dim l, t, w, h As Integer acc.accLocation(l, t, w, h, child) Label2.Text = (New Rectangle(l, t, w, h)).ToString() Catch ex As Exception End Try End Sub End Class > 32bitから64bitへのアクセスは無理ってことですね Express は、特に何もしなければ AnyCPU ビルドだと聞いていますので、 その環境では 64bit 版アプリとして動作しているかと思います。 なお、32bit アプリから 64bit プロセスにアクセスする場合には、 Very Large Memory 系 API (VirtualAllocVlm 等)が存在する らしいですが、試してみたことはありません。
■No32234に返信(/400さんの記事) > 直接フルパスが取れれば一番楽だったんですけど調べても「難しいです」しか > 情報が無いという…(笑 パスを列挙するだけなら: Imports System.Runtime.InteropServices Public Class Form1 Private tbl As DataTable Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click tbl = New DataTable() tbl.Columns.Add("Name") tbl.Columns.Add("Path") tbl.Columns.Add("Modified", GetType(Date)) tbl.Columns.Add("Link", GetType(Boolean)) tbl.Columns.Add("Target") DataGridView1.DataSource = tbl Dim sh As SHDocVw.ShellWindows = GetObject("new:9BA05972-F6A8-11CF-A442-00A0C90A8F39") Dim o As Object = sh.Item(Type.Missing) Dim sfvd As Shell32.IShellFolderViewDual = o.Document Dim sd As Shell32.Shell = sfvd.Application Dim f As Shell32.Folder3 = sfvd.Folder Dim fis As Shell32.FolderItems3 = f.Items() For i As Integer = 0 To fis.Count - 1 Dim fi As Shell32.FolderItem2 = fis.Item(CObj(i)) Dim row As DataRow = tbl.NewRow() row!Name = fi.Name row!Path = fi.Path If fi.IsLink Then row!Link = True Dim lnk As Shell32.ShellLinkObject = Nothing Try lnk = fi.GetLink row!Target = lnk.Path Catch ex As Exception row.RowError = ex.Message Finally If Not lnk Is Nothing Then Marshal.ReleaseComObject(lnk) End If lnk = Nothing End Try Else row!Link = False row!Target = DBNull.Value End If row!Modified = fi.ModifyDate tbl.Rows.Add(row) Marshal.ReleaseComObject(fi) Next Marshal.ReleaseComObject(fis) Marshal.ReleaseComObject(f) Marshal.ReleaseComObject(sd) Marshal.ReleaseComObject(sfvd) Marshal.ReleaseComObject(o) Marshal.ReleaseComObject(sh) End Sub End Class SHDocVw や Shell32 を参照設定しない場合は、 As SHDocVw.何某 や As Shell32.何某 を As Object に置き換えてみてください。
分類:[.NET]