C# 功能“;SendMessage";User32.dll的错误在Windows 8中不起作用

C# 功能“;SendMessage";User32.dll的错误在Windows 8中不起作用,c#,windows,pinvoke,C#,Windows,Pinvoke,我正在开发一个软件,从外部桌面应用程序中提取一些信息,问题是我正在使用C#在Windows 7中工作,我有一个可行的应用程序,它使用了以下内容: 但问题是,当我在Windows8中对同一个外部应用程序测试同一个软件时,它的工作方式不同 我可以复制控件的处理程序id,但当我使用SendMessage函数(例如)将新文本放入编辑控件(textbox)时,什么也没有发生 public static void SetText(IntPtr HWnd, string strTextToSet)

我正在开发一个软件,从外部桌面应用程序中提取一些信息,问题是我正在使用C#在Windows 7中工作,我有一个可行的应用程序,它使用了以下内容:

但问题是,当我在Windows8中对同一个外部应用程序测试同一个软件时,它的工作方式不同

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

    public static void SetText(IntPtr HWnd, string strTextToSet)
    {
        var text = new StringBuilder(strTextToSet);
        SendMessage(HWnd, WM_SETTEXT, IntPtr.Zero, text);
    }
Windows8在使用这些东西时有没有考虑到什么

更新:

但它仍然不起作用。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
根据此()其他问题,以下内容适用于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);

        }

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

在“什么都没发生”部分之后,
GetLastError
的结果是什么?这比我的回答更好;最好是找出问题所在,而不是像我在下面的回答中所做的那样,把它全部拆掉并放入一个新的解决方案。@Jcl您不能调用
GetLastError
。您必须在pinvoke中使用
SetLastError
,然后调用
Marshal.GetLastWin32Error
@videador如果您进行检查,您会看到:当消息被UIPI阻止时,使用GetLastError检索的最后一个错误被设置为5(拒绝访问)。意思是:权限有问题,可能是UAC的问题。。。尝试运行提升的进程(即:以管理员身份运行)目前,我已经用您的更改更新了代码(param lParam),但它仍然不起作用。您的意思是
CharSet.Auto
,因为您调用了
StringToCoTaskMemUni
David,我没有按照您的说明更改代码的位置?我正在声明属性中将字符集设置为Charset.Auto-我没有看到需要更改它的其他地方。谢谢为了清楚起见,您正在构建什么类型的应用程序?它是Windows窗体应用程序吗?如果是的话,您的目标平台是什么(x86、x64),为了好玩,您使用的是什么版本的Visual Studio?@JayTaplin输入了错误的内容。应该是CharSet.Unicode。很抱歉我还想请你解释一下为什么你的代码可以修复任何东西。只是因为其他应用程序运行的是Elevated,而且wm_如何才能让文本工作?这是不可信的,除非你发送到与wm_wettest target不同的进程。我不理解你的问题。对不起,我的平板电脑认为它的拼写可能比我更好。我的观点是,如果UAC阻止WM_SETTEXT,那么它也会阻止WM_GETTEXT。那么,这两条消息真的要发送到同一个窗口吗?