|
本帖最后由 differentrain 于 2014-6-20 16:05 编辑
' X. A1 d0 h% S' F: L5 X( F% I+ z" U+ G
不怎么用Office系列,今天偶然和朋友聊起来,突发奇想用Excel做了个扫雷的修改器....[em1127]& U j5 t- S/ e/ e2 M
虽然不会Excel,不过VB咱小时候还是学过的...[em1124]
6 \5 i H( e* I1 t- D5 |1 M$ V5 u& q/ d/ z8 y1 ^6 U
我用的Win7的扫雷,其他版本的估计不行..可以停止计时和在表格中现实地雷位置...
7 n7 A9 s+ K2 _" Q* ~附件就是那个表格...如果版本不对就直接看代码部分自己复制过去也行.. D7 [1 ^" d0 b/ J/ [
顺便说,VBA简直反人类..MS为什么不出VBA.NET啊...大段的代码要自己写,而且抽象性巨差....
. y" ?4 O! B+ w" v
4 Y9 X9 ]. x+ ^- w/ I- V( L* T
MineSweeperTrainer.rar
(22.27 KB, 下载次数: 6)
9 y) {) ^/ v+ p9 ], Q9 |( H
4 r2 J( s0 a V
' D t/ g( J. h. T; o( [# |0 w
$ B; i& A' e2 J1 {
+ f0 y7 Y6 g, q1 F1 q- 【控件】4 ^+ ^$ k% q7 R! f
- ?( N t. B8 u, O' t9 t
- 窗体:frmMain4 y- P, x* G& f' g& o$ c- i
- 按钮:btnCatchGame,btnRefresh
, l7 A% c6 d d9 T; z - 选择框:chkGameTime
复制代码 ) k' q. Z; `4 ~2 B- d0 R! N
$ _1 y1 }# F% e! s, B7 N3 E) i! R: a7 C! D
% i: S- v5 g4 P$ Y- 【代码】
' D$ x0 R0 P; B. X6 J3 K
6 v5 ?6 q3 g( B# F: c2 I8 e- 3 l$ _+ o& K8 D+ A; x) X
- Option Explicit
3 K" R3 [* M# S, D+ w - 6 B5 b' L8 F/ J& V, }6 H
/ l0 S* L O O' F d( S2 w- Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long4 r4 l3 \: S" B5 I
- Private Declare Function module32First Lib "kernel32" Alias "Module32First" (ByVal hSnapShot As Long, lppe As moduleENTRY32) As Long
7 D z* P4 ?6 J3 C8 P6 e - Private Declare Function module32Next Lib "kernel32" Alias "Module32Next" (ByVal hSnapShot As Long, lppe As moduleENTRY32) As Long( Y y& r- V, a' M: x
- Private Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, lppe As PROCESSENTRY32) As Long# U4 |" p* ?& G5 `, n0 N7 U! y
- Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, lppe As PROCESSENTRY32) As Long
}* ~* Y0 [: j# p0 y- r - Private Declare Function lstrcmpi Lib "kernel32" Alias "lstrcmpiA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long" M! v4 g/ z+ K) W% ~) i
- 5 D; J+ g7 X3 R1 J% C2 u
- 6 [- ~, O% z6 w7 `( @" a
- Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long( n' e6 l( z, i% p! z
- Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long. B% I' k1 |; i4 k/ I
- Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long: a9 c8 P" i- ]$ p$ O3 E* H, Z4 T) T
- Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long( P/ K% q8 L2 g/ ^
- a6 d1 Y" |! _) @, o" @0 V
8 w: U. E" i2 X2 w8 q5 {4 A- Private Const TH32CS_SNAPPROCESS = &H2
0 l! U1 p8 U- i+ G$ J, v. i - Private Const TH32CS_SNAPmodule = &H84 k* t6 l* Y6 Y) E! Z
- Private Const CB_SHOWDROPDOWN = &H157
4 _0 W0 `3 A6 y# Y - Private Type moduleENTRY32
: `, I3 `5 k; N - dwSize As Long
) z3 V# ^6 b1 g& [9 P9 b( O - th32ModuleID As Long3 x9 l; s* M. Y# o0 L7 C
- th32ProcessID As Long
0 G( g8 q/ p3 z - GlblcntUsage As Long
5 _4 n9 Y2 }! p, Q7 G* G }0 F - ProccntUsage As Long
o0 t* [ i" L: A T - modBaseAddr As Long
& V: f' n3 O5 B - modBaseSize As Long# _. D, l7 r) A) l1 D" B5 n' ]
- hModule As Long
i* O8 `% w: V - szModule As String * 256
6 A6 k- K0 p$ J* O6 z3 u; H& ]' U4 i - szExePath As String * 1024" y, F! I+ o9 k5 z: b; ~8 i
- End Type- b% ^1 y4 P; s% X9 W6 `
J& [/ n$ k L" S$ Q- Private Type PROCESSENTRY32! d0 }( n# {# q; M$ U
- dwSize As Long
8 o* B8 ]' t* @; A4 {6 g# Q/ @ - cntUsage As Long. i' K6 g! @) |5 M J
- th32ProcessID As Long$ ~7 L( }8 e! {4 ~2 ]
- th32DefaultHeapID As Long; `, }# }7 Y0 |7 j9 j3 s
- th32ModuleID As Long
- S$ |7 W0 G1 k; H$ B - cntThreads As Long7 K* u+ x6 D' T7 }
- th32ParentProcessID As Long
3 @" o: {; G/ d- n" \0 T - pcPriClassBase As Long& u/ w' i! Y w% K
- dwFlags As Long1 i7 T- @" w* l' Y/ b4 n; J* d( r9 |
- szExeFile As String * 1024" F- O4 t/ V( Y
- End Type1 B: L* Y$ Y. p7 B
5 R8 S0 J3 S! E/ v4 Z. {- - O# a1 h% S8 y5 b. R q
- 9 G2 w1 ]" h9 C3 n0 P0 a
- Private Const PROCESS_ALL_ACCESS = &H1F0FFF1 S D# A- j. A0 ~- ]
- Private hProcess As Long
# Y, _, N9 M- h6 c7 J. _ - Private PID As Long
9 B3 l# S' r5 r9 u. L- w! N8 o - 9 X( Q" `9 ~# Q( p: d
@( m$ R9 z8 W- [8 Y% f; P* W& q- Private Type asmNum
- ^% @/ _# f1 V& T t% ~7 s% R - nuM1 As Byte8 ^% {+ h$ Z5 b+ }" n# y& r+ J' d
- nuM2 As Byte/ P u! q$ I3 R: P
- nuM3 As Byte9 I$ B- H1 V3 F$ j7 B7 u
- End Type' H" l4 e% x1 [. t) I3 E( v6 Q
- 1 S4 D" F% d! {
- Private adrTime As Long
; w4 u% h E6 z- N! t - Private adrMine As Long( s( f7 n0 u. m
- % ?, J% i& a! ^) Q0 D' w9 r
- Private Function GetProcIdByName(ByVal ProcName As String) As Long
9 e: F. L5 b# K% {8 \) o - Dim PE32 As PROCESSENTRY32% `* g, P2 W* N2 P l
- Dim Procid As Long
2 O2 D2 n0 y7 V" o& k0 Q9 i - Dim hSnapShot As Long
5 Y5 @6 g3 ^% f" [$ @+ }6 d - hSnapShot = CreateToolhelp32Snapshot(ByVal TH32CS_SNAPPROCESS, ByVal 0)
6 U9 X$ w" ]6 }4 ^ - PE32.dwSize = LenB(PE32)
9 ?2 A) ]( L% l - Process32First hSnapShot, PE32
1 f8 T; K1 J, A \: B$ f( h - Do
; K2 h9 I+ y. B% Y$ M - If lstrcmpi(Trim$(ProcName), Trim$(PE32.szExeFile)) = 0 Then
) V$ B- t" |" h, E - Procid = PE32.th32ProcessID1 Q3 C7 i3 {& j; \& ]9 ~; R* c$ c
- Exit Do% P. v4 s. C& |
- End If1 H$ y: U# {* t6 T4 t3 S+ L
- PE32.szExeFile = vbNullString7 i0 u7 C/ _; k% ~* e1 |
- Loop Until Process32Next(hSnapShot, PE32) = 0
* I- \% D( f4 V, ?# u- R X' B( ? - CloseHandle hSnapShot
9 Z9 X. p2 N. b) t: L# F - GetProcIdByName = Procid- B, `: }6 M4 c0 o6 ?/ t
- End Function0 S$ J! U) m$ V6 X* {
- & J. w6 }3 _0 n. q: j' Q- b& Q- c8 I
- ; K3 T7 }0 A9 @8 i1 t
! h( a7 s- ]4 h: X6 Q5 y- Private Function GetModuleBaseByProcName(ByVal ModuleName As String) As Long
1 G# a4 ~- ]# J# f
" l* \, W9 q: o: ?0 o! ]* ~6 f- Dim ME32 As moduleENTRY32, ModuleBase As Long4 O( @2 `$ v' Z
- Dim hSnapShot As Long
# ^; o7 E, [: v% G' c1 F - hSnapShot = CreateToolhelp32Snapshot(ByVal TH32CS_SNAPmodule, ByVal PID)
/ R. @/ h! O0 I* w7 a O2 Q - ME32.dwSize = LenB(ME32)
* t t- L8 |' J4 w: n1 U* ? - module32First hSnapShot, ME32- z8 v% F. E- Q$ j6 Y1 F8 i
- 9 v G2 W& V8 i1 N5 @
- Do* u" r) M$ f0 h2 }" ^ Z/ z4 T+ K
-
" Z% A6 w" l6 k2 Z. N! g( p2 T5 d - If lstrcmpi(Trim$(ModuleName), Trim$(ME32.szModule)) = 0 Then
) X7 H* X( K$ f+ [+ j, X2 @ - ModuleBase = ME32.modBaseAddr8 k/ m9 ^+ L7 t1 b
- Exit Do; w3 s, q3 ^( o
- End If
7 n! f9 L7 X0 M7 Q: ^3 e4 \ - 1 R# K& ^4 ]& t; t
- ME32.szModule = vbNullString
6 @) T* k" R7 G0 J3 ^4 w1 x -
0 k- } B3 p/ R - Loop Until module32Next(hSnapShot, ME32) = 02 p0 ?, {3 `5 N( n+ V
- CloseHandle hSnapShot
1 z( |# H2 ^5 F7 K! Z- c - GetModuleBaseByProcName = ModuleBase
6 D+ { `: `$ G0 G6 C) F2 B9 ` - - x8 Y' S" D3 ^, Y& G* i. F
- End Function
" P4 ]% V, V0 e7 w
+ |+ @. y7 s, I) C! C
* J O+ H" v0 C' E- Private Function GetMemory(ByVal Adderss As Long, Optional Length As Byte = 4) As Long# |" d' t' f! a" q# M) `
- ReadProcessMemory hProcess, Adderss, GetMemory, Length, 0 {' ~5 l/ `/ g# b! K
- End Function
) a9 f. {( c4 Z5 U - Private Sub SetMemoryAsm(ByVal Adderss As Long, NumVal As asmNum)
1 Q4 C$ f$ z) H# O8 U" r - WriteProcessMemory hProcess, Adderss, NumVal, 3, 0
' Y3 }: K! x+ \) ? - End Sub/ u( u/ P( e$ ~+ b) l3 U7 c
* m6 e7 j# F1 g2 g
, T9 T% N8 r, A; p1 O- Private Function FindGame() As Boolean6 t% F; c# C- o9 B
- ) A5 H* F, | a2 m
- PID = GetProcIdByName("MineSweeper.exe")
2 j# w* G8 j: ] -
* U6 K' e/ b4 r8 G& g* H - Select Case PID& s" e$ T* R# @, z% }% w
- Case 0: n9 B7 _7 r- C9 E7 z; a# [
- FindGame = False0 b3 M) X2 ?) J8 W0 W4 M. D1 T
- Case Else3 Y/ W% y' N+ y- k8 |$ z4 H
- Dim adrBase As Long
9 W# D+ P! [5 j" {9 D - adrBase = GetModuleBaseByProcName("MineSweeper.exe")+ O t( K" k3 i4 ] v
- adrTime = adrBase + &H21446
x3 }. ]5 \* M; o3 R - adrMine = adrBase + &H868B4% n7 r! I$ U$ w& H4 R/ ], v
- FindGame = True
8 ]) e" v9 h* G - End Select6 X2 q: D" ?! f) C) H0 t
- End Function
9 O: d4 z) W( D0 q% c9 U. u
( r# B; w) w- q7 o0 I. w D7 b- Private Sub TrainerState(ByVal State As Boolean)( L1 }$ D7 S* X/ Z: p
- chkGameTime.Enabled = State4 I4 [# G, R1 @# D& b2 v% {
- btnRefresh.Enabled = State' R) \+ m9 L0 w& u. R+ {
- Select Case State3 f# Z* s+ M# d) a2 z
- Case True
1 a+ L ]0 N. b4 Y7 S3 T - btnCatchGame.Caption = "ReleaseGame", E& L( z! o6 v6 Y" `2 L: T
- Case False& J4 M' K/ y' a$ @$ `
- btnCatchGame.Caption = "CatchGame"5 z2 F$ u% v- N, O
- chkGameTime.Value = False
% J( l) V! m; h1 A' C5 Y3 K! N# [. L - End Select5 n+ w; X. T) z7 }/ l2 a, q
- End Sub+ i5 a4 f! K0 n: X
- 7 }' A! i/ {6 s! F# I
7 a& m9 N# \1 \' G1 Q- Private Sub AsmState(ByVal State As Boolean)
8 D0 O3 {3 T0 Q2 z+ e - Dim asm As asmNum& Y( B! X; T; M, j8 U
- Select Case State
7 Y* z5 A2 z# r. I. V) O8 U0 F - Case True8 v) S8 J9 s! f& O
- asm.nuM1 = &H90
8 E% y) o- }) L7 h/ F, S( ~ - asm.nuM2 = &H90
* _! {' A; \, L E, o9 T - asm.nuM3 = &H904 U" h$ M7 ~$ \: f" t) W
- Case False% E# E2 W, F# }" ^, t4 z
- asm.nuM1 = &HD9
! X) I. b! j. M; y" O$ r' D: s' w/ V - asm.nuM2 = &H58
E" Q( t/ t; w; L* C# X2 O" L - asm.nuM3 = &H1C& X7 p$ C/ |0 y3 {* P7 n; A
- End Select' G& X" x7 y; v1 B4 J. ]7 c+ F* X
- Call SetMemoryAsm(adrTime, asm)
/ R$ D ]+ v* J5 h( i2 x0 _ - End Sub8 V, J/ u+ q; B+ S) @9 M/ k D
- - T7 }/ H J9 R3 G2 d' K% F
- / F) `, `4 y, k8 D9 n( }
- Private Sub chkGameTime_Click()
6 G+ l* ~* q% n' z2 ^2 z - AsmState (chkGameTime.Value)& F- D( a q6 v( P* K
- End Sub+ L1 t. f$ ]. S! l4 c, Y
- & ]8 [6 x( ~3 q$ r2 v
0 O3 \; u; u8 ~: P) B) E0 b6 h- Private Sub isOpen(ByVal State As Boolean): U' |! O. |: N8 X9 T
- Select Case State
Q4 i( ^ G4 j2 [ - Case True
; _4 x: e4 f4 j+ r" ^& t# M* r - If FindGame = True Then( V+ p2 K4 K- u9 v# U
- hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, PID)5 b* ~! z$ _! O' V4 ~% E
- TrainerState (True); h' J0 J1 o% v: G( h2 t5 F
- End If
- k2 V" ^! ~: l - Case False
) y9 |2 ] ^: e# y2 N( G - If FindGame = True Then
' U# m; x l9 a7 o - AsmState (False)
! b/ {, e; g6 w% a1 I2 g, D2 Y6 t& S - CloseHandle hProcess$ ~7 P$ i) C: J/ x( R& w
- End If$ f1 N, G! B* R
- End Select
2 X X6 B7 B# o! d8 b - End Sub( S$ t m0 F1 f" O$ l( j
, K% p( N) s" x2 d- 1 e+ [$ T3 n5 K
- Private Sub btnCatchGame_Click()* D; U _' i) G
- Select Case btnCatchGame.Caption
) y! r4 t. w) Z3 k; B v1 ~ - Case "CatchGame"% _3 @8 ^1 m* b5 I8 K- {
- isOpen (True); a$ S- o5 x a- ]
- Case "ReleaseGame"
5 P) f& Y: W; E! g% ?5 z( U9 C - isOpen (False)/ s/ P: Y- \5 u6 X+ o3 \7 m: U$ v7 Y
- TrainerState (False)
- c7 h" n* k" ~- [# I# Z( Y3 r - End Select4 w! `6 f. T n) V
- End Sub
& G/ e! S7 T% g _
) i0 D0 l0 M7 R! b6 y- v- Private Sub btnRefresh_Click()
* [: J) L7 J5 G$ F! ? - 4 Q" _& Y* ~: m: N6 l9 V
- Dim mineColumn As Byte, mineLine As Byte
& X f3 w- X" p - Dim adrPoint As Long, adrTemp As Long, adrColumn As Long
/ D9 Z" {2 G; @ - Dim i As Byte, j As Byte
5 A8 Q, \- }; ]/ h) K. v! g - # h+ j1 }* _. M+ `
-
9 K2 P( f- m- E* W! U' \) x. D% V" X# q5 D - k6 D( X+ D& Q; O7 N1 p# f
- btnRefresh.Enabled = False3 M4 S5 K5 j& B; Q
-
) U8 Z3 o9 l! e - adrTemp = GetMemory(adrMine)
6 e1 }9 D6 M- }, J - adrPoint = GetMemory(adrTemp + &H10)
9 Q! F: Z# s. P7 f% b! m' i -
! F# U: Z) {4 N* i- O - mineLine = GetMemory(adrPoint + &H8) - 1( N1 L4 c! L! W
- mineColumn = GetMemory(adrPoint + &HC) - 1/ V% b, c/ X* |; N) E* l
-
, d' M8 G5 w- X - adrPoint = GetMemory(adrPoint + &H44)
B" ? b& H- f' u7 m - adrPoint = GetMemory(adrPoint + &HC)6 ^5 B1 ^0 U2 Q' Z) T& K* R. B P
- : t: p& C" C5 e6 ~1 L+ J0 x8 n, d4 q
-
/ H2 X) z+ _" |( ?% W D H -
. I' m2 r# b) ?, z6 H% Z - For i = 0 To 30, q) p1 p5 V- N' n
- adrColumn = GetMemory(adrPoint + i * 4)
5 H, c" Z- j9 B" I - adrColumn = GetMemory(adrColumn + &HC)
8 g% b/ [1 I6 |/ U$ h( D - For j = 0 To 23
8 x; T- r% J0 l; g! m1 n( T3 E - If i > mineColumn Or j > mineLine Then
2 _1 `( E" x) F+ v - Sheet1.Cells(j + 1, i + 1) = ""
4 \( z% ?1 |4 w* t; u( d - Else' m E4 N! Y. p
- Sheet1.Cells(j + 1, i + 1) = GetMemory(adrColumn + j, 1)6 n( Y1 Q3 W5 D% B- P, Y
- End If& r2 z$ y+ z! m _" \& R9 t( R) o
- Next j/ I; Z) Y6 C: [3 x' K, j
- Next i: q5 x, m- b7 \ O
- btnRefresh.Enabled = True+ L3 }0 I$ J0 S# C5 J8 t
- 2 @+ z. M: E2 O7 Y7 S
- . o5 E& i# ]5 g6 K2 S* f4 P* v
- End Sub
7 Y7 E Z% [# m7 T2 c2 H - 3 O) n3 u8 \1 _
- Private Sub UserForm_Initialize()
2 W& |2 H% o5 J% G - TrainerState (False); l& G, [9 L/ A! y& s- H% K
- Sheet1.Cells(1, 2) = 1
3 O J: \$ d. H7 l, h - End Sub7 y' O4 o# j P) N- |0 p
) {5 u. }8 Q# p( i, H% ~9 r- Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
' v, h( e8 G9 i8 {. P+ h' ^5 B* ] - isOpen (False)
1 Y! ~/ ?: y* z9 N. ~7 x - End Sub7 Z7 a2 h+ i- \, i
复制代码 ) O9 _: {/ J( Z$ x& `5 [! Q3 t
3 J' m" G8 [2 a8 e3 t
' C) ]6 }& U; p
& l& K/ u% | t( d |
|