0

我正在开发一个软件来从外部桌面应用程序中提取一些信息,问题是我正在使用 C# 在 Windows 7 中工作,并且我有一个使用这里的东西的可行应用程序:

如何在 c# 中使用 user32.dll 从类“ThunderRT6ListBox”的窗口中检索值

但是当我在 Windows 8 中针对相同的外部应用程序测试相同的软件时,问题就出现了,它的工作方式不同。

我可以复制控件的处理程序 ID,但是当我使用 SendMessage 函数时,例如,将新文本放入编辑控件(文本框)时,什么也没有发生。

    public static void SetText(IntPtr HWnd, string strTextToSet)
    {
        var text = new StringBuilder(strTextToSet);
        SendMessage(HWnd, WM_SETTEXT, IntPtr.Zero, text);
    }

Windows 8 在使用这些东西时是否有任何考虑?

更新:

它仍然不起作用。GetText 有效,但 SetText 无效。

我的代码:

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]        
    static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

    const uint WM_SETTEXT = 0x000C;

    public static string GetText(IntPtr hwnd)
    {
        var text = new StringBuilder(1024);
        if (SendMessageTimeoutText(hwnd, 0xd, 1024, text, 0x2, 1000, 0) != 0)
        {
            return text.ToString();
        }

        return "";
    }

    public static void SetText(IntPtr HWnd, string strTextToSet)
    {
        //var text = new StringBuilder(strTextToSet);
        IntPtr text = System.Runtime.InteropServices.Marshal.StringToCoTaskMemUni(strTextToSet);
        SendMessage(HWnd, WM_SETTEXT, IntPtr.Zero, text);
    }

更新 2:

错误代码:

    ModApi.SetText(hwEdit, "foo_namE");

    //The textbox does not change

    int error_code = Marshal.GetLastWin32Error();

    //error_code is 5
4

2 回答 2

1

解决方案是关于 UAC(用户访问控制),我需要在管理模式下启动 Visual Studio(或构建时的可执行文件)。

于 2013-09-20T13:11:24.593 回答
0

根据这个(SendMessage WM_SETTEXT to TextBox 不会触发 TextChanged Event)关于 SO 的其他问题,以下适用于我的系统在 Windows 8 表单应用程序中:

//Declarations
        [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
        static extern IntPtr SendMessage(IntPtr hWnd, uint Msg,
            IntPtr wParam, IntPtr lParam);

        private const uint WM_SETTEXT = 0x000C;


//SetText function
        public static void SetText(IntPtr HWnd, string strTextToSet)
        {
            IntPtr text = System.Runtime.InteropServices.Marshal.StringToCoTaskMemUni(strTextToSet);
            SendMessage(HWnd, WM_SETTEXT, IntPtr.Zero, text);
            System.Runtime.InteropServices.Marshal.FreeCoTaskMem(text);

        }
于 2013-09-19T15:39:55.640 回答