代码之家  ›  专栏  ›  技术社区  ›  dev1998

Windows窗体,SendMessage行中的语法错误

  •  0
  • dev1998  · 技术社区  · 5 年前

    我正在使用Windows窗体,并尝试使用SendMessage获取组合框下拉矩形。然而,我似乎找不到允许代码编译的正确参数组合。

    以下是一些未编译的行的示例:

    var z1 = SendMessage(hWnd, CB_GETDROPPEDCONTROLRECT, (IntPtr)1, (IntPtr)0);  // The best overloaded match has some invalid arguments.
    
    var z2 = SendMessage(hWnd, 0x0152, (IntPtr)1, (IntPtr)0); 
    
    var z3 = SendMessage(hWnd, CB_GETDROPPEDCONTROLRECT, 1, 0); 
    
    var z4 = SendMessage(hWnd, 0x0152, 1, 0);
    

    提前感谢任何有任何想法使这项工作的人。

    public partial class Form1 : Form
    {
        [DllImport("user32.dll")]
        public static extern int SendMessage(
              int hWnd,      // handle to destination window
              uint Msg,       // message
              long wParam,  // first message parameter
              long lParam   // second message parameter
              );
    
        public Form1()
        {
            InitializeComponent();
            List<string> itms = new List<string>();
            itms.Add("Choice 1");
            itms.Add("Choice 2");
            itms.Add("Choice 3");
            itms.Add("Choice 4");
            itms.Add("Choice 5");
    
            this.comboBox1.Items.AddRange(itms.ToArray());
        }
    
        private void comboBox1_DropDown(object sender, EventArgs e)
        {
            const int CB_GETDROPPEDCONTROLRECT = 0x0152;
            IntPtr hWnd = comboBox1.Handle;
    
            var z = SendMessage(hWnd, CB_GETDROPPEDCONTROLRECT, (IntPtr)1, (IntPtr)0);  // The best overloaded match has some invalid arguments.
    
            var z1 = SendMessage(hWnd, 0x0152, (IntPtr)1, (IntPtr)0); 
        }
    }
    
    0 回复  |  直到 5 年前
        1
  •  2
  •   René Vogt    5 年前

    要获取组合框的下拉矩形,可以执行以下操作:

    首先,声明 RECT

    [StructLayout(LayoutKind.Sequential)]
    public struct RECT
    {
        public int Left;
        public int Top;
        public int Right;
        public int Bottom;
    }
    

    long ,但我测试了它,出于某种奇怪的原因 SendMessage 答案为 int

    第二,正确的 发送消息 声明:对于这种特殊情况,您现在可以使用 ref RECT 参数请注意,在您的版本中存在错误: hWnd 需要成为 IntPtr wParam 只是 整数 而不是

    [DllImport("user32.dll")]
    public static extern int SendMessage(
        IntPtr hWnd,    // handle to destination window (combobox in this case)
        int Msg,    // message
        int wParam, // first message parameter
        ref RECT lParam  // second message parameter
    );
    

    第三,用法:

    RECT rect = default;
    int result = SendMessage(comboBox1.Handle, 0x0152, 1, ref rect);
    

    comboBox1 当然是你的组合框。如果 result rect