tangxu
2024-10-24 c7a67ab24f476b0f8593fc61362d3bb8b262aa3e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
 
namespace Microsoft.Win32
{
    /// <summary>
    /// User32扩展
    /// </summary>
    public static partial class Util
    {
        /// <summary>
        /// 开始更新,禁止控件重绘
        /// </summary>
        /// <param name="hWnd">控件句柄</param>
        public static void BeginUpdate(IntPtr hWnd)
        {
            UnsafeNativeMethods.SendMessage(hWnd, NativeMethods.WM_SETREDRAW, 0, 0);
        }
        /// <summary>
        /// 开始更新,允许控件重绘
        /// </summary>
        /// <param name="hWnd">控件句柄</param>
        public static void EndUpdate(IntPtr hWnd)
        {
            UnsafeNativeMethods.SendMessage(hWnd, NativeMethods.WM_SETREDRAW, 1, 0);
        }
 
        /// <summary>
        /// 开始拖动窗口
        /// </summary>
        /// <param name="hWnd">窗口句柄</param>
        public static void BeginDrag(IntPtr hWnd)
        {
            UnsafeNativeMethods.ReleaseCapture();
            UnsafeNativeMethods.SendMessage(hWnd, NativeMethods.WM_SYSCOMMAND, NativeMethods.SC_MOVE | NativeMethods.HTCAPTION, 0);
        }
 
        /// <summary>
        /// 在指定句柄窗口内按下鼠标,不等待消息处理完成立即返回
        /// </summary>
        /// <param name="hWnd">窗口句柄</param>
        /// <param name="pt">相对于窗口的点</param>
        public static void PostMouseDown(IntPtr hWnd, Point pt)
        {
            IntPtr lParam = Util.MAKELPARAM(pt.X, pt.Y);
            UnsafeNativeMethods.PostMessage(hWnd, NativeMethods.WM_MOUSEMOVE, IntPtr.Zero, lParam);
            UnsafeNativeMethods.PostMessage(hWnd, NativeMethods.WM_LBUTTONDOWN, IntPtr.Zero, lParam);
        }
        /// <summary>
        /// 在指定句柄窗口内弹起鼠标,不等待消息处理完成立即返回
        /// </summary>
        /// <param name="hWnd">窗口句柄</param>
        /// <param name="pt">相对于窗口的点</param>
        public static void PostMouseUp(IntPtr hWnd, Point pt)
        {
            IntPtr lParam = Util.MAKELPARAM(pt.X, pt.Y);
            UnsafeNativeMethods.PostMessage(hWnd, NativeMethods.WM_LBUTTONUP, IntPtr.Zero, lParam);
        }
        /// <summary>
        /// 在指定句柄窗口内单击鼠标,不等待消息处理完成立即返回
        /// </summary>
        /// <param name="hWnd">窗口句柄</param>
        /// <param name="pt">相对于窗口的点</param>
        public static void PostMouseClick(IntPtr hWnd, Point pt)
        {
            IntPtr lParam = Util.MAKELPARAM(pt.X, pt.Y);
            UnsafeNativeMethods.PostMessage(hWnd, NativeMethods.WM_MOUSEMOVE, IntPtr.Zero, lParam);
            UnsafeNativeMethods.PostMessage(hWnd, NativeMethods.WM_LBUTTONDOWN, IntPtr.Zero, lParam);
            UnsafeNativeMethods.PostMessage(hWnd, NativeMethods.WM_LBUTTONUP, IntPtr.Zero, lParam);
        }
 
        /// <summary>
        /// 在指定句柄窗口内按下鼠标,等待消息处理完成后再返回
        /// </summary>
        /// <param name="hWnd">窗口句柄</param>
        /// <param name="pt">相对于窗口的点</param>
        public static void SendMouseDown(IntPtr hWnd, Point pt)
        {
            IntPtr lParam = Util.MAKELPARAM(pt.X, pt.Y);
            UnsafeNativeMethods.SendMessage(hWnd, NativeMethods.WM_MOUSEMOVE, IntPtr.Zero, lParam);
            UnsafeNativeMethods.SendMessage(hWnd, NativeMethods.WM_LBUTTONDOWN, IntPtr.Zero, lParam);
        }
        /// <summary>
        /// 在指定句柄窗口内弹起鼠标,等待消息处理完成后再返回
        /// </summary>
        /// <param name="hWnd">窗口句柄</param>
        /// <param name="pt">相对于窗口的点</param>
        public static void SendMouseUp(IntPtr hWnd, Point pt)
        {
            IntPtr lParam = Util.MAKELPARAM(pt.X, pt.Y);
            UnsafeNativeMethods.SendMessage(hWnd, NativeMethods.WM_LBUTTONUP, IntPtr.Zero, lParam);
        }
        /// <summary>
        /// 在指定句柄窗口内单击鼠标,等待消息处理完成后再返回
        /// </summary>
        /// <param name="hWnd">窗口句柄</param>
        /// <param name="pt">相对于窗口的点</param>
        public static void SendMouseClick(IntPtr hWnd, Point pt)
        {
            IntPtr lParam = Util.MAKELPARAM(pt.X, pt.Y);
            UnsafeNativeMethods.SendMessage(hWnd, NativeMethods.WM_MOUSEMOVE, IntPtr.Zero, lParam);
            UnsafeNativeMethods.SendMessage(hWnd, NativeMethods.WM_LBUTTONDOWN, IntPtr.Zero, lParam);
            UnsafeNativeMethods.SendMessage(hWnd, NativeMethods.WM_LBUTTONUP, IntPtr.Zero, lParam);
        }
 
