C#-WINAPI CB#U SETCURSEL未按预期工作

C#-WINAPI CB#U SETCURSEL未按预期工作,c#,winapi,combobox,C#,Winapi,Combobox,因此,我试图以编程方式更新另一个应用程序中的组合框。我正在更新的应用程序有一个组合框、一些文本框和一些复选框根据组合框中选择的项目,某些复选框将启用或禁用。我遇到的问题是,尽管我可以更改组合框中的当前项,但gui似乎没有相应地更新复选框 这是我的密码 [DllImport("User32.dll")] public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam); [DllImpor

因此,我试图以编程方式更新另一个应用程序中的组合框。我正在更新的应用程序有一个组合框、一些文本框和一些复选框根据组合框中选择的项目,某些复选框将启用或禁用。我遇到的问题是,尽管我可以更改组合框中的当前项,但gui似乎没有相应地更新复选框

这是我的密码

[DllImport("User32.dll")]
public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);

[DllImport("user32.dll")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);


const int CB_SETCURSEL = 0x014E;

static void Main(string[] args)
{

       var startinfo = new ProcessStartInfo("path");

        // Get an object that contains all the process resources
        Process rtugen = Process.Start(startinfo);

        // wait until the process has a main window handle
        while (rtugen.MainWindowHandle == IntPtr.Zero)
        {
            rtugen.Refresh();
        }


        IntPtr hWnd = rtugen.MainWindowHandle;

        IntPtr controllerType = FindWindowEx(hWnd, IntPtr.Zero, "ComboBox", null);

        SendMessage(controllerType, CB_SETCURSEL, 12, "");

        int send_cbn_selchange = MakeWParam((int)controllerType, CBN_SELCHANGE);
        int i = SendMessage(hWnd, 0x111, send_cbn_selchange,0);

}

    static int MakeWParam(int loWord, int hiWord)
    {
        return (loWord & 0xFFFF) + ((hiWord & 0xFFFF) << 16);
    }
[DllImport(“User32.dll”)]
公共静态外部int SendMessage(IntPtr hWnd、int uMsg、int wParam、字符串lParam);
[DllImport(“user32.dll”)]
公共静态外部IntPtr FindWindowEx(IntPtr hwndParent、IntPtr hwndChildAfter、string lpszClass、string lpszWindow);
常数int CB_SETCURSEL=0x014E;
静态void Main(字符串[]参数)
{
var startinfo=新流程startinfo(“路径”);
//获取包含所有进程资源的对象
过程rtugen=过程启动(startinfo);
//等待进程具有主窗口句柄
while(rtugen.MainWindowHandle==IntPtr.Zero)
{
rtugen.Refresh();
}
IntPtr hWnd=rtugen.MainWindowHandle;
IntPtr controllerType=FindWindowEx(hWnd,IntPtr.Zero,“组合框”,null);
SendMessage(controllerType,CB_SETCURSEL,12,“”);
int send_cbn_selchange=MakeWParam((int)controllerType,cbn_selchange);
int i=SendMessage(hWnd,0x111,send\u cbn\u selchange,0);
}
静态int MakeWParam(int loWord,int hiWord)
{

return(loWord&0xFFFF)+((hiWord&0xFFFF)最终我在线找到了这个解决方案来更改组合框的值,这样应用程序就可以识别更改。一旦你有了组合框的句柄,你就可以使用WM_KEYDOWN消息来模拟按键操作

 [DllImport("User32.dll")]
public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);

[DllImport("user32.dll")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);


const int CB_SETCURSEL = 0x014E;
const int VK_DOWN = 0x28;
const int WM_KEYDOWN = 0x0100;
static void Main(string[] args)
{

       var startinfo = new ProcessStartInfo("path");

        // Get an object that contains all the process resources
        Process rtugen = Process.Start(startinfo);

        // wait until the process has a main window handle
        while (rtugen.MainWindowHandle == IntPtr.Zero)
        {
            rtugen.Refresh();
        }


        IntPtr hWnd = rtugen.MainWindowHandle;

        IntPtr controllerType = FindWindowEx(hWnd, IntPtr.Zero, "ComboBox", null);

        SendMessage(controllerType, CB_SETCURSEL, 0, "");
        for (int i = 0; i < Index; i++)
            SendMessage(controllerType, WM_KEYDOWN, VK_DOWN, 0);

    }
[DllImport(“User32.dll”)]
公共静态外部int SendMessage(IntPtr hWnd、int uMsg、int wParam、字符串lParam);
[DllImport(“user32.dll”)]
公共静态外部IntPtr FindWindowEx(IntPtr hwndParent、IntPtr hwndChildAfter、string lpszClass、string lpszWindow);
常数int CB_SETCURSEL=0x014E;
常数int VK_DOWN=0x28;
常量int WM_KEYDOWN=0x0100;
静态void Main(字符串[]参数)
{
var startinfo=新流程startinfo(“路径”);
//获取包含所有进程资源的对象
过程rtugen=过程启动(startinfo);
//等待进程具有主窗口句柄
while(rtugen.MainWindowHandle==IntPtr.Zero)
{
rtugen.Refresh();
}
IntPtr hWnd=rtugen.MainWindowHandle;
IntPtr controllerType=FindWindowEx(hWnd,IntPtr.Zero,“组合框”,null);
SendMessage(controllerType,CB_SETCURSEL,0,“”);
对于(int i=0;i UIAuto不会使这更容易/更少。父窗口需要一个CBNSL更改通知,这就是它用来识别更改的原因。Yea,我会考虑查看UIAuto.我还编辑了代码,以显示我发送父窗口的CBNSelSechange通知,这仍然不起作用。你能提供一些代码以正确的方式发送CBN_SELCHANGE通知吗?正确的方式是使用UI自动化这种黑客在网上无处不在,但不是如何做到。使用UI自动化。你知道有什么好的来源可以了解UI自动化吗?你从哪里学到的?从一些网站开始我从来没有使用过UI Automation,但基于MSDN,它说:“UI自动化是为有经验的C/C++开发人员设计的。一般来说,开发人员需要对组件对象模型(COM)对象和接口、Unicode和Windows API编程有一定程度的了解。”我正在处理的应用程序没有实现COM。举个例子就好了?正如我提到的,我不熟悉UI自动化,但从我所读到的内容来看,它要求我正在自动化的应用程序实现IUIAutomation接口(对我来说不是这样,我也不能对此应用程序进行代码更改),除非您听说或自己编写了一个作为UI自动化提供商的应用程序。