2011-07-05 17 views
0

私はAutoItを使用して、サードパーティの.NETアプリケーションでフォームの自動入力を試みています。AutoIT:サードパーティの.NETアプリケーションでカレンダーの日付選択を自動化

カレンダーコントロールで日付を設定するときに問題が発生しています。

現在入力しようとしているコントロールは、AutoIt3 Window Infoに従って、クラスタイプWindowsForms10.SysDateTimePick32.app.0.378734aです。最初は、コントロールのテキストを希望の日付に設定しようとしましたが、何もしませんでした。

次に、私が使用しようとしている他のすべての機能と同様に、_GUICtrlMonthCal_SetCurSelを試しましたが、これは何もしませんでした(正しいヘッダが含まれていました。それを走らせた)。

誰も私がこれをやっていく方法を知っていますか?あなたは月/カレンダーコントロールを扱っていないので、

おかげで、 のRik

答えて

1

あなたは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イベントをトリガしないということですあなたが自動化しようとしているプログラムのそれをコードしていると、ユーザが値を変更した場合とまったく同じように動作しない可能性があります。

関連する問題