1

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 には、これをどのように呼び出すべきかについての提案はないようです。

ありがとうございました

4

1 に答える 1

2

明らかに、これを別のプロセスに属するウィンドウに送信しています。このようには機能しません.SYSTEMTIME配列はあなたのプロセスでのみ有効であり、他のプロセスでは有効ではありません. これにより、コードがかなり複雑になり、ターゲット プロセスにメモリを割り当てる必要があります。

必要な pinvoke について簡単に説明します。API 関数名からサンプル コードを簡単に検索できます。まず、ウィンドウを所有するプロセスの ID を取得するために GetWindowThreadProcessId() が必要です。OpenProcess() を使用してハンドルを開きます。VirtualAllocEx() を使用してメモリを割り当てます。

SendMessage() で以前と同じようにメッセージを送信し、VirtualAllocEx() から取得したポインターを渡します。ReadProcessMemory() を使用して、配列の内容をプロセスから読み取ります。VirtualFreeEx() と CloseHandle() でクリーンアップします。セキュリティの問題と戦うことはまずありませんが、これらは特権機能です。

于 2011-05-02T23:16:42.217 に答える