转自http://www.yitian130.com/article.asp?id=19&page=3
XDF.GamePlugInCommon 类库项目
1
//
API.cs 文件,定义一些常用API函数及常量
2
3
using
System;
4
using
System.IO;
5
using
System.Threading;
6
using
System.Diagnostics;
7
using
System.Runtime.InteropServices;
8
9
namespace
XDF.GamePlugInCommon
10
{
11
/**/
///
<summary>
12
///
API 的摘要说明。
13
///
</summary>
14
public
sealed
class
API
15
{
16
public
static
int
WM_KEYDOWN
=
0x0100
;
17
public
static
int
WM_KEYUP
=
0x0101
;
18
public
static
int
WM_SYSKEYDOWN
=
0x0104
;
19
public
static
int
WM_SYSKEYUP
=
0x0105
;
20
21
public
static
int
WM_MOUSEMOVE
=
0x0200
;
22
public
static
int
WM_LBUTTONDOWN
=
0x0201
;
23
public
static
int
WM_LBUTTONUP
=
0x0202
;
24
public
static
int
WM_LBUTTONDBLCLK
=
0x0203
;
25
public
static
int
WM_RBUTTONDOWN
=
0x0204
;
26
public
static
int
WM_RBUTTONUP
=
0x0205
;
27
public
static
int
WM_RBUTTONDBLCLK
=
0x0206
;
28
public
static
int
WM_USER
=
0x0400
;
29
30
public
static
int
MK_LBUTTON
=
0x0001
;
31
public
static
int
MK_RBUTTON
=
0x0002
;
32
public
static
int
MK_SHIFT
=
0x0004
;
33
public
static
int
MK_CONTROL
=
0x0008
;
34
public
static
int
MK_MBUTTON
=
0x0010
;
35
36
public
static
int
MK_XBUTTON1
=
0x0020
;
37
public
static
int
MK_XBUTTON2
=
0x0040
;
38
39
[DllImport(
"
user32.dll
"
)]
40
public
static
extern
int
SendMessage(IntPtr hWnd,
int
Msg,
int
wParam,
int
lParam);
41
42
//
此处主要用来让窗口置于最前(SetWindowPos(this.Handle,-1,0,0,0,0,0x4000|0x0001|0x0002);)
43
[System.Runtime.InteropServices.DllImport(
"
user32.dll
"
)]
44
public
static
extern
bool
SetWindowPos(IntPtr hWnd,
45
int
hWndInsertAfter,
46
int
X,
47
int
Y,
48
int
cx,
49
int
cy,
50
int
uFlags
51
);
52
53
/**/
///
<summary>
54
///
窗口置前
55
///
</summary>
56
///
<param name="hWnd"></param>
57
public
static
void
SetWindowPos(IntPtr hWnd)
58
{
59
SetWindowPos(hWnd,
-
1
,
0
,
0
,
0
,
0
,
0x4000
|
0x0001
|
0x0002
);
60
}
61
62
/**/
///
<summary>
63
///
64
///
</summary>
65
///
<param name="processName"></param>
66
///
<returns></returns>
67
public
static
Process GetGameProcess(
string
processName)
68
{
69
Process pro
=
null
;
70
Process[] pros
=
Process.GetProcessesByName(processName);
71
if
(pros.Length
>
0
)
72
{
73
pro
=
pros[
0
];
74
}
75
return
pro;
76
}
77
}
78
}
79
80
项目(应用程序)
81
XDF.TantraPlugIn
82
//
ControlItem.cs
83
using
System;
84
using
System.IO;
85
using
System.Xml.Serialization;
86
87
namespace
XDF.TantraPlugIn
88
{
89
/**/
///
<summary>
90
///
ControlItem 的摘要说明。
91
///
</summary>
92
[Serializable]
93
public
sealed
class
ControlItem
94
{
95
private
string
m_Name
=
""
;
96
public
string
Name
97
{
98
get
99
{
100
return
this
.m_Name;
101
}
102
set
103
{
104
this
.m_Name
=
value;
105
}
106
}
107
private
char
m_KeyChar
=
'
a
'
;
108
public
char
KeyChar
109
{
110
get
111
{
112
return
this
.m_KeyChar;
113
}
114
set
115
{
116
this
.m_KeyChar
=
value;
117
}
118
}
119
private
int
m_DelayTime
=
100
;
120
public
int
DelayTime
121
{
122
get
123
{
124
return
this
.m_DelayTime;
125
}
126
set
127
{
128
this
.m_DelayTime
=
value;
129
}
130
}
131
public
ControlItem()
132
{
133
134
}
135
}
136
[Serializable]
137
public
sealed
class
ControlItemCollection : System.Collections.CollectionBase
138
{
139
public
ControlItem
this
[
int
index]
140
{
141
get
142
{
143
return
(ControlItem)List[index];
144
}
145
set
146
{
147
List[index]
=
value;
148
}
149
}
150
public
ControlItemCollection()
151
{
152
}
153
public
int
Add(ControlItem item)
154
{
155
return
List.Add(item);
156
}
157
public
void
Remove(ControlItem item)
158
{
159
List.Remove(item);
160
}
161
}
162
}
163
164
//
TantraConfig.cs
165
using
System;
166
using
System.IO;
167
using
System.Xml.Serialization;
168
169
namespace
XDF.TantraPlugIn
170
{
171
/**/
///
<summary>
172
///
TantraConfig 的摘要说明。
173
///
</summary>
174
[Serializable]
175
public
class
TantraConfig
176
{
177
private
ControlItemCollection m_KillControls
=
new
ControlItemCollection();
178
public
ControlItemCollection KillControls
179
{
180
get
181
{
182
return
this
.m_KillControls;
183
}
184
set
185
{
186
this
.m_KillControls
=
value;
187
}
188
}
189
private
ControlItemCollection m_BloodControls
=
new
ControlItemCollection();
190
public
ControlItemCollection BloodControls
191
{
192
get
193
{
194
return
this
.m_BloodControls;
195
}
196
set
197
{
198
this
.m_BloodControls
=
value;
199
}
200
}
201
202
private
int
m_BloodRate
=
25
;
203
204
public
int
BloodRate
205
{
206
get
207
{
208
return
this
.m_BloodRate;
209
}
210
set
211
{
212
this
.m_BloodRate
=
value;
213
}
214
}
215
216
private
string
m_ProcessName
=
"
HTLauncher
"
;
217
218
public
string
ProcessName
219
{
220
get
221
{
222
return
this
.m_ProcessName;
223
}
224
set
225
{
226
this
.m_ProcessName
=
value;
227
}
228
}
229
230
public
TantraConfig()
231
{
232
233
}
234
235
public
bool
Save(
string
file)
236
{
237
bool
result
=
false
;
238
try
239
{
240
FileStream fs
=
new
FileStream(file,FileMode.Create,FileAccess.Write);
241
XmlSerializer xsl
=
new
XmlSerializer(
this
.GetType());
242
xsl.Serialize(fs,
this
);
243
fs.Close();
244
result
=
true
;
245
}
246
catch
247
{
248
result
=
false
;
249
}
250
return
result;
251
}
252
public
static
TantraConfig LoadFromFile(
string
file)
253
{
254
TantraConfig config
=
null
;
255
try
256
{
257
FileStream fs
=
new
FileStream(file,FileMode.Open,FileAccess.Read);
258
XmlSerializer xsl
=
new
XmlSerializer(
typeof
(TantraConfig));
259
config
=
(TantraConfig)xsl.Deserialize(fs);
260
fs.Close();
261
}
262
catch
263
{
264
265
}
266
return
config;
267
}
268
}
269
}
270
271
272
//
Frmmain.cs
273
using
System;
274
using
System.Drawing;
275
using
System.Collections;
276
using
System.ComponentModel;
277
using
System.Windows.Forms;
278
using
System.Data;
279
using
System.Threading;
280
281
using
XDF.GamePlugInCommon;
282
283
namespace
XDF.TantraPlugIn
284
{
285
/**/
///
<summary>
286
///
Form1 的摘要说明。
287
///
</summary>
288
public
class
Frmmain : System.Windows.Forms.Form
289
{
290
private
System.Windows.Forms.Button btnSetup;
291
private
System.Windows.Forms.Timer timerMain;
292
private
System.Windows.Forms.Button btnStart;
293
private
System.ComponentModel.IContainer components;
294
295
public
Frmmain()
296
{
297
//
298
//
Windows 窗体设计器支持所必需的
299
//
300
InitializeComponent();
301
302
303
this
.Closing
+=
new
CancelEventHandler(Frmmain_Closing);
304
}
305
306
/**/
///
<summary>
307
///
清理所有正在使用的资源。
308
///
</summary>
309
protected
override
void
Dispose(
bool
disposing )
310
{
311
if
( disposing )
312
{
313
if
(components
!=
null
)
314
{
315
components.Dispose();
316
}
317
}
318
base
.Dispose( disposing );
319
}
320
321
Windows 窗体设计器生成的代码
#region
Windows 窗体设计器生成的代码
322
/**/
///
<summary>
323
///
设计器支持所需的方法 - 不要使用代码编辑器修改
324
///
此方法的内容。
325
///
</summary>
326
private
void
InitializeComponent()
327
{
328
this
.components
=
new
System.ComponentModel.Container();
329
System.Resources.ResourceManager resources
=
new
System.Resources.ResourceManager(
typeof
(Frmmain));
330
this
.btnStart
=
new
System.Windows.Forms.Button();
331
this
.btnSetup
=
new
System.Windows.Forms.Button();
332
this
.timerMain
=
new
System.Windows.Forms.Timer(
this
.components);
333
this
.SuspendLayout();
334
//
335
//
btnStart
336
//
337
this
.btnStart.Location
=
new
System.Drawing.Point(
8
,
16
);
338
this
.btnStart.Name
=
"
btnStart
"
;
339
this
.btnStart.Size
=
new
System.Drawing.Size(
65
,
22
);
340
this
.btnStart.TabIndex
=
0
;
341
this
.btnStart.Text
=
"
开始(&S)
"
;
342
this
.btnStart.Click
+=
new
System.EventHandler(
this
.btnStart_Click);
343
//
344
//
btnSetup
345
//
346
this
.btnSetup.Location
=
new
System.Drawing.Point(
152
,
16
);
347
this
.btnSetup.Name
=
"
btnSetup
"
;
348
this
.btnSetup.Size
=
new
System.Drawing.Size(
65
,
22
);
349
this
.btnSetup.TabIndex
=
1
;
350
this
.btnSetup.Text
=
"
设置(&C)
"
;
351
this
.btnSetup.Click
+=
new
System.EventHandler(
this
.btnSetup_Click);
352
//
353
//
Frmmain
354
//
355
this
.AutoScaleBaseSize
=
new
System.Drawing.Size(
6
,
14
);
356
this
.ClientSize
=
new
System.Drawing.Size(
226
,
55
);
357
this
.Controls.Add(
this
.btnSetup);
358
this
.Controls.Add(
this
.btnStart);
359
this
.FormBorderStyle
=
System.Windows.Forms.FormBorderStyle.FixedDialog;
360
this
.Icon
=
((System.Drawing.Icon)(resources.GetObject(
"
$this.Icon
"
)));
361
this
.MaximizeBox
=
false
;
362
this
.MinimizeBox
=
false
;
363
this
.Name
=
"
Frmmain
"
;
364
this
.StartPosition
=
System.Windows.Forms.FormStartPosition.CenterScreen;
365
this
.Text
=
"
Tantra PlugIn beta1
"
;
366
this
.ResumeLayout(
false
);
367
368
}
369
#endregion
370
371
/**/
///
<summary>
372
///
应用程序的主入口点。
373
///
</summary>
374
[STAThread]
375
static
void
Main()
376
{
377
Application.Run(
new
Frmmain());
378
}
379
380
private
TantraConfig m_TantraConfig
=
null
;
381
private
Thread m_Thread
=
null
;
382
private
bool
m_Stop
=
true
;
383
private
IntPtr m_GameMainWindowHandle
=
IntPtr.Zero;
384
385
private
void
btnSetup_Click(
object
sender, System.EventArgs e)
386
{
387
TantraConfig config
=
new
TantraConfig();
388
389
ControlItemCollection items
=
config.KillControls;
390
391
ControlItem item_e
=
new
ControlItem();
392
item_e.DelayTime
=
50
;
393
item_e.KeyChar
=
'
E
'
;
394
item_e.Name
=
"
选择最近的攻击目标
"
;
395
items.Add(item_e);
396
397
ControlItem item_r
=
new
ControlItem();
398
item_r.DelayTime
=
6000
;
399
item_r.KeyChar
=
'
R
'
;
400
item_r.Name
=
"
攻击选定的目标
"
;
401
items.Add(item_r);
402
403
ControlItem item_f
=
new
ControlItem();
404
item_f.DelayTime
=
500
;
405
item_f.KeyChar
=
'
F
'
;
406
item_f.Name
=
"
捡起打完怪物掉下的物品
"
;
407
items.Add(item_f);
408
409
ControlItem item_f2
=
new
ControlItem();
410
item_f2.DelayTime
=
500
;
411
item_f2.KeyChar
=
'
F
'
;
412
item_f2.Name
=
"
捡起打完怪物掉下的金币
"
;
413
items.Add(item_f2);
414
415
ControlItem item_blood
=
new
ControlItem();
416
item_blood.DelayTime
=
1000
;
417
item_blood.KeyChar
=
'
1
'
;
418
item_blood.Name
=
"
自动增加体能秘技
"
;
419
config.BloodControls.Add(item_blood);
420
421
config.Save(
"
c:\\tantra.xml
"
);
422
423
}
424
425
private
void
btnStart_Click(
object
sender, System.EventArgs e)
426
{
427
if
(
this
.m_Stop)
428
{
429
this
.StartControl();
430
}
431
else
432
{
433
this
.StopControl();
434
}
435
this
.btnStart.Text
=
(
this
.m_Stop)
?
"
开始(&S)
"
:
"
停止(&S)
"
;
436
}
437
438
private
void
StartControl()
439
{
440
string
file
=
Environment.CurrentDirectory
+
"
\\tantra.xml
"
;
441
this
.m_TantraConfig
=
TantraConfig.LoadFromFile(file);
442
if
(
this
.m_TantraConfig
==
null
)
443
{
444
MessageBox.Show(
"
配置文件未找到,无法启动!
"
);
445
return
;
446
}
447
448
//
HTLauncher
449
//
string proname = "TantraPlugIn";
450
System.Diagnostics.Process pro
=
API.GetGameProcess(
this
.m_TantraConfig.ProcessName);
451
if
(pro
==
null
)
452
{
453
MessageBox.Show(
"
游戏进程
"
+
this
.m_TantraConfig.ProcessName
+
"
未找到,无法启动!
"
);
454
return
;
455
}
456
this
.m_GameMainWindowHandle
=
pro.MainWindowHandle;
457
this
.Text
=
"
Game name:
"
+
pro.ProcessName;
458
459
460
this
.m_Stop
=
false
;
461
this
.m_Thread
=
new
Thread(
462
new
ThreadStart(TantraControl));
463
464
this
.m_Thread.Start();
465
}
466
467
private
void
StopControl()
468
{
469
if
(
this
.m_Thread
!=
null
)
470
{
471
this
.m_Stop
=
true
;
472
this
.m_Thread.Abort();
473
}
474
}
475
476
private
void
TantraControl()
477
{
478
int
count
=
0
;
479
while
(
!
this
.m_Stop)
480
{
481
for
(
int
i
=
0
;i
<
this
.m_TantraConfig.KillControls.Count;i
++
)
482
{
483
API.SendMessage(
this
.m_GameMainWindowHandle,API.WM_KEYDOWN,
484
Convert.ToInt32(
this
.m_TantraConfig.KillControls[i].KeyChar),
0
);
485
Thread.Sleep(
this
.m_TantraConfig.KillControls[i].DelayTime);
486
}
487
count
++
;
488
if
(count
>=
this
.m_TantraConfig.BloodRate)
489
{
490
count
=
0
;
491
for
(
int
i
=
0
;i
<
this
.m_TantraConfig.BloodControls.Count;i
++
)
492
{
493
API.SendMessage(
this
.m_GameMainWindowHandle,API.WM_KEYDOWN,
494
Convert.ToInt32(
this
.m_TantraConfig.BloodControls[i].KeyChar),
0
);
495
Thread.Sleep(
this
.m_TantraConfig.BloodControls[i].DelayTime);
496
}
497
}
498
}
499
}
500
501
protected
override
void
WndProc(
ref
Message m)
502
{
503
base
.WndProc (
ref
m);
504
if
(m.Msg
==
API.WM_KEYDOWN)
505
{
506
this
.Text
=
m.WParam.ToInt32().ToString();
507
if
(
this
.Text
==
"
1
"
)
508
{
509
MessageBox.Show(
"
blood
"
);
510
}
511
}
512
}
513
514
private
void
Frmmain_Closing(
object
sender, CancelEventArgs e)
515
{
516
try
517
{
518
this
.StopControl();
519
}
520
catch
521
{
522
}
523
}
524
525
}
526
}
以上是全部代码
设置功能未完善,可以通过手动修改XML配置文件实现其他类似游戏的外挂
附带典型(12级)外挂配置,配置文件随着各人级别不同和技能不同自己做修改。