2011-05-02 2 views
1

MCM_GETSELRANGE windows 메시지를 표준 MonthCalendar로 보내려고합니다. 문서를 기반으로 나는 행운과 함께 다음을 시도했다. (날짜는 아무것도 아니지만 [0 이외의 값으로 설정되지 않았으므로] 성공했다는 것을 나타내는 0이 아닌 반환 값을 얻는다. ?) :MonthCalendar에 MCM_GETSELRANGE 메시지를 보내려면 P/Invoke 서명이란 무엇입니까?

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이 어떻게 호출되어야하는지에 대한 제안이없는 것으로 보입니다.

고맙습니다.

답변

2

분명히이 프로세스를 다른 프로세스에 속한 창으로 보냅니다. 이처럼 작동 할 수없는 SYSTEMTIME 배열은 다른 프로세스가 아닌 사용자 프로세스에서만 유효합니다. 이것은 코드를 상당히 복잡하게 만들며 대상 프로세스에 메모리를 할당해야합니다.

pinvoke를 간단히 설명하겠다. api 함수 이름에서 샘플 코드를 검색하는 데 문제가 없어야한다. 먼저 GetWindowThreadProcessId()가 있어야 윈도우를 소유하고있는 프로세스의 ID를 얻을 수 있습니다. OpenProcess() 핸들을 열려면. VirtualAllocEx()는 메모리를 할당합니다.

VirtualAllocEx()에서 가져온 포인터를 전달하기 위해 이전처럼 메시지를 보내려면 SendMessage(). ReadProcessMemory() : 배열 내용을 프로세스 밖으로 읽습니다. VirtualFreeEx() 및 CloseHandle()을 사용하여 정리하십시오. 당신이 보안 문제와 싸우지 않을 것 같지 않은데, 이것은 특권을 가진 기능입니다.

+0

+1 또한 비트 경계를 넘을 때주의하십시오. 한 프로세스가 32 비트이고 다른 프로세스가 64 비트 일 때이 접근법을 사용할 수 있는지 확실하지 않습니다. 가능하다해도 약간의 기술이 필요할 것입니다. –

+0

한스 감사합니다! 우리는 우리의 프로세스에 속하지 않은 Window (우리는 자동화 프레임 워크에서 작업 중입니다)에 대해이 작업을 수행하고있는 것이 맞습니다. 우리는 실제로 표준 ListView 및 TreeView 컨트롤과 상호 작용할 때 매우 유사한 작업을 수행해야하므로 이러한 컨트롤을 모방 할 수 있습니다. 제쳐두고 월렛 달력이 존재하는 과정에서만 이것이 유효하다는 것을 어떻게 결정할 수 있었습니까? 아니면 개인적인 경험에서 나온 것입니까? 나중에 다른 컨트롤에 대한 참조를 요청합니다. – aolszowka

+0

포인터 전달이 필요한 * 모든 메시지의 경우입니다. LV 및 TV 메시지의 대부분은 않습니다. AutoIt을보십시오. –

관련 문제