选择AutomationElement(SysListView32项)

时间:2013-06-01 22:28:35

标签: c# automation syslistview32

我想选择外部进程的SysListView32项。到目前为止,这是我的代码,它正在工作(我可以获取项目的文本和索引),但是如何选择当前项?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Automation;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Place your cursor over listview and hit enter...");
            Console.ReadLine();
            POINT pt;
            GetCursorPos(out pt);
            IntPtr hwnd = WindowFromPoint(pt);
            AutomationElement el = AutomationElement.FromHandle(hwnd);
            TreeWalker walker = TreeWalker.ContentViewWalker;
            int i = 0;
            for (AutomationElement child = walker.GetFirstChild(el);
                child != null;
                child = walker.GetNextSibling(child))
            {
                MessageBox.Show("Item:" + child.Current.Name);
                //! Select The Item Here ...
            }
        }
        [StructLayout(LayoutKind.Sequential)]
        private struct POINT
        {
            public int x;
            public int y;
        };

        [DllImport("user32.dll")]
        private static extern IntPtr WindowFromPoint(POINT pt);

        [DllImport("user32.dll")]
        private static extern int GetCursorPos(out POINT pt);
    }
}

1 个答案:

答案 0 :(得分:0)

您必须调用SendMessage Win API函数并指定LVM_SETITEMSTATE作为您的消息。传递列表视图的窗口句柄和lParam的{​​{3}}结构。

您只需在LVITEM结构

中设置以下字段
lvi.state = LVIS_FOCUSED | LVIS_SELECTED;
lvi.stateMask = LVIS_FOCUSED | LVIS_SELECTED;
lvi.iItem = 5 // Index of item to select

检查MSDN以获取状态值。