什么是将MCM_GETSELRANGE消息发送到MonthCalendar的P / Invoke签名?

时间:2011-05-02 23:00:56

标签: c# winapi pinvoke comctl32

我正在尝试将MCM_GETSELRANGE Windows消息发送到标准的MonthCalendar。基于文档我尝试了以下没有运气(日期回来没有[因为他们没有设置为零以外的任何东西],但是我得到一个非零的返回值,这似乎表明它成功了?):

using System;
using System.Runtime.InteropServices;

namespace GetSelRange
{
    class Program
    {
        static void Main(string[] args)
        {
            IntPtr targetWindowHandle = new IntPtr(68684130);
            SYSTEMTIME[] dateRange = new SYSTEMTIME[2];
            IntPtr success = SendMessage(targetWindowHandle, MCM_GETSELRANGE, IntPtr.Zero, dateRange);
        }

        #region Win32API

        const uint MCM_FIRST = 0x1000;
        const uint MCM_GETSELRANGE = MCM_FIRST + 5;

        [StructLayout(LayoutKind.Sequential)]
        private struct SYSTEMTIME
        {
            [MarshalAs(UnmanagedType.U2)]
            public ushort Year;
            [MarshalAs(UnmanagedType.U2)]
            public ushort Month;
            [MarshalAs(UnmanagedType.U2)]
            public ushort DayOfWeek;
            [MarshalAs(UnmanagedType.U2)]
            public ushort Day;
            [MarshalAs(UnmanagedType.U2)]
            public ushort Hour;
            [MarshalAs(UnmanagedType.U2)]
            public ushort Minute;
            [MarshalAs(UnmanagedType.U2)]
            public ushort Second;
            [MarshalAs(UnmanagedType.U2)]
            public ushort Milliseconds;
        }

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, SYSTEMTIME[] lParam);

        #endregion
    }
}

pinvoke.net似乎没有任何关于如何调用它的建议。

谢谢

1 个答案:

答案 0 :(得分:2)

显然,您将此信息发送到属于另一个进程的窗口。这不能像这样工作,SYSTEMTIME数组仅在您的进程中有效,而不是在另一个进程中有效。这使代码变得相当复杂,您必须在目标进程中分配内存。

我将简要描述所需的pinvoke,你可以毫不费力地从api函数名称中搜索示例代码。首先,您需要GetWindowThreadProcessId()来获取拥有该窗口的进程的ID。 OpenProcess()打开它的句柄。 VirtualAllocEx()分配内存。

SendMessage()以像以前一样发送消息,传递从VirtualAllocEx()获得的指针。 ReadProcessMemory()从进程中读取数组内容。使用VirtualFreeEx()和CloseHandle()进行清理。你是不是不太可能与btw的安全问题作斗争,这些都是特权功能。