あなたはGUICtrlMonthCal *関数を使用することができない理由があります。 .NETにはそれらがありますが、この場合は代わりにDateTimePickerです。
DateTimePickersはドロップダウンメニューにMonthCalenderを持っていますが、ドロップダウンをクリックすると作成され、直接コントロールするのが難しいようです。最も興味深い
<00001> 00090572 S WM_GETTEXTLENGTH
<00002> 00090572 R WM_GETTEXTLENGTH cch:12
<00003> 00090572 S WM_GETTEXT cchTextMax:26 lpszText:05E8D51C
<00004> 00090572 R WM_GETTEXT cchCopied:12 lpszText:05E8D51C ("0")
<00005> 00090572 S message:0x1002 [User-defined:WM_USER+3074] wParam:00000000 lParam:01F6A2A8
<00006> 00090572 R message:0x1002 [User-defined:WM_USER+3074] lResult:00000001
<00007> 00090572 S WM_GETTEXTLENGTH
<00008> 00090572 R WM_GETTEXTLENGTH cch:12
<00009> 00090572 S WM_GETTEXT cchTextMax:26 lpszText:05E8D51C
<00010> 00090572 R WM_GETTEXT cchCopied:12 lpszText:05E8D51C ("0")
<00011> 00090572 P WM_PAINT hdc:00000000
<00012> 00090572 S WM_ERASEBKGND hdc:54010EE3
<00013> 00090572 R WM_ERASEBKGND fErased:True
たユーザー定義のメッセージがある:代わりに、私はこれらは私が見つけたメッセージだった...プログラムは、小さなテストケースを設定して値を設定したときに何が起こるかを見ていましたコントロールが、通常、それらがユニークであるメッセージを取得する方法です。私が0x1002がデータを設定することが正しいと仮定するならば、まだ実行される唯一のことはlParamの意味を理解することです。この値をDateTimeオブジェクトとして設定すると、これは扱いにくいことがあります。
次は、ildasmをチェックして、System.Windows.Forms.DateTimePicker :: set_Valueを調べると、.NETの処理方法について多くのことが分かると思います。より多くの研究とこの記事を更新してください。
パート2:set_Valueの逆アセンブリは、私が言ったことを行います... DateTimeToSysTimeを使って "System"時間と呼ばれるものにDateTimeを変換します...公に見えませんが、それはILDasmで何をしているのですか?しかし、標準のWinAPI SYSTEMTIME構造体hereを使用していると仮定するのは簡単です。これは読書の公正なビットですが、あなたはそれらの構造体の1つを記入する必要があります。
我々は、我々が望むメッセージ内のlParamは、SYSTEMTIME構造体へのポインタであることを、かなり安全な仮定を作る...私はそれをテストしてポストを更新しますすることができます:)
パート3:今すぐエキサイティングな部分のために...それは実際に動作するようになる。最初の問題は、SendMessageを使用してアプリケーション間でポインタを移動できないため、他のプログラムでバッファを作成するために余分なコードが必要になることです。それ以外は、それは私が期待される正確のように働いた:
#Include <GuiMonthCal.au3> ; $tagSYSTEMTIME is defined in here.
Local $tSI = DllStructCreate($tagSYSTEMTIME)
Local $hControl = ControlGetHandle("Date/Time Picker", "", "[NAME:ExampleDateTimePicker]")
If @error Then Exit 0 * MsgBox(16, "Error", "Demo control not found.")
; Fill the structure to current date/time using GetLocalTime
DllCall("kernel32.dll", "none", "GetLocalTime", "ptr", DllStructGetPtr($tSI))
If @error Then Exit 0 * MsgBox(16, "Error", "GetLocalTime failed.")
; Change the year
DllStructSetData($tSI, "Year", 2005)
; The struct needs to be in the process memory, so it's a bit of a workaround.
Local $tMemMap
Local $pMemory = _MemInit($hControl, DllStructGetSize($tSI), $tMemMap)
_MemWrite($tMemMap, DllStructGetPtr($tSI))
$iRet = _SendMessage($hControl, 0x1002, 0, $pMemory, 0, "wparam", "ptr")
_MemFree($tMemMap)
日付部分は2005年に変更すべきことを実行すると、唯一の問題は、任意のハンドラがありますので、もしそれが、OnValueChangedイベントをトリガしないということですあなたが自動化しようとしているプログラムのそれをコードしていると、ユーザが値を変更した場合とまったく同じように動作しない可能性があります。