Принятый ответ в основном правильный, однако вы также должны использовать:
PostMessage(dateTimePicker1.Handle, WM_LBUTTONUP, 1,lParam);
После публикации события WM_LBUTTONDOWN
.
Также, очевидно, WM_LBUTTONUP
должно быть предварительно определено:
const Int32 WM_LBUTTONUP = 0x0202;
Итак, мой ответ:
using System.Runtime.InteropServices;
//declares
[DllImport("user32.dll")]
private static extern bool PostMessage(
IntPtr hWnd, // handle to destination window
Int32 msg, // message
Int32 wParam, // first message parameter
Int32 lParam // second message parameter
);
const Int32 WM_LBUTTONDOWN = 0x0201;
const Int32 WM_LBUTTONUP = 0x0202;
//method to call dropdown
private void button1_Click(object sender, EventArgs e)
{
Int32 x = dateTimePicker1.Width - 10;
Int32 y = dateTimePicker1.Height / 2;
Int32 lParam = x + y * 0x00010000;
PostMessage(dateTimePicker1.Handle, WM_LBUTTONDOWN, 1,lParam);
PostMessage(dateTimePicker1.Handle, WM_LBUTTONUP, 1,lParam);
}
Это позволяет избежать ошибки Марка Лакаты в Windows 7 и / или .NET 3.5.
Причина проста: оригинальный код имитирует событие нажатия кнопки мыши, но не поднимает кнопку мыши снова, как при нажатии кнопки.
В этом отношении вы можете попробовать сами: если вы нажмете левую кнопку мыши, чтобы открыть DateTimePicker
и не отпустите кнопку, вы также не сможете использовать элемент управления.
Редактировать: Адаптировать ответ jp2code:
using System.Runtime.InteropServices;
public static class Extensions {
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int PostMessage(IntPtr hwnd, Int32 wMsg, Int32 wParam, Int32 lParam);
public static void Open(this DateTimePicker obj) {
const int WM_LBUTTONDOWN = 0x0201;
const int WM_LBUTTONUP = 0x0202;
int width = obj.Width - 10;
int height = obj.Height / 2;
int lParam = width + height * 0x00010000; // VooDoo to shift height
PostMessage(obj.Handle, WM_LBUTTONDOWN, 1, lParam);
PostMessage(obj.Handle, WM_LBUTTONUP, 1, lParam);
}
}