Windows Forms, синтаксическая ошибка в строке SendMessage - PullRequest
1 голос
/ 15 марта 2019

Я использую Windows Forms и пытаюсь использовать SendMessage, чтобы получить выпадающий прямоугольник ComboBox.Однако я не могу найти правильную комбинацию параметров, которая позволит скомпилировать код.

Я пробовал копировать найденные примеры, но ничего не компилируется.

Вот несколько примеровиз строк, которые не компилируются:

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); 
    }
}

1 Ответ

2 голосов
/ 15 марта 2019

Чтобы получить выпадающий прямоугольник выпадающего списка, вы можете сделать это:

Сначала объявите структуру RECT:

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

Примечание: документация Microsoft гласит, что эти поля должны быть long, но я проверил это и по какой-то странной причине SendMessage отвечает с int здесь.

Во-вторых, правильное объявление SendMessage: для этого особого случая теперь вы можете использовать параметр ref RECT. Обратите внимание, что в ваших версиях есть ошибки: hWnd должен быть IntPtr, тогда как wParam только int, а не long:

[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, конечно, ваш ComboBox. Если result равно нулю, вызов не состоялся, в противном случае он был бы успешным и rect должен содержать требуемые значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...