        /// <summary>
        /// 按下键盘键
        /// </summary>
        /// <param name="vKey">虚拟键码</param>
        public static void SendKeyDown(short vKey)
        {
            NativeMethods.INPUT[] input = new NativeMethods.INPUT[1];
            input[0].type = NativeMethods.INPUT_KEYBOARD;
            input[0].ki.wVk = vKey;
            input[0].ki.time = UnsafeNativeMethods.GetTickCount();
            UnsafeNativeMethods.SendInput((uint)input.Length, input, Marshal.SizeOf(input[0]));
        }
        /// <summary>
        /// 弹起键盘键
        /// </summary>
        /// <param name="vKey">虚拟键码</param>
        public static void SendKeyUp(short vKey)
        {
            NativeMethods.INPUT[] input = new NativeMethods.INPUT[1];
            input[0].type = NativeMethods.INPUT_KEYBOARD;
            input[0].ki.wVk = vKey;
            input[0].ki.dwFlags = NativeMethods.KEYEVENTF_KEYUP;
            input[0].ki.time = UnsafeNativeMethods.GetTickCount();
            UnsafeNativeMethods.SendInput((uint)input.Length, input, Marshal.SizeOf(input[0]));
        }
        /// <summary>
        /// 按一下并弹起键盘键
        /// </summary>
        /// <param name="vKey">虚拟键码</param>
        public static void SendKeyClick(short vKey)
        {
            SendKeyDown(vKey);
            SendKeyUp(vKey);
        }
 
        /// <summary>
        /// 显示或隐藏光标.
        /// </summary>
        /// <param name="visible">显示为true,否则为false.</param>
        public static void ShowCursor(bool visible)
        {
            if (visible)
            {
                while (UnsafeNativeMethods.ShowCursor(true) < 0) { }
            }
            else
            {
                while (UnsafeNativeMethods.ShowCursor(false) >= 0) { }
            }
        }
        /// <summary>
        /// 获取光标是否显示.显示为true,否则为false.
        /// </summary>
        public static bool GetCursorVisible()
        {
            UnsafeNativeMethods.ShowCursor(false);
            return UnsafeNativeMethods.ShowCursor(true) >= 0;
        }
 
        /// <summary>
        /// 获取指定窗口的所有者窗口。
        /// </summary>
        /// <param name="hWnd">指定窗口。</param>
        /// <returns>所有者窗口。</returns>
        public static IntPtr GetOwner(IntPtr hWnd)
        {
            return UnsafeNativeMethods.GetWindow(hWnd, NativeMethods.GW_OWNER);
        }
        /// <summary>
        /// 为指定窗口设置新的的所有者窗口。
        /// </summary>
        /// <param name="hWnd">指定窗口。</param>
        /// <param name="hWndNewOwner">新的所有者窗口。</param>
        public static void SetOwner(IntPtr hWnd, IntPtr hWndNewOwner)
        {
            UnsafeNativeMethods.SetWindowLong(hWnd, NativeMethods.GWL_HWNDPARENT, (int)hWndNewOwner);
        }
        /// <summary>
        /// 获取指定窗口的父窗口。
        /// </summary>
        /// <param name="hWnd">指定窗口。</param>
        /// <returns>父窗口。</returns>
        public static IntPtr GetParent(IntPtr hWnd)
        {
            return UnsafeNativeMethods.GetAncestor(hWnd, NativeMethods.GA_PARENT);
        }
        /// <summary>
        /// 为指定窗口设置新的父窗口。
        /// </summary>
        /// <param name="hWnd">指定窗口。</param>
        /// <param name="hWndNewParent">新的父窗口。</param>
        public static void SetParent(IntPtr hWnd, IntPtr hWndNewParent)
        {
            UnsafeNativeMethods.SetParent(hWnd, hWndNewParent);
        }
 
        /// <summary>
        /// 获取指定窗口包含的滚动条。
        /// </summary>
        /// <param name="hWnd">窗口句柄。</param>
        /// <returns>返回值见 System.Windows.Forms.ScrollBars 定义</returns>
        public static int GetScrollBars(IntPtr hWnd)
        {
            int wndStyle = UnsafeNativeMethods.GetWindowLong(hWnd, NativeMethods.GWL_STYLE);
            bool hsVisible = (wndStyle & NativeMethods.WS_HSCROLL) != 0;
            bool vsVisible = (wndStyle & NativeMethods.WS_VSCROLL) != 0;
 
            if (hsVisible)
                return vsVisible ? 3 : 1;
            else
                return vsVisible ? 2 : 0;
        }
        /// <summary>
        /// 获取指定窗口是否有左滚动条样式。
        /// </summary>
        /// <param name="hWnd">窗口句柄。</param>
        /// <returns>窗口有左滚动条样式返回 true,否则返回 false。</returns>
        public static bool GetLeftScrollBar(IntPtr hWnd)
        {
            int wndExStyle = UnsafeNativeMethods.GetWindowLong(hWnd, NativeMethods.GWL_EXSTYLE);
            return (wndExStyle & NativeMethods.WS_EX_LEFTSCROLLBAR) != 0;
        }
        /// <summary>
        /// 获取指定窗口边框宽度。
        /// </summary>
        /// <param name="hWnd">窗口句柄。</param>
        /// <returns>窗口边框宽度。</returns>
        public static int GetBorderWidth(IntPtr hWnd)
        {
            int wndExStyle = UnsafeNativeMethods.GetWindowLong(hWnd, NativeMethods.GWL_EXSTYLE);
            if ((wndExStyle & NativeMethods.WS_EX_STATICEDGE) != 0)
                return 3;
            else if ((wndExStyle & NativeMethods.WS_EX_WINDOWEDGE) != 0)
                return 2;
            else if ((wndExStyle & NativeMethods.WS_EX_CLIENTEDGE) != 0)
                return 2;
            else if ((UnsafeNativeMethods.GetWindowLong(hWnd, NativeMethods.GWL_STYLE) & NativeMethods.WS_BORDER) != 0)
                return 1;
            else
                return 0;
        }
        /// <summary>
        /// 从 GDI+ Region 创建一个 GDI Region。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <param name="region">System.Drawing.Region 对象。</param>
        /// <returns>GDI Region 句柄。</returns>
        public static IntPtr GetHRgn(IntPtr hWnd, Region region)
        {
            using (Graphics g = Graphics.FromHwndInternal(hWnd))
            {
                return region.GetHrgn(g);
            }
        }
        /// <summary>
        /// 获取窗口的客户区相对于窗口左上角的矩形.(特别注意:如果有非客户区起点一般不为0,0 如果没有非客户区该值同ClientRectangle相等).该函数非常特别尽量不要调用,在非客户区操作时可能使用到,其余问题请咨询编写人员. by Tim 2013.11.23
        /// </summary>
        /// <param name="hWnd">指定窗口句柄</param>
        /// <returns>客户区相对于窗口坐标系的坐标和大小</returns>
        public static NativeMethods.RECT GetClientRect(IntPtr hWnd)
        {
            NativeMethods.RECT wndRect = new NativeMethods.RECT();//窗口相对于屏幕的坐标和大小
            NativeMethods.RECT clientRect = new NativeMethods.RECT();//以0,0开始的客户区坐标和大小
 
            UnsafeNativeMethods.GetWindowRect(hWnd, ref wndRect);//窗口
            UnsafeNativeMethods.GetClientRect(hWnd, ref clientRect);//客户区
            UnsafeNativeMethods.MapWindowPoints(hWnd, NativeMethods.HWND_DESKTOP, ref clientRect, 2);//客户区映射到屏幕
 
            //偏移
            clientRect.left -= wndRect.left;
            clientRect.top -= wndRect.top;
            clientRect.right -= wndRect.left;
            clientRect.bottom -= wndRect.top;
 
            //返回
            return clientRect;
        }
 
