public void TestEmulateExpandEvent()
        {
            NativeTree tree = new NativeTree(testDlg.IdentifyFromDialogId(1041));

            //経験から発見されたTreeの性質として、一度開いた後はExpnadメッセージで後の通知が発生しない。
            //そのため、別途通知を投げている。その確認。
            Assert.IsTrue(EventChecker.IsSameTestEvent(testDlg,
                delegate { tree.EmulateExpand(tree.Nodes[1], true); },
                new CodeInfo[] { new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_SELCHANGING),
                                 new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_SELCHANGED),
                                 new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMCHANGING),
                                 new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMCHANGED)},
                    new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMEXPANDING),
                    new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMEXPANDED)
                ));
            Assert.IsTrue(EventChecker.IsSameTestEvent(testDlg,
                delegate { tree.EmulateExpand(tree.Nodes[1], false); },
                new CodeInfo[] { new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_SELCHANGING),
                                 new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_SELCHANGED),
                                 new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMCHANGING),
                                 new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMCHANGED)},
                    new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMEXPANDING),
                    new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMEXPANDED)
                ));
            Assert.IsTrue(EventChecker.IsSameTestEvent(testDlg,
                delegate { tree.EmulateExpand(tree.Nodes[1], true); },
                new CodeInfo[] { new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_SELCHANGING),
                                 new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_SELCHANGED),
                                 new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMCHANGING),
                                 new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMCHANGED)},
                    new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMEXPANDING),
                    new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMEXPANDED)
                ));

            //詳細な通知内容の確認。
            NMTREEVIEW[] expectation = new NMTREEVIEW[2];
            expectation[0].action = expectation[1].action = 1;
            expectation[0].itemNew.cChildren = expectation[1].itemNew.cChildren = 0;
            expectation[0].itemNew.cchTextMax = expectation[1].itemNew.cchTextMax = 0;
            expectation[0].itemNew.hItem = expectation[1].itemNew.hItem = tree.Nodes[1];
            expectation[0].itemNew.iImage = expectation[1].itemNew.iImage = 3;
            expectation[0].itemNew.iSelectedImage = expectation[1].itemNew.iSelectedImage = 4;
            expectation[0].itemNew.lParam = expectation[1].itemNew.lParam = new IntPtr(101);
            expectation[0].itemNew.mask = expectation[1].itemNew.mask = (int)(TVIF.IMAGE | TVIF.PARAM | TVIF.STATE | TVIF.HANDLE | TVIF.SELECTEDIMAGE);
            expectation[0].itemNew.pszText = expectation[1].itemNew.pszText = IntPtr.Zero;
            expectation[0].itemNew.state = 0x1060;
            expectation[1].itemNew.state = 0x1040;
            expectation[0].itemNew.stateMask = expectation[1].itemNew.stateMask = 0xffff;
            Assert.IsTrue(EventChecker.CheckNotifyDetail(testDlg,
                delegate { tree.EmulateExpand(tree.Nodes[1], false); },
                expectation));
            
        }
        /// <summary>
        /// 展開通知
        /// </summary>
        /// <param name="isBefore">展開前通知であるか。</param>
        /// <param name="wndHandle">ウィンドウハンドル。</param>
        /// <param name="hItem">アイテムハンドル。</param>
        /// <param name="action">動作。</param>
        private static void NotifyExpandInTarget(bool isBefore, IntPtr wndHandle, IntPtr hItem, int action)
        {
            bool isUni = NativeMethods.IsWindowUnicode(wndHandle);
            int code = 0;
            if (isBefore)
            {
                code = isUni ? TVN_ITEMEXPANDINGW : TVN_ITEMEXPANDINGA;
            }
            else
            {
                code = isUni ? TVN_ITEMEXPANDEDW : TVN_ITEMEXPANDEDA;
            }

            //情報取得
            TVITEMEX_CORE item = new TVITEMEX_CORE();
            item.hItem = hItem;
            item.mask = (int)(TVIF.IMAGE | TVIF.PARAM | TVIF.STATE | TVIF.HANDLE | TVIF.SELECTEDIMAGE);
            item.stateMask = 0xffff;
            NativeMethods.SendMessage(wndHandle, (isUni ? TVM_GETITEMW : TVM_GETITEMA), IntPtr.Zero, ref item);

            //通知
            NMTREEVIEW notify = new NMTREEVIEW();
            EmulateUtility.InitNotify(wndHandle, code, ref notify.hdr);
            notify.action = action;
            item.GetTVITEMEX(ref notify.itemNew);
            NativeMethods.SendMessage(NativeMethods.GetParent(wndHandle), NativeCommonDefine.WM_NOTIFY, notify.hdr.idFrom, ref notify);
        }