首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >向MonthCalendar发送MCM_GETSELRANGE消息的P/Invoke签名是什么?

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

Stack Overflow用户
提问于 2011-05-03 07:00:56
回答 1查看 325关注 0票数 1

我正在尝试向标准的MonthCalendar发送MCM_GETSELRANGE windows消息。根据文档,我尝试了以下操作,但没有成功(日期返回为nothing,因为在中它们没有设置为除零以外的任何值,但是我确实得到了一个非零的返回值,这似乎表明它成功了?):

代码语言:javascript
运行
复制
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似乎没有任何建议。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-03 07:16:42

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

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

SendMessage()像以前一样发送消息,传递从VirtualAllocEx()获得的指针。ReadProcessMemory()从进程中读出数组内容。使用VirtualFreeEx()和CloseHandle()进行清理。顺便说一句,你不太可能会遇到安全问题,这些都是特权函数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5863393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档