        /// <summary>
        /// 闪烁指定窗口。
        /// </summary>
        /// <param name="hWnd">指定窗口句柄。</param>
        /// <param name="count">闪烁次数。</param>
        /// <returns>返回闪烁前窗口是否已被激活。</returns>
        public static bool FlashWindow(IntPtr hWnd, int count)
        {
            NativeMethods.FLASHWINFO fwi = new NativeMethods.FLASHWINFO();
            fwi.cbSize = Marshal.SizeOf(fwi);
            fwi.hwnd = hWnd;
            fwi.dwFlags = NativeMethods.FLASHW_TRAY;
            fwi.uCount = count;
            fwi.dwTimeout = 0;
            return UnsafeNativeMethods.FlashWindowEx(ref fwi);
        }
 
 
        #region 扩展
 
        /// <summary>
        /// 将窗口置顶
        /// </summary>
        /// <param name="lpClassName">窗口类名</param>
        /// <param name="lpWindowName">窗口标题</param>
        public static void BringToFront(string lpClassName, string lpWindowName)
        {
            IntPtr hWnd = UnsafeNativeMethods.FindWindow(lpClassName, lpWindowName);
            if (hWnd != IntPtr.Zero)
                UnsafeNativeMethods.SetWindowPos(hWnd, NativeMethods.HWND_TOP, 0, 0, 0, 0, NativeMethods.SWP_NOSIZE | NativeMethods.SWP_NOMOVE);
        }
 
        /// <summary>
        /// 将窗口置底
        /// </summary>
        /// <param name="lpClassName">窗口类名</param>
        /// <param name="lpWindowName">窗口标题</param>
        public static void SendToBack(string lpClassName, string lpWindowName)
        {
            IntPtr hWnd = UnsafeNativeMethods.FindWindow(lpClassName, lpWindowName);
            if (hWnd != IntPtr.Zero)
                UnsafeNativeMethods.SetWindowPos(hWnd, NativeMethods.HWND_BOTTOM, 0, 0, 0, 0, NativeMethods.SWP_NOSIZE | NativeMethods.SWP_NOMOVE);
        }
 
        /// <summary>
        /// 跨进程,向指定窗口发送WM_COPYDATA消息
        /// </summary>
        /// <param name="lpWindowName">窗口标题</param>
        /// <param name="flag">区分标记</param>
        /// <param name="data">要发送的字符串数据</param>
        public static void SendCopyData(string lpWindowName, int flag, string data)
        {
            IntPtr hWnd = UnsafeNativeMethods.FindWindow(null, lpWindowName);
            if (hWnd == IntPtr.Zero)
                return;
 
            byte[] arr = Encoding.UTF8.GetBytes(data);
            NativeMethods.COPYDATASTRUCT cds = new NativeMethods.COPYDATASTRUCT();
            cds.dwData = flag;
            cds.cbData = arr.Length + 1;
            cds.lpData = data;
            UnsafeNativeMethods.SendMessage(hWnd, NativeMethods.WM_COPYDATA, IntPtr.Zero, ref cds);
        }
 
