|
本帖最后由 differentrain 于 2014-6-20 16:05 编辑
9 `1 ^3 i8 w( O
! u! M3 D& V4 m不怎么用Office系列,今天偶然和朋友聊起来,突发奇想用Excel做了个扫雷的修改器....[em1127]( h; n# c6 `8 d
虽然不会Excel,不过VB咱小时候还是学过的...[em1124]3 N% E- l# v" m7 n- [1 U9 @( B( q
3 q( f( [9 y: o
我用的Win7的扫雷,其他版本的估计不行..可以停止计时和在表格中现实地雷位置...
3 c. D3 x( Z3 x4 I( {附件就是那个表格...如果版本不对就直接看代码部分自己复制过去也行..4 U) q9 S" N1 u* I
顺便说,VBA简直反人类..MS为什么不出VBA.NET啊...大段的代码要自己写,而且抽象性巨差....
, L7 h5 f& f' C1 B5 N& M! @' f4 f5 U9 @2 {* w) Z0 @. t/ A+ W" Z
MineSweeperTrainer.rar
(22.27 KB, 下载次数: 6)
2 L9 d. m* b$ } \7 M. p; V% d
2 |! v7 g8 U0 X. \3 l+ S2 t4 f
; j& q3 J4 ]! d9 R& ?
e; r& }5 p; s4 v& s
' \* R5 ^4 S! s
- 【控件】/ O+ N U. G1 q" d' Q6 ~( _
- 3 X; m" U1 _/ O3 q0 }& d4 h5 e
- 窗体:frmMain7 C5 J. D! T' ?2 {0 H6 Y1 }' q5 i* v# A
- 按钮:btnCatchGame,btnRefresh8 x- ]0 P: h: ]) h1 Q. B" j
- 选择框:chkGameTime
复制代码 9 z" o% O; @+ ^/ K9 M7 i; _
9 u7 l' a$ F. h% ]4 u* I& f! {
- Z$ S* e+ {6 p* D, t+ z- i0 g
& ]! |8 N; I/ M- 【代码】+ j0 [$ @4 F- }) s0 ]1 D
- 2 g1 z' I! E/ I. U5 l
- % E$ Q* d i9 Y7 K* y
- Option Explicit
! s3 r% [) L( ^' Y6 J6 a3 l, Q - 5 r6 a- N9 T# x# A
3 u# w+ ^- g; j1 T" N4 d" p1 O- Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long+ z( d- X6 t D# K" l, b; ]
- Private Declare Function module32First Lib "kernel32" Alias "Module32First" (ByVal hSnapShot As Long, lppe As moduleENTRY32) As Long' ?! Q, O$ W2 h" F
- Private Declare Function module32Next Lib "kernel32" Alias "Module32Next" (ByVal hSnapShot As Long, lppe As moduleENTRY32) As Long5 V4 l' R8 z9 ?+ }, G+ b! n2 Q
- Private Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, lppe As PROCESSENTRY32) As Long
1 v5 M( f5 P4 Z) I" b - Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, lppe As PROCESSENTRY32) As Long
& J' M. B2 W: N7 i - Private Declare Function lstrcmpi Lib "kernel32" Alias "lstrcmpiA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long& M8 O3 P- ^3 k% j [
- ) \* U* u# n7 _0 t. t- D
- * q$ f1 X6 F( ^ S# ^+ b# l! p
- Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long; W- [$ L' j/ l5 p
- 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 O; Z2 u) ]4 B" L: ~: c- l
- 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: D% b0 K9 ?( @2 [- j
- Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
; T7 Q1 P: w Q+ N ~, M/ Z
. v3 Z$ J2 T* {
& Q0 H' A) K c; c- Private Const TH32CS_SNAPPROCESS = &H2+ X# e5 z; z0 p0 N( k& q* u0 t4 X
- Private Const TH32CS_SNAPmodule = &H8( e# e' C1 w Y6 ~
- Private Const CB_SHOWDROPDOWN = &H157: {) V7 R0 y( x; e% B; V
- Private Type moduleENTRY32
% D g6 e" j) F0 r - dwSize As Long9 r) Q0 A# x3 F
- th32ModuleID As Long
, r0 i: U! M2 e, V - th32ProcessID As Long
$ ]9 @: a& @. r. J - GlblcntUsage As Long3 J( f( V& G& W' @8 p9 Z% K; y
- ProccntUsage As Long
! W. a7 q" a s' M. m - modBaseAddr As Long' @4 R. F4 m0 `% l1 O& }
- modBaseSize As Long$ A$ @2 q% D3 O
- hModule As Long" p m F& n E u
- szModule As String * 256
c0 A- ?$ w$ P. x - szExePath As String * 10245 b$ j& ?5 D* v: }/ z9 ]
- End Type
9 x4 H* o- C2 @; j7 r. F5 ? - : d0 @! B E7 Z: d8 H/ i V ~# x
- Private Type PROCESSENTRY32
/ {$ d, K1 U6 i; Q" ~& M m - dwSize As Long1 O7 Q4 O1 q8 [& X- Z' m
- cntUsage As Long
k4 M. b6 C) Z$ m* d( H3 _5 j - th32ProcessID As Long
* _5 p6 S- S; w# g1 T - th32DefaultHeapID As Long
* f( D: k5 l0 r4 Q, Y* J - th32ModuleID As Long
, t6 A# C& B2 Y" a9 m/ p; l p - cntThreads As Long- Q" X7 h- {* {8 u5 P R1 D& }( Q
- th32ParentProcessID As Long- b/ F2 f1 ~. b/ F
- pcPriClassBase As Long
6 f- Z( ]4 ^ Q7 Z* @ - dwFlags As Long* @/ H* ?, M( [ f
- szExeFile As String * 1024 `6 |/ U% |4 Z0 t- q+ l- w5 }/ v
- End Type) \# W. j' ~ Y) U9 `
- ( a5 \+ ~, {6 u
& O: T3 o# Q/ d- g2 h
. x, e0 T0 \" S8 J) a9 l. A- Private Const PROCESS_ALL_ACCESS = &H1F0FFF
& `& W+ U- ?! l+ _) }5 l - Private hProcess As Long
5 t3 t9 X! u' I- m - Private PID As Long4 M6 S. T- |/ h2 J/ L
- 3 }4 q# \) K' W, i1 o0 _8 C# k- j8 u
- 2 ]8 G' v, Q% e, L: {# p7 i
- Private Type asmNum
/ f1 i {% \) i2 H3 e - nuM1 As Byte# t8 T b R6 N( e+ h6 S5 h8 \
- nuM2 As Byte
/ r( w/ }: R2 }% @* ^! L - nuM3 As Byte" q0 P1 I% d) s6 w4 N* a% o
- End Type
% o9 X" d9 q8 Z W3 `
! Y6 t/ @* J; k, s2 w- Private adrTime As Long. n* K y6 Q6 [" Z8 d7 b- Q
- Private adrMine As Long6 ]5 c+ l0 A7 {2 [. _+ X* t$ z
: N" ]# A' ~0 @! S! q4 z- Private Function GetProcIdByName(ByVal ProcName As String) As Long
; K5 t: i1 m$ @$ @0 M' x - Dim PE32 As PROCESSENTRY32! l. |3 q0 A! `# h
- Dim Procid As Long
! k% \! P; R$ c+ G/ c8 w3 M - Dim hSnapShot As Long7 H$ V7 d. \; S( ~
- hSnapShot = CreateToolhelp32Snapshot(ByVal TH32CS_SNAPPROCESS, ByVal 0)- e; U8 g. N5 L3 Z
- PE32.dwSize = LenB(PE32): ]/ P( i- ?9 F6 u3 K0 E
- Process32First hSnapShot, PE32
9 D3 ?; t# v5 e3 U8 o# i - Do
- I Q. ?2 e- P. C - If lstrcmpi(Trim$(ProcName), Trim$(PE32.szExeFile)) = 0 Then/ O2 R; n1 t, E& p9 ?
- Procid = PE32.th32ProcessID4 f' V0 x$ K4 Q# C
- Exit Do Z; y3 P; @! O& S8 r8 J5 G/ {0 |
- End If
5 I! J" {1 k8 E4 {' W4 v- k - PE32.szExeFile = vbNullString1 `2 F+ k1 G$ O9 r2 A) A) Q) L9 |
- Loop Until Process32Next(hSnapShot, PE32) = 08 U$ }2 \+ q3 T' q/ c# N. i6 B
- CloseHandle hSnapShot
/ D1 d' A# T! X7 @) R - GetProcIdByName = Procid
& E6 I3 Z" j/ [; o7 \+ r - End Function
( R& M3 a+ }, h: M2 w/ V - & Q4 j# V+ `7 C( U2 {. l1 e2 `
- : X. U I; Q1 j! W2 N% ^
. C4 g p. A3 a8 r7 i- Private Function GetModuleBaseByProcName(ByVal ModuleName As String) As Long4 p. c v# l6 s; Z1 q
9 e8 {7 {4 ^+ z- Dim ME32 As moduleENTRY32, ModuleBase As Long3 V4 X7 N) K4 c3 S
- Dim hSnapShot As Long
7 x6 b* b* b B1 |6 D) J7 R; V; i - hSnapShot = CreateToolhelp32Snapshot(ByVal TH32CS_SNAPmodule, ByVal PID)" f* Q% n; e& l
- ME32.dwSize = LenB(ME32)
! B, I0 W( ?6 T y, c - module32First hSnapShot, ME32- D3 X* j' z5 \% C6 g/ S& u
-
5 `8 |, e4 p5 p+ J+ @, i - Do! _% X9 k+ `7 s
-
* a! @0 w, }) Y* q; `; t# g+ K - If lstrcmpi(Trim$(ModuleName), Trim$(ME32.szModule)) = 0 Then) U9 l7 ^' w+ O3 {. x9 `
- ModuleBase = ME32.modBaseAddr, Y& C* @# k$ Y( I5 G: Z4 b7 p
- Exit Do+ \! d. i, r; r- @* [' m: ~
- End If7 N. g) V$ s$ R9 v7 P! w
- ( Q' I2 S, a$ D) h/ c
- ME32.szModule = vbNullString5 v# y2 b6 z6 r9 A
-
! h0 a/ B/ I9 ] - Loop Until module32Next(hSnapShot, ME32) = 0
# ~; a$ S7 }9 y" u5 o, r- w - CloseHandle hSnapShot* G! y/ @. C# c' M
- GetModuleBaseByProcName = ModuleBase
9 @% a& d' B) B' k- N5 A
3 f: f1 I$ W- Y2 `' [6 {! T8 Q- End Function
, E) V4 o( `5 x+ s5 S) z6 H0 {
' S3 z! g( x9 p8 n
6 I; j4 y. f9 J8 x8 ?$ m+ ~! N- Private Function GetMemory(ByVal Adderss As Long, Optional Length As Byte = 4) As Long
5 m: G" A% Z; F8 R* C - ReadProcessMemory hProcess, Adderss, GetMemory, Length, 0
9 d- _; S' Q' G6 Z$ U1 c- T6 @ - End Function; X1 N) F1 b8 ^1 h' r) b" x
- Private Sub SetMemoryAsm(ByVal Adderss As Long, NumVal As asmNum)
2 C2 N, z, Z. T7 V$ H( N4 \ - WriteProcessMemory hProcess, Adderss, NumVal, 3, 0
; K- `9 f: L; F& ?5 k) t - End Sub
y3 h2 Z$ d4 M$ }! Q3 {4 u
7 i0 z i& y, ]- $ f1 |$ T( C9 `* d) a; {" M
- Private Function FindGame() As Boolean
- t( U* P$ I. ` ?* C - 5 z# h% u. D$ y
- PID = GetProcIdByName("MineSweeper.exe")
- G B- J' V1 C- } -
$ t9 C. f. x% U5 t - Select Case PID Q- n& h- }7 o3 P2 Y
- Case 0
6 I9 o% J6 f+ y2 J" ^; c5 m - FindGame = False
8 [! G; O e5 u6 K3 u- A- S: n. _9 K9 Y - Case Else( Z! j1 G$ o- |* q9 U- E- r/ I
- Dim adrBase As Long
; ]1 ~( H, p2 e+ ^ - adrBase = GetModuleBaseByProcName("MineSweeper.exe")
! ~4 w' x7 G: ~9 C$ ? - adrTime = adrBase + &H21446& }* u- r9 W& A2 m
- adrMine = adrBase + &H868B48 w3 f/ m. r8 v' w! w4 _9 e
- FindGame = True
* z6 v+ K/ W) T# x) i2 @ - End Select
4 J4 Y1 s* ?0 r& g8 t - End Function
u+ ~( b; K$ ]0 a" y2 Y/ ]& @$ R
4 y! |$ v5 }, N5 X! P- Private Sub TrainerState(ByVal State As Boolean)
4 A0 `. a U0 C6 I5 N; g4 s5 o - chkGameTime.Enabled = State& @3 A7 q6 N' m
- btnRefresh.Enabled = State
+ z- S) E# |0 W8 c" [7 b, _4 k - Select Case State/ W4 a3 _) t- i
- Case True+ b, o' C) V) R% A+ g
- btnCatchGame.Caption = "ReleaseGame"! t/ d$ R( B$ o$ B8 D: Y: v
- Case False
; Q" C0 g6 @* p - btnCatchGame.Caption = "CatchGame"7 Z$ c, Q* u6 T' _
- chkGameTime.Value = False
' `" T2 T5 v% R; l/ L - End Select+ p2 N- H* J& @9 M2 {
- End Sub9 G! p$ Y, I3 H& I; x3 z$ k* `" k
4 \- F; t. e6 _' |# G- N! H- 0 a: V1 j4 R5 B
- Private Sub AsmState(ByVal State As Boolean) G* _+ O+ B! d1 Z; v8 M
- Dim asm As asmNum
6 v. v0 u: x6 p! V \ - Select Case State( T( U& n# S$ Y) X% G- I
- Case True% Z0 W1 t% [+ r7 U( ]' h- t9 o# v M" d
- asm.nuM1 = &H903 q, L$ S \4 g( b2 F# {5 u4 Y$ { M
- asm.nuM2 = &H90- i ?& K3 V% u
- asm.nuM3 = &H90
0 P8 e. C# [$ d, p0 s2 [; B - Case False! z/ m9 u0 s p3 j5 p# Q
- asm.nuM1 = &HD99 T! p2 _' d% D. K& C) R
- asm.nuM2 = &H58 r6 k7 g8 @8 A. I
- asm.nuM3 = &H1C
# s, B( C+ O* e - End Select
" E% X5 R: g' \; V$ b, g - Call SetMemoryAsm(adrTime, asm)
- b! p' K0 U: \" Z - End Sub. n1 z9 p# G7 y6 a% F
- 0 d: Y% X9 }* P: \' c U
- - d$ F$ f1 z' @. g, d0 e$ D
- Private Sub chkGameTime_Click()
/ ]$ v# X2 D0 Y - AsmState (chkGameTime.Value)
4 {# Q! U `) u9 y5 {, x - End Sub
- i* g- w" Y# A) ` - . i2 A$ M( N- v. o$ N! g v
3 _1 s7 ~6 K. P( n/ o- s8 F- Private Sub isOpen(ByVal State As Boolean)
! {4 {$ ^ u8 e - Select Case State) w! }! o0 r5 |% E" u e
- Case True4 m0 N$ C! N* e
- If FindGame = True Then- N7 }8 t2 d9 r: ]) L4 B4 |
- hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, PID)
- J% Y8 X6 c0 r5 @ - TrainerState (True). _6 c! N, I8 v
- End If
; V4 |7 a2 N# K4 m3 N7 V* l+ K - Case False
+ _% B8 K" a7 Q7 a% G - If FindGame = True Then
' e/ N1 q9 P. ~5 ? - AsmState (False)9 J" J! F/ R h; R3 \, n2 J& n
- CloseHandle hProcess+ A' a8 S. g6 }3 j. p7 ~# w) L
- End If7 {. S& F! C2 \* m4 R" v
- End Select+ f% X# w: Q9 e0 u6 F
- End Sub
% G( @% j {) C- b - / L1 m5 l% c+ y& k4 R
3 W1 X, j& Z: H9 c$ E' F; |+ }5 |- Private Sub btnCatchGame_Click()( W2 Q7 Z5 {0 x
- Select Case btnCatchGame.Caption
7 o4 y( K& v# u$ o9 z - Case "CatchGame"6 E/ D% K9 l* O2 N# W- b- i) z
- isOpen (True)
; O3 }1 u- [* j8 L# t9 f% p1 Q - Case "ReleaseGame"
2 D* [" e3 Z2 E& R" O - isOpen (False)% A ], s' r8 |4 G: H$ r
- TrainerState (False)
; x8 Q s1 W* }/ f# b0 N - End Select
* U8 l: a3 B- M' H. J0 C - End Sub
% Y) g3 l' c' z x+ g1 q; e7 [* q: m- S
8 e* U! C& a) J1 W R, t- Private Sub btnRefresh_Click()
0 F/ ?: k* @3 }: m }
) ~# E4 s- Y& o+ S. M- Dim mineColumn As Byte, mineLine As Byte
* b8 H( l. Y z1 Q - Dim adrPoint As Long, adrTemp As Long, adrColumn As Long M! T" C9 z5 U/ Q M0 V+ e! f
- Dim i As Byte, j As Byte
2 Q3 p9 Q% n+ X7 {; l+ F9 w6 l4 t0 i+ c+ D! z
* X5 _4 ]0 `7 X- P! I/ y' U/ G2 p4 k- # [/ v" ~1 ]8 K/ f, ^8 K* y; X
- 7 N B) l! G) Y, g( x9 Y
- btnRefresh.Enabled = False
/ i- G4 B3 ^! `$ u, a$ f -
" x" X! [6 V/ w b) b - adrTemp = GetMemory(adrMine)
- p$ {; k5 @( \0 n5 K - adrPoint = GetMemory(adrTemp + &H10)
& n* e" B2 c, ?: g N |0 U2 z, v - 9 U: q; I: Z; ]. e" h& X5 l1 o$ ], Y: a
- mineLine = GetMemory(adrPoint + &H8) - 1- g2 r2 w- g$ S6 U% d: V0 Q/ @
- mineColumn = GetMemory(adrPoint + &HC) - 1
( c: @8 h( F9 ~5 Z1 j - 5 g [- y3 l5 V" ?) z- F; T* l
- adrPoint = GetMemory(adrPoint + &H44)( n' }0 ?2 V! y
- adrPoint = GetMemory(adrPoint + &HC)7 f' P w+ l. p4 d- H/ q
- $ D. U* Y* x$ B6 j
- * D- c" x# H3 _7 Y+ E2 P. s
- $ b8 I# e$ H8 r7 u/ O: n
- For i = 0 To 30, U& `( {* G \
- adrColumn = GetMemory(adrPoint + i * 4)
5 i; Y! U S! C, i7 F - adrColumn = GetMemory(adrColumn + &HC)
2 O. z1 ~8 H! u& P: w1 M - For j = 0 To 235 v; v& G q( w0 e2 g, k
- If i > mineColumn Or j > mineLine Then8 n' B3 F0 Y2 }7 Y, ~2 F# u
- Sheet1.Cells(j + 1, i + 1) = ""+ E1 d/ C% h9 F& W
- Else0 |/ f4 ]/ Q# E7 p% Y! T
- Sheet1.Cells(j + 1, i + 1) = GetMemory(adrColumn + j, 1)3 D* z6 w7 n5 H% L% d) ?
- End If# U3 Y7 X/ I9 y6 U# _" ^
- Next j* ?! a6 p: S0 _
- Next i( l% U0 K4 Z& \3 H& u: n
- btnRefresh.Enabled = True
" F, [+ B- x! l9 I7 t* b - ( n! B# |* e" R+ W6 q3 J
- & w- D9 q+ `$ t- W, ` Q
- End Sub X# b M. U, A. y
- 2 Q: O" ]& a5 C. l# }' L
- Private Sub UserForm_Initialize()
6 Q& L4 N& o$ V$ b - TrainerState (False)2 A7 [* u9 n) P9 t+ Q
- Sheet1.Cells(1, 2) = 1% Y9 `& f# v( e* B) K
- End Sub
" k, v7 {: S) O8 s9 p - 5 h! S% P0 h9 r2 q: F& D# c
- Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
8 ] R; l. a& Z8 x! q - isOpen (False)
- L" c- G4 z" a0 q2 r - End Sub+ l# S( N j* m q: m# c
复制代码
4 V5 K1 n+ p+ P9 t, `, P4 |
' W5 {. i1 p4 `3 O" R# W
2 j* S% Y7 H& e2 R5 n9 \2 }5 g" w1 h; h
|
|