我正在尝试向标准的MonthCalendar发送MCM_GETSELRANGE windows消息。根据文档,我尝试了以下操作,但没有成功(日期返回为nothing,因为在中它们没有设置为除零以外的任何值,但是我确实得到了一个非零的返回值,这似乎表明它成功了?):
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似乎没有任何建议。
谢谢
发布于 2011-05-03 07:16:42
显然,您正在将其发送到属于另一个进程的窗口。这不能这样工作,SYSTEMTIME数组只在您的进程中有效,而不是在另一个进程中有效。这使得代码变得相当复杂,你必须在目标进程中分配内存。
我将简要描述所需的pinvoke,从api函数名中搜索示例代码应该没有问题。首先,您需要GetWindowThreadProcessId()来获取拥有该窗口的进程的ID。OpenProcess()打开它的句柄。VirtualAllocEx()来分配内存。
SendMessage()像以前一样发送消息,传递从VirtualAllocEx()获得的指针。ReadProcessMemory()从进程中读出数组内容。使用VirtualFreeEx()和CloseHandle()进行清理。顺便说一句,你不太可能会遇到安全问题,这些都是特权函数。
https://stackoverflow.com/questions/5863393
复制相似问题