        /// <summary>
        /// 向指定标题的窗口发送WM_CLOSE消息
        /// </summary>
        /// <param name="lpWindowName">窗口标题</param>
        public static void CloseWindow(string lpWindowName)
        {
            IntPtr hWnd = UnsafeNativeMethods.FindWindow(null, lpWindowName);
            if (hWnd == IntPtr.Zero)
                return;
 
            UnsafeNativeMethods.PostMessage(hWnd, NativeMethods.WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
        }
 
        /// <summary>
        /// 设置窗口显示状态
        /// </summary>
        /// <param name="lpWindowName">窗口标题</param>
        /// <param name="nCmdShow">显示指令</param>
        public static void ShowWindow(string lpWindowName, int nCmdShow)
        {
            IntPtr hWnd = UnsafeNativeMethods.FindWindow(null, lpWindowName);
            if (hWnd == IntPtr.Zero)
                return;
 
            UnsafeNativeMethods.ShowWindow(hWnd, nCmdShow);
        }
 
        /// <summary>
        /// 获取控件是否TopMost(判断控件是否为“TopMost”类型的窗口,这种类型的窗口总是在其它窗口的前面)
        /// </summary>
        /// <param name="hWnd">要判断的窗口</param>
        public static bool IsTopMost(IntPtr hWnd)
        {
            return (UnsafeNativeMethods.GetWindowLong(hWnd, NativeMethods.GWL_EXSTYLE) & NativeMethods.WS_EX_TOPMOST) != 0;
        }
 
        /// <summary>
        /// 设置控件TopMost(使窗口成为“TopMost”类型的窗口,这种类型的窗口总是在其它窗口的前面)
        /// </summary>
        /// <param name="hWnd">要设置的窗口</param>
        public static void SetTopMost(IntPtr hWnd)
        {
            try
            {
                UnsafeNativeMethods.SetWindowPos(hWnd, NativeMethods.HWND_TOPMOST, 0, 0, 0, 0, NativeMethods.SWP_NOSIZE | NativeMethods.SWP_NOMOVE | NativeMethods.SWP_NOACTIVATE);
            }
            catch
            {
            }
        }
 
        /// <summary>
        /// 设置控件NoTopMost(将窗口放在所有“TopMost”类型窗口的后面,其它类型窗口的前面)
        /// </summary>
        /// <param name="hWnd">要设置的窗口</param>
        public static void SetNoTopMost(IntPtr hWnd)
        {
            try
            {
                UnsafeNativeMethods.SetWindowPos(hWnd, NativeMethods.HWND_NOTOPMOST, 0, 0, 0, 0, NativeMethods.SWP_NOSIZE | NativeMethods.SWP_NOMOVE | NativeMethods.SWP_NOACTIVATE);
            }
            catch
            {
            }
        }
 
        /// <summary>
        /// 设置窗口的拥有窗口,可以跨进程
        /// </summary>
        /// <param name="child"></param>
        /// <param name="lpParentWindowName"></param>
        public static void SetOwner(Control child, string lpParentWindowName)
        {
            IntPtr hWndNewParent = UnsafeNativeMethods.FindWindow(null, lpParentWindowName);
            if (hWndNewParent != IntPtr.Zero)
                SetOwner(child.Handle, hWndNewParent);
        }
 
        /// <summary>
        /// 设置窗口的拥有窗口,可以跨进程
        /// </summary>
        /// <param name="lpChildWindowName"></param>
        /// <param name="parent"></param>
        public static void SetOwner(string lpChildWindowName, Control parent)
        {
            IntPtr hWndChild = UnsafeNativeMethods.FindWindow(null, lpChildWindowName);
            if (hWndChild != IntPtr.Zero)
                SetOwner(hWndChild, parent.Handle);
        }
 
        /// <summary>
        /// 跨进程,向指定窗口发送指定消息,立即返回
        /// </summary>
        /// <param name="lpWindowName">窗口标题</param>
        /// <param name="msg">消息</param>
        /// <param name="lParam">lParam</param>
        public static void PostMessage(string lpWindowName, int msg, int lParam)
        {
            IntPtr hWnd = UnsafeNativeMethods.FindWindow(null, lpWindowName);
            if (hWnd == IntPtr.Zero)
                return;
 
            UnsafeNativeMethods.PostMessage(hWnd, msg, IntPtr.Zero, (IntPtr)lParam);
        }
 
        /// <summary>
        /// 跨进程,向指定窗口发送指定消息,立即返回
        /// </summary>
        /// <param name="lpWindowName">窗口标题</param>
        /// <param name="msg">消息</param>
        /// <param name="wParam">wParm</param>
        /// <param name="lParam">lParm</param>
        public static void PostMessage(string lpWindowName, int msg, int wParam, int lParam)
        {
            IntPtr hWnd = UnsafeNativeMethods.FindWindow(null, lpWindowName);
            if (hWnd == IntPtr.Zero)
                return;
 
            UnsafeNativeMethods.PostMessage(hWnd, msg, (IntPtr)wParam, (IntPtr)lParam);
        }
 
        /// <summary>
        /// 跨进程,向指定窗口发送指定消息,立即返回
        /// </summary>
        /// <param name="hWnd">窗口句柄</param>
        /// <param name="msg">消息</param>
        /// <param name="lParam">lParam</param>
        public static void PostMessage(IntPtr hWnd, int msg, int lParam)
        {
            if (hWnd == IntPtr.Zero)
                return;
 
            UnsafeNativeMethods.PostMessage(hWnd, msg, IntPtr.Zero, (IntPtr)lParam);
        }
 
        /// <summary>
        /// 跨进程,向指定窗口发送指定消息,立即返回
        /// </summary>
        /// <param name="hWnd">窗口句柄</param>
        /// <param name="msg">消息</param>
        /// <param name="wParam">wParam</param>
        /// <param name="lParam">lParam</param>
        public static void PostMessage(IntPtr hWnd, int msg, int wParam, int lParam)
        {
            if (hWnd == IntPtr.Zero)
                return;
 
            UnsafeNativeMethods.PostMessage(hWnd, msg, (IntPtr)wParam, (IntPtr)lParam);
        }
 
        #endregion
 
 
        #region 窗口
 
        /// <summary>
        /// 从 lParam 提取坐标
        /// </summary>
        /// <param name="lParam">消息中的 lParam 参数</param>
        /// <returns>鼠标相对窗口坐标</returns>
        public static Point GetMousePosition(IntPtr lParam)
        {
            return new Point(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
        }
        /// <summary>
        /// 获取该控件的右下角相对于其容器的左上角的坐标。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <returns>System.Drawing.Point,它表示控件的右下角相对于其容器的左上角。</returns>
        public static Point GetBottomRight(IntPtr hWnd)
        {
            NativeMethods.RECT lpRect = new NativeMethods.RECT();
            UnsafeNativeMethods.GetWindowRect(hWnd, ref lpRect);
            NativeMethods.POINT pt = new NativeMethods.POINT(lpRect.bottom, lpRect.right);
 
            //父窗口不为空转换坐标
            IntPtr hWndParent = GetParent(hWnd);
            if (hWndParent != IntPtr.Zero)
                UnsafeNativeMethods.MapWindowPoints(NativeMethods.HWND_DESKTOP, hWndParent, ref pt, 1);
 
            return new Point(pt.x, pt.y);
        }
        /// <summary>
        /// 获取一个值,该值指示是否将控件显示为顶级窗口。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <returns>如果为 true,则将控件显示为顶级窗口;否则,为 false。</returns>
        public static bool GetTopLevel(IntPtr hWnd)
        {
            int dwStyle = UnsafeNativeMethods.GetWindowLong(hWnd, NativeMethods.GWL_STYLE);
            return ((dwStyle & NativeMethods.WS_CHILD) == 0);
        }
        /// <summary>
        /// 获取一个值,该值指示控件是否有与它关联的句柄。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <returns>如果已经为控件分配了句柄,则为 true;否则为 false。</returns>
        public static bool GetIsHandleCreated(IntPtr hWnd)
        {
            return (hWnd != IntPtr.Zero);
        }
        /// <summary>
        /// 获取一个值,该值指示是否显示该控件及其所有父控件。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <returns>如果显示该控件及其所有父控件,则为 true;否则为 false。默认为 true。</returns>
        public static bool GetVisible(IntPtr hWnd)
        {
            return UnsafeNativeMethods.IsWindowVisible(hWnd);
        }
        /// <summary>
        /// 设置一个值,该值指示是否显示该控件及其所有父控件。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <param name="value">如果显示该控件及其所有父控件,则为 true;否则为 false。默认为 true。</param>
        public static void SetVisible(IntPtr hWnd, bool value)
        {
            UnsafeNativeMethods.SetWindowPos(hWnd, IntPtr.Zero, 0, 0, 0, 0, NativeMethods.SWP_NOSIZE | NativeMethods.SWP_NOMOVE | NativeMethods.SWP_NOZORDER | NativeMethods.SWP_NOACTIVATE | (value ? NativeMethods.SWP_SHOWWINDOW : NativeMethods.SWP_HIDEWINDOW));
        }
        /// <summary>
        /// 获取一个值,该值指示控件是否可以对用户交互作出响应。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <returns>如果控件可以对用户交互作出响应,则为 true;否则为 false。默认为 true。</returns>
        public static bool GetEnabled(IntPtr hWnd)
        {
            return UnsafeNativeMethods.IsWindowEnabled(hWnd);
        }
        /// <summary>
        /// 设置一个值,该值指示控件是否可以对用户交互作出响应。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <param name="value">如果控件可以对用户交互作出响应,则为 true;否则为 false。默认为 true。</param>
        public static void SetEnabled(IntPtr hWnd, bool value)
        {
            UnsafeNativeMethods.EnableWindow(hWnd, value);
        }
        /// <summary>
        /// 获取一个值,该值指示控件是否有输入焦点。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <returns>如果控件有焦点,则为 true;否则为 false。</returns>
        public static bool GetFocused(IntPtr hWnd)
        {
            return (GetIsHandleCreated(hWnd) && (UnsafeNativeMethods.GetFocus() == hWnd));
        }
        /// <summary>
        /// 获取一个值,该值指示控件是否可以接收焦点。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <returns>如果控件可以接收焦点,则为 true;否则为 false。</returns>
        public static bool GetCanFocus(IntPtr hWnd)
        {
            if (!GetIsHandleCreated(hWnd))
                return false;
 
            return UnsafeNativeMethods.IsWindowVisible(hWnd) && UnsafeNativeMethods.IsWindowEnabled(hWnd);
        }
        /// <summary>
        /// 获取一个值,该值指示控件或它的一个子控件当前是否有输入焦点。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <returns>如果控件或它的一个子控件当前已经有输入焦点,则为 true;否则为 false。</returns>
        public static bool GetContainsFocus(IntPtr hWnd)
        {
            if (!GetIsHandleCreated(hWnd))
                return false;
 
            IntPtr focus = UnsafeNativeMethods.GetFocus();
            if (focus == IntPtr.Zero)
                return false;
 
            return ((focus == hWnd) || UnsafeNativeMethods.IsChild(hWnd, focus));
        }
        /// <summary>
        /// 获取一个值,该值指示控件是否已捕获鼠标。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <returns>如果控件已捕获鼠标,则为 true;否则为 false。</returns>
        public static bool GetCapture(IntPtr hWnd)
        {
            return (GetIsHandleCreated(hWnd) && (UnsafeNativeMethods.GetCapture() == hWnd));
        }
        /// <summary>
        /// 设置一个值,该值指示控件是否已捕获鼠标。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <param name="value">如果控件已捕获鼠标,则为 true;否则为 false。</param>
        public static void SetCapture(IntPtr hWnd, bool value)
        {
            if (value)
                UnsafeNativeMethods.SetCapture(hWnd);
            else
                UnsafeNativeMethods.ReleaseCapture();
        }
        /// <summary>
        /// 获取该控件的左上角相对于其容器的左上角的坐标。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <returns>System.Drawing.Point,它表示控件的左上角相对于其容器的左上角。</returns>
        public static Point GetLocation(IntPtr hWnd)
        {
            NativeMethods.RECT lpRect = new NativeMethods.RECT();
            UnsafeNativeMethods.GetWindowRect(hWnd, ref lpRect);
            NativeMethods.POINT pt = new NativeMethods.POINT(lpRect.left, lpRect.top);
 
            //父窗口不为空转换坐标
            IntPtr hWndParent = GetParent(hWnd);
            if (hWndParent != IntPtr.Zero)
                UnsafeNativeMethods.MapWindowPoints(NativeMethods.HWND_DESKTOP, hWndParent, ref pt, 1);
 
            return new Point(pt.x, pt.y);
        }
        /// <summary>
        /// 设置该控件的左上角相对于其容器的左上角的坐标。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <param name="value">System.Drawing.Point,它表示控件的左上角相对于其容器的左上角。</param>
        public static void SetLocation(IntPtr hWnd, Point value)
        {
            UnsafeNativeMethods.SetWindowPos(hWnd, IntPtr.Zero, value.X, value.Y, 0, 0, NativeMethods.SWP_NOSIZE | NativeMethods.SWP_NOZORDER | NativeMethods.SWP_NOACTIVATE);
        }
        /// <summary>
        /// 获取控件的高度和宽度。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <returns>System.Drawing.Size,表示控件的高度和宽度(以像素为单位)。</returns>
        public static Size GetSize(IntPtr hWnd)
        {
            NativeMethods.RECT lpRect = new NativeMethods.RECT();
            UnsafeNativeMethods.GetWindowRect(hWnd, ref lpRect);
            return lpRect.Size;
        }
        /// <summary>
        /// 设置控件的高度和宽度。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <param name="value">System.Drawing.Size,表示控件的高度和宽度(以像素为单位)。</param>
        public static void SetSize(IntPtr hWnd, Size value)
        {
            UnsafeNativeMethods.SetWindowPos(hWnd, IntPtr.Zero, 0, 0, value.Width, value.Height, NativeMethods.SWP_NOMOVE | NativeMethods.SWP_NOZORDER | NativeMethods.SWP_NOACTIVATE);
        }
        /// <summary>
        /// 获取控件(包括其非工作区元素)相对于其父控件的大小和位置(以像素为单位)。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <returns>相对于父控件的 System.Drawing.Rectangle,表示控件(包括其非工作区元素)的大小和位置(以像素为单位)。</returns>
        public static Rectangle GetBounds(IntPtr hWnd)
        {
            NativeMethods.RECT lpRect = new NativeMethods.RECT();
            UnsafeNativeMethods.GetWindowRect(hWnd, ref lpRect);
 
            //父窗口不为空转换坐标
            IntPtr hWndParent = GetParent(hWnd);
            if (hWndParent != IntPtr.Zero)
                UnsafeNativeMethods.MapWindowPoints(NativeMethods.HWND_DESKTOP, hWndParent, ref lpRect, 2);
 
            return lpRect.ToRectangle();
        }
        /// <summary>
        /// 设置控件(包括其非工作区元素)相对于其父控件的大小和位置(以像素为单位)。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <param name="value">相对于父控件的 System.Drawing.Rectangle,表示控件(包括其非工作区元素)的大小和位置(以像素为单位)。</param>
        public static void SetBounds(IntPtr hWnd, Rectangle value)
        {
            UnsafeNativeMethods.SetWindowPos(hWnd, IntPtr.Zero, value.X, value.Y, value.Width, value.Height, NativeMethods.SWP_NOZORDER | NativeMethods.SWP_NOACTIVATE);
        }
        /// <summary>
        /// 获取控件左边缘与其容器的工作区左边缘之间的距离(以像素为单位)。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <returns>System.Int32 表示控件左边缘与其容器的工作区左边缘之间的距离(以像素为单位)。</returns>
        public static int GetLeft(IntPtr hWnd)
        {
            return GetLocation(hWnd).X;
        }
        /// <summary>
        /// 设置控件左边缘与其容器的工作区左边缘之间的距离(以像素为单位)。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <param name="value">System.Int32 表示控件左边缘与其容器的工作区左边缘之间的距离(以像素为单位)。</param>
        public static void SetLeft(IntPtr hWnd, int value)
        {
            Point pt = GetLocation(hWnd);
            pt.X = value;
            SetLocation(hWnd, pt);
        }
        /// <summary>
        /// 获取控件上边缘与其容器的工作区上边缘之间的距离(以像素为单位)。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <returns>System.Int32 表示控件下边缘与其容器的工作区上边缘之间的距离(以像素为单位)。</returns>
        public static int GetTop(IntPtr hWnd)
        {
            return GetLocation(hWnd).Y;
        }
        /// <summary>
        /// 设置控件上边缘与其容器的工作区上边缘之间的距离(以像素为单位)。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <param name="value">System.Int32 表示控件上边缘与其容器的工作区上边缘之间的距离(以像素为单位)。</param>
        public static void SetTop(IntPtr hWnd, int value)
        {
            Point pt = GetLocation(hWnd);
            pt.Y = value;
            SetLocation(hWnd, pt);
        }
        /// <summary>
        /// 获取控件右边缘与其容器的工作区左边缘之间的距离(以像素为单位)。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <returns>System.Int32 表示控件右边缘与其容器的工作区左边缘之间的距离(以像素为单位)。</returns>
        public static int GetRight(IntPtr hWnd)
        {
            return GetBottomRight(hWnd).X;
        }
        /// <summary>
        /// 获取控件下边缘与其容器的工作区上边缘之间的距离(以像素为单位)。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <returns>System.Int32 表示控件下边缘与其容器的工作区上边缘之间的距离(以像素为单位)。</returns>
        public static int GetBottom(IntPtr hWnd)
        {
            return GetBottomRight(hWnd).Y;
        }
        /// <summary>
        /// 获取控件的宽度。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <returns>控件的宽度(以像素为单位)。</returns>
        public static int GetWidth(IntPtr hWnd)
        {
            return GetSize(hWnd).Width;
        }
        /// <summary>
        /// 设置控件的宽度。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <param name="value">控件的宽度(以像素为单位)。</param>
        public static void SetWidth(IntPtr hWnd, int value)
        {
            Size sz = GetSize(hWnd);
            sz.Width = value;
            SetSize(hWnd, sz);
        }
        /// <summary>
        /// 获取控件的高度。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <returns>控件的高度(以像素为单位)。</returns>
        public static int GetHeight(IntPtr hWnd)
        {
            return GetSize(hWnd).Height;
        }
        /// <summary>
        /// 设置控件的高度。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <param name="value">控件的高度(以像素为单位)。</param>
        public static void SetHeight(IntPtr hWnd, int value)
        {
            Size sz = GetSize(hWnd);
            sz.Height = value;
            SetSize(hWnd, sz);
        }
        /// <summary>
        /// 获取控件的工作区的高度和宽度。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <returns>一个 System.Drawing.Size,表示控件的工作区的维数。</returns>
        public static Size GetClientSize(IntPtr hWnd)
        {
            NativeMethods.RECT lpRect = new NativeMethods.RECT();
            UnsafeNativeMethods.GetClientRect(hWnd, ref lpRect);
            return lpRect.Size;
        }
        /// <summary>
        /// 设置控件的工作区的高度和宽度。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <param name="value">一个 System.Drawing.Size,表示控件的工作区的维数。</param>
        public static void SetClientSize(IntPtr hWnd, Size value)
        {
            NativeMethods.RECT lpRect = new NativeMethods.RECT(0, 0, value.Width, value.Height);
            int dwStyle = UnsafeNativeMethods.GetWindowLong(hWnd, NativeMethods.GWL_STYLE);
            int dwExStyle = UnsafeNativeMethods.GetWindowLong(hWnd, NativeMethods.GWL_EXSTYLE);
            UnsafeNativeMethods.AdjustWindowRectEx(ref lpRect, dwStyle, false, dwExStyle);
            SetSize(hWnd, lpRect.Size);
        }
        /// <summary>
        /// 获取表示控件的工作区的矩形。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <returns>一个 System.Drawing.Rectangle,它表示控件的工作区。</returns>
        public static Rectangle GetClientRectangle(IntPtr hWnd)
        {
            NativeMethods.RECT lpRect = new NativeMethods.RECT();
            UnsafeNativeMethods.GetClientRect(hWnd, ref lpRect);
            return lpRect.ToRectangle();
        }
        /// <summary>
        /// 获取与此控件关联的文本。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <returns>与该控件关联的文本。</returns>
        public static string GetText(IntPtr hWnd)
        {
            if (!GetIsHandleCreated(hWnd))
                return string.Empty;
 
            int windowTextLength = UnsafeNativeMethods.GetWindowTextLength(hWnd);
            if (UnsafeNativeMethods.GetSystemMetrics(NativeMethods.SM_DBCSENABLED) != 0)
                windowTextLength = (windowTextLength * 2) + 1;
            StringBuilder lpString = new StringBuilder(windowTextLength + 1);
            UnsafeNativeMethods.GetWindowText(hWnd, lpString, lpString.Capacity);
            return lpString.ToString();
        }
        /// <summary>
        /// 设置与此控件关联的文本。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <param name="value">与该控件关联的文本。</param>
        public static void SetText(IntPtr hWnd, string value)
        {
            if (GetIsHandleCreated(hWnd))
                return;
 
            UnsafeNativeMethods.SetWindowText(hWnd, value);
        }
 
        /// <summary>
        /// 将与此控件关联的文本重置为其默认值。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        public static void ResetText(IntPtr hWnd)
        {
            SetText(hWnd, string.Empty);
        }
        /// <summary>
        /// 向用户显示控件。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        public static void Show(IntPtr hWnd)
        {
            SetVisible(hWnd, true);
        }
        /// <summary>
        /// 对用户隐藏控件。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        public static void Hide(IntPtr hWnd)
        {
            SetVisible(hWnd, false);
        }
        /// <summary>
        /// 将控件带到 Z 顺序的前面。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        public static void BringToFront(IntPtr hWnd)
        {
            UnsafeNativeMethods.SetWindowPos(hWnd, NativeMethods.HWND_TOP, 0, 0, 0, 0, NativeMethods.SWP_NOSIZE | NativeMethods.SWP_NOMOVE);
        }
        /// <summary>
        /// 将控件发送到 Z 顺序的后面。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        public static void SendToBack(IntPtr hWnd)
        {
            UnsafeNativeMethods.SetWindowPos(hWnd, NativeMethods.HWND_BOTTOM, 0, 0, 0, 0, NativeMethods.SWP_NOSIZE | NativeMethods.SWP_NOMOVE);
        }
        /// <summary>
        /// 为控件设置输入焦点。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <returns>如果输入焦点请求成功,则为 true;否则为 false。</returns>
        public static bool Focus(IntPtr hWnd)
        {
            if (GetCanFocus(hWnd))
                UnsafeNativeMethods.SetFocus(hWnd);
 
            return GetFocused(hWnd);
        }
        /// <summary>
        /// 为控件创建 System.Drawing.Graphics。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <returns>控件的 System.Drawing.Graphics。</returns>
        public static Graphics CreateGraphics(IntPtr hWnd)
        {
            return Graphics.FromHwndInternal(hWnd);
        }
        /// <summary>
        /// 将指定屏幕点的位置计算成工作区坐标。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <param name="p">要转换的屏幕坐标 System.Drawing.Point。</param>
        /// <returns>一个 System.Drawing.Point,它表示转换后的 System.Drawing.Point、p(以工作区坐标表示)。</returns>
        public static Point PointToClient(IntPtr hWnd, Point p)
        {
            NativeMethods.POINT pt = new NativeMethods.POINT(p.X, p.Y);
            UnsafeNativeMethods.MapWindowPoints(NativeMethods.HWND_DESKTOP, hWnd, ref pt, 1);
            return new Point(pt.x, pt.y);
        }
        /// <summary>
        /// 将指定工作区点的位置计算成屏幕坐标。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <param name="p">要转换的工作区坐标 System.Drawing.Point。</param>
        /// <returns>一个 System.Drawing.Point,它表示转换后的 System.Drawing.Point、p(以屏幕坐标表示)。</returns>
        public static Point PointToScreen(IntPtr hWnd, Point p)
        {
            NativeMethods.POINT pt = new NativeMethods.POINT(p.X, p.Y);
            UnsafeNativeMethods.MapWindowPoints(hWnd, NativeMethods.HWND_DESKTOP, ref pt, 1);
            return new Point(pt.x, pt.y);
        }
        /// <summary>
        /// 计算指定屏幕矩形的大小和位置(以工作区坐标表示)。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <param name="r">要转换的屏幕坐标 System.Drawing.Rectangle。</param>
        /// <returns>一个 System.Drawing.Rectangle,它表示转换后的 System.Drawing.Rectangle、r(以工作区坐标表示)。</returns>
        public static Rectangle RectangleToClient(IntPtr hWnd, Rectangle r)
        {
            NativeMethods.RECT rect = new NativeMethods.RECT(r);
            UnsafeNativeMethods.MapWindowPoints(NativeMethods.HWND_DESKTOP, hWnd, ref rect, 2);
            return rect.ToRectangle();
        }
        /// <summary>
        /// 计算指定工作区矩形的大小和位置(以屏幕坐标表示)。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <param name="r">要转换的工作区坐标 System.Drawing.Rectangle。</param>
        /// <returns>一个 System.Drawing.Rectangle,它表示转换后的 System.Drawing.Rectangle、r(以屏幕坐标表示)。</returns>
        public static Rectangle RectangleToScreen(IntPtr hWnd, Rectangle r)
        {
            NativeMethods.RECT rect = new NativeMethods.RECT(r);
            UnsafeNativeMethods.MapWindowPoints(hWnd, NativeMethods.HWND_DESKTOP, ref rect, 2);
            return rect.ToRectangle();
        }
        /// <summary>
        /// 使控件的整个图面无效并导致重绘控件。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        public static void Invalidate(IntPtr hWnd)
        {
            Invalidate(hWnd, false);
        }
        /// <summary>
        /// 使控件的指定区域无效(将其添加到控件的更新区域,下次绘制操作时将重新绘制更新区域),并向控件发送绘制消息。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <param name="rc">一个 System.Drawing.Rectangle,表示要使之无效的区域。</param>
        public static void Invalidate(IntPtr hWnd, Rectangle rc)
        {
            Invalidate(hWnd, rc, false);
        }
        /// <summary>
        /// 使控件的指定区域无效(将其添加到控件的更新区域,下次绘制操作时将重新绘制更新区域),并向控件发送绘制消息。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <param name="region">要使之无效的 System.Drawing.Region。</param>
        public static void Invalidate(IntPtr hWnd, Region region)
        {
            Invalidate(hWnd, region, false);
        }
        /// <summary>
        /// 使控件的特定区域无效并向控件发送绘制消息。还可以使分配给该控件的子控件无效。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <param name="invalidateChildren">若要使控件的子控件无效,则为 true;否则为 false。</param>
        public static void Invalidate(IntPtr hWnd, bool invalidateChildren)
        {
            if (GetIsHandleCreated(hWnd))
            {
                if (invalidateChildren)
                {
                    UnsafeNativeMethods.RedrawWindow(hWnd, IntPtr.Zero, IntPtr.Zero, NativeMethods.RDW_ALLCHILDREN | NativeMethods.RDW_INVALIDATE);//.Net Framework :多NativeMethods.RDW_ERASE
                }
                else
                {
                    UnsafeNativeMethods.InvalidateRect(hWnd, IntPtr.Zero, false);//.Net Framework :支持透明为true,否则false
                }
            }
        }
        /// <summary>
        /// 使控件的指定区域无效(将其添加到控件的更新区域,下次绘制操作时将重新绘制更新区域),并向控件发送绘制消息。还可以使分配给该控件的子控件无效。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <param name="rc">一个 System.Drawing.Rectangle,表示要使之无效的区域。</param>
        /// <param name="invalidateChildren">若要使控件的子控件无效,则为 true;否则为 false。</param>
        public static void Invalidate(IntPtr hWnd, Rectangle rc, bool invalidateChildren)
        {
            if (rc.IsEmpty)
            {
                Invalidate(hWnd, invalidateChildren);
            }
            else if (GetIsHandleCreated(hWnd))
            {
                if (invalidateChildren)
                {
                    NativeMethods.RECT rcUpdate = NativeMethods.RECT.FromXYWH(rc.X, rc.Y, rc.Width, rc.Height);
                    UnsafeNativeMethods.RedrawWindow(hWnd, ref rcUpdate, IntPtr.Zero, NativeMethods.RDW_ALLCHILDREN | NativeMethods.RDW_INVALIDATE);//.Net Framework :多NativeMethods.RDW_ERASE
                }
                else
                {
                    NativeMethods.RECT rect = NativeMethods.RECT.FromXYWH(rc.X, rc.Y, rc.Width, rc.Height);
                    UnsafeNativeMethods.InvalidateRect(hWnd, ref rect, false);//.Net Framework :支持透明为true,否则false
                }
            }
        }
        /// <summary>
        /// 使控件的指定区域无效(将其添加到控件的更新区域,下次绘制操作时将重新绘制更新区域),并向控件发送绘制消息。还可以使分配给该控件的子控件无效。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        /// <param name="region">要使之无效的 System.Drawing.Region。</param>
        /// <param name="invalidateChildren">若要使控件的子控件无效,则为 true;否则为 false。</param>
        public static void Invalidate(IntPtr hWnd, Region region, bool invalidateChildren)
        {
            if (region == null)
            {
                Invalidate(hWnd, invalidateChildren);
            }
            else if (GetIsHandleCreated(hWnd))
            {
                IntPtr hRgn = GetHRgn(hWnd, region);
                try
                {
                    if (invalidateChildren)
                    {
                        UnsafeNativeMethods.RedrawWindow(hWnd, IntPtr.Zero, hRgn, NativeMethods.RDW_ALLCHILDREN | NativeMethods.RDW_INVALIDATE);//.Net Framework :多NativeMethods.RDW_ERASE
                    }
                    else
                    {
                        UnsafeNativeMethods.InvalidateRgn(hWnd, hRgn, false);//.Net Framework :支持透明为true,否则false
                    }
                }
                finally
                {
                    UnsafeNativeMethods.DeleteObject(hRgn);
                }
            }
        }
        /// <summary>
        /// 用当前大小和位置更新控件的边界。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        public static void Update(IntPtr hWnd)
        {
            UnsafeNativeMethods.UpdateWindow(hWnd);
        }
        /// <summary>
        /// 强制控件使其工作区无效并立即重绘自己和任何子控件。
        /// </summary>
        /// <param name="hWnd">控件句柄。</param>
        public static void Refresh(IntPtr hWnd)
        {
            Invalidate(hWnd, true);
            Update(hWnd);
        }
 
        #endregion
    }
}