[C#适用]
DXperience是一款相当强大的控件,很多人都喜欢用它,但是注册费用太贵了。破解的吧,又不像是一个普通的EXE那么便捷,网上也有一些破解的版本存在。我找了一些试用,但破解过程复杂,而且,不知道是不是我RP不行啊,总是不成功。
后来发现,其实未注册的只是程序运行的时候会弹出一个讨厌的版权框,(没有源码和最后程序没有关系),把这个框点击关闭之后就一切正常了。于是萌发了让程序自己把它去掉的想法。
思路很简单:程序运行时,在控件初始化之前创建一个线程,这个线程一直查找这个提示框,然后给它发送WM_CLOSE 的消息即可。
下面是代码,在VS2005上测试通过:
1
using
System.Threading;
//
添加创建线程的引用
2 using System.Runtime.InteropServices; // 添加使用API的引用
3
4 // 声明两个API
5 [DllImport( " user32.dll " )]
6 static extern IntPtr FindWindow(IntPtr ptr1, string strWindow); // 这里比较特殊,后面会讲到
7 [DllImport( " user32.dll " )]
8 static extern int PostMessage(IntPtr hWnd, int msg, int wParam, int lParam);
9
10 public frmMain()
11 {
12 // 此处关闭窗口
13 Thread myThread = new Thread(new ThreadStart(this.KillDXThread));
14 myThread.Start();
15 // 关闭代码应该在初始化组件之前调用,否则会被DX截停.
16 InitializeComponent();
17 }
18
19 public void KillDXThread()
20 {
21 do
22 {
23 IntPtr dxWin = FindWindow(IntPtr.Zero, "Information");
24 if(dxWin != IntPtr.Zero)
25 {
26 PostMessage(dxWin, 0x10, 0, 0);
27 break;
28 }
29 } while (true);
30 ;
31 }
正常的 FindWindow函数两个参数都应该是String,只是DX的弹窗的CLASS总是在发生变化(标题不变),所以干脆直接传一个NULL(IntPtr.Zero)给第一个参数,第二个参数是DX的标题.
2 using System.Runtime.InteropServices; // 添加使用API的引用
3
4 // 声明两个API
5 [DllImport( " user32.dll " )]
6 static extern IntPtr FindWindow(IntPtr ptr1, string strWindow); // 这里比较特殊,后面会讲到
7 [DllImport( " user32.dll " )]
8 static extern int PostMessage(IntPtr hWnd, int msg, int wParam, int lParam);
9
10 public frmMain()
11 {
12 // 此处关闭窗口
13 Thread myThread = new Thread(new ThreadStart(this.KillDXThread));
14 myThread.Start();
15 // 关闭代码应该在初始化组件之前调用,否则会被DX截停.
16 InitializeComponent();
17 }
18
19 public void KillDXThread()
20 {
21 do
22 {
23 IntPtr dxWin = FindWindow(IntPtr.Zero, "Information");
24 if(dxWin != IntPtr.Zero)
25 {
26 PostMessage(dxWin, 0x10, 0, 0);
27 break;
28 }
29 } while (true);
30 ;
31 }
PostMessage第二个参数是消息,WM_CLOSE 是 0x10H.
运行程序,弹窗一闪而过,是不是很简单!(我用的是DX7.3.5版本.)