|
本帖最后由 differentrain 于 2014-6-20 16:05 编辑 4 U" A- O$ Y9 F/ Y, I
, l: M9 s% R2 Q4 A4 V4 I
不怎么用Office系列,今天偶然和朋友聊起来,突发奇想用Excel做了个扫雷的修改器....[em1127]
6 k6 q" q# [* a) j" Q, `$ [虽然不会Excel,不过VB咱小时候还是学过的...[em1124]
: Z; X0 Q& {0 T! K _% l+ V* C6 h. ~" L! [7 Q |
我用的Win7的扫雷,其他版本的估计不行..可以停止计时和在表格中现实地雷位置...3 b" ~& O2 o7 ?. R1 s" i
附件就是那个表格...如果版本不对就直接看代码部分自己复制过去也行..
$ s8 Q1 ?! F* q% V7 p g; a顺便说,VBA简直反人类..MS为什么不出VBA.NET啊...大段的代码要自己写,而且抽象性巨差....
1 w7 @, C6 k( L Q. ~# q6 P6 i9 m2 S6 m% V$ \* b7 i" x$ w& `
MineSweeperTrainer.rar
(22.27 KB, 下载次数: 6)
4 k3 a" I* E' N
; F" e0 r# k5 J# F
3 c+ |% d7 T( @ |( g- o" [
2 r* ?8 U0 \, {* N) Z7 f6 W3 y6 v
( ~/ @; m4 V/ S2 n; N% L) l, N: X6 r- 【控件】# c1 K& l ]9 f2 Y9 p: n
- , e- @" A; I) _' B( b6 P8 s
- 窗体:frmMain3 R/ l$ f" u0 R5 H, U$ Z) I! ?
- 按钮:btnCatchGame,btnRefresh4 C- N5 F% t4 F* W8 k/ L
- 选择框:chkGameTime
复制代码 2 P1 I0 L9 [8 W+ N
1 b1 F5 B3 Z2 ^) {& ?' L' r1 v0 L e1 L* z; x4 C$ m, @; t
' r+ a2 M; `0 ?
- 【代码】) z; d. p, D( C" A0 f5 x
# C' Z8 a: D: r+ `% K- o5 A
+ i: y. p2 R4 u4 \+ U- Option Explicit7 X+ V- L( _0 ^- n. f
- 8 Z. t/ L( m6 ?
4 ~; q6 D3 i4 k* |' |, M5 D$ [- Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
2 _/ e, f5 v$ x! }3 {% G - Private Declare Function module32First Lib "kernel32" Alias "Module32First" (ByVal hSnapShot As Long, lppe As moduleENTRY32) As Long1 S5 ?& I; Q" I6 M. T
- Private Declare Function module32Next Lib "kernel32" Alias "Module32Next" (ByVal hSnapShot As Long, lppe As moduleENTRY32) As Long
) t# \- s$ S! ?6 N3 {/ O" ?( A - Private Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, lppe As PROCESSENTRY32) As Long" m9 X4 m; C% O& _
- Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, lppe As PROCESSENTRY32) As Long; n$ p$ P, r) u6 `2 `
- Private Declare Function lstrcmpi Lib "kernel32" Alias "lstrcmpiA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long: o6 T. a. ?, N
, z& }; [4 D# Q$ W9 R! `
3 O1 {+ d. @4 b) D- Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long' D- z- p7 t5 Q- e/ {9 T
- 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* c1 p3 F/ t/ s* r
- 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
# X! Q N$ e& M' A' D6 O2 Y - Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long% l5 u }5 p, y* q, w9 ^& ]
8 \8 h8 i! v6 O$ F- `6 C2 G8 l
4 Y2 p: ]" o3 n8 R# o9 y- Private Const TH32CS_SNAPPROCESS = &H24 S {4 W; \& {/ h2 M
- Private Const TH32CS_SNAPmodule = &H8
. w5 N1 t& J5 p7 ]) t, o& Y$ W, L - Private Const CB_SHOWDROPDOWN = &H157
+ g2 @% o! w P$ ~( n4 X' Q+ n X - Private Type moduleENTRY32
4 [( B8 s0 h6 b - dwSize As Long$ z2 Y/ I1 ?9 \' T4 i5 K$ K* ^8 b
- th32ModuleID As Long, W' C; ]; o1 Y0 v
- th32ProcessID As Long/ d3 h7 W5 X3 S
- GlblcntUsage As Long
+ _% A3 j1 d; w% y! H, p - ProccntUsage As Long
$ D9 _0 w6 e% w$ @; }% ]; Z+ m* { - modBaseAddr As Long# }+ P6 T: ^' z( e T/ K
- modBaseSize As Long+ L$ g, B; F4 ~3 c
- hModule As Long
) h+ T8 \9 \2 f- A2 _% E: X - szModule As String * 256- Y' G( o9 t* g: I1 ]4 o% t
- szExePath As String * 1024# n0 }+ ?& V+ ^5 Z7 D
- End Type
# w. c7 o" ^3 P( B/ j
# n! J2 y1 ~: f/ S6 S- Private Type PROCESSENTRY32" Q, h" p' x* W2 j8 _; ^1 y+ ?4 Q: i
- dwSize As Long
) d4 P c" G2 Q - cntUsage As Long
' {' }/ w* k, s5 Z - th32ProcessID As Long5 O2 e: E3 o7 E9 Y o* z; P! Z
- th32DefaultHeapID As Long
5 v( }% ]9 A/ P: X) N( x1 ~- S9 k - th32ModuleID As Long
' ]: l3 N# T/ [) {8 w Y - cntThreads As Long0 a( f: _/ K, k5 X+ B
- th32ParentProcessID As Long
[ R/ m9 `# m. _, }# m* V& f0 B: n - pcPriClassBase As Long
- ^1 `4 V. I7 W/ p* E1 r - dwFlags As Long5 d3 n1 F) c# }# {1 \3 t
- szExeFile As String * 1024
a* T; J7 k6 S; q7 @ - End Type. F' ^5 j1 n( R# h* B9 u
3 j, C6 y/ m: O7 w
3 p- m7 S2 R; p, b6 G# U" c- ; ?7 ~5 u9 u+ q0 l( X
- Private Const PROCESS_ALL_ACCESS = &H1F0FFF* u. [) m! \6 _ q
- Private hProcess As Long9 b: }# I2 E" {8 |6 @2 H! V- h+ F
- Private PID As Long5 u2 z7 q+ @1 g1 P
- , [ [$ P; N8 l0 H3 Q( V
- 9 n# B W8 t9 f2 J# x" P. i8 ?: W
- Private Type asmNum2 I7 {- m" n- m& T
- nuM1 As Byte( s% m: N! N$ A9 M
- nuM2 As Byte- m1 M" \; f: c# ^
- nuM3 As Byte" P, ]7 @, H& }2 m
- End Type
- c7 a5 R( |7 t# N1 j
* M* @; j9 _2 f% c2 H0 g ] z( F- Private adrTime As Long
" ^8 W H7 |+ \2 ^ - Private adrMine As Long0 n5 F! N- _! @0 a
: R" D0 n: L) B9 d" c. u2 v2 R- Private Function GetProcIdByName(ByVal ProcName As String) As Long
6 H$ S$ Z, z( ~$ U9 a# b5 [ - Dim PE32 As PROCESSENTRY32
* k# v9 Z/ v! B [, ] - Dim Procid As Long/ W- X1 Y8 J* d2 R, H
- Dim hSnapShot As Long
& G: E& q6 {; ]* c) o: k - hSnapShot = CreateToolhelp32Snapshot(ByVal TH32CS_SNAPPROCESS, ByVal 0)$ _- E4 I' B9 }- N# q; B/ f
- PE32.dwSize = LenB(PE32)7 l9 z N4 o8 o, d+ e
- Process32First hSnapShot, PE322 m- U" Y* d) R# c& m7 g
- Do2 x8 N5 V- ^4 M" t% {. K' t& j4 r
- If lstrcmpi(Trim$(ProcName), Trim$(PE32.szExeFile)) = 0 Then
& c l) Y+ ^! e4 i% K - Procid = PE32.th32ProcessID' _& _ t/ t0 y9 R _" [1 z
- Exit Do i i3 D- k5 ]- L% ^
- End If* ]! `- Q m4 M. I }
- PE32.szExeFile = vbNullString% H& l) a) Y" V
- Loop Until Process32Next(hSnapShot, PE32) = 03 W# d, p0 j) k/ U, a7 |
- CloseHandle hSnapShot
4 R* K/ z4 Z. ]; Z4 W. Y& B& ^ - GetProcIdByName = Procid7 f6 J5 C0 k# t
- End Function
$ f) a& {" H' e, Y& h- y( j) B - ! l( e7 o2 L: J
- * d5 s3 ~, u- j$ \7 E: J! j9 [
- - W# n+ k( L& n7 m, w& _1 U
- Private Function GetModuleBaseByProcName(ByVal ModuleName As String) As Long
% {' {1 P6 j, i& H - 3 X+ `5 c" _+ ~4 N" x$ \
- Dim ME32 As moduleENTRY32, ModuleBase As Long$ T4 G* a1 ^6 C+ l6 L: X- p6 n
- Dim hSnapShot As Long
! F$ j5 I9 }% G8 u - hSnapShot = CreateToolhelp32Snapshot(ByVal TH32CS_SNAPmodule, ByVal PID)# y1 y, |2 [' d* k, \" Y
- ME32.dwSize = LenB(ME32)8 ]4 R6 m% [. [" y/ \
- module32First hSnapShot, ME329 s9 n( b. ^6 r, Q8 z% K5 }
-
V, n4 q* x1 v6 k& S - Do
6 q& H3 z9 t ` M! w4 H -
$ `1 L2 `. {" x - If lstrcmpi(Trim$(ModuleName), Trim$(ME32.szModule)) = 0 Then. O5 F; K6 A H) C/ R
- ModuleBase = ME32.modBaseAddr1 U1 l0 W Y9 Y( K5 [
- Exit Do
0 e% V/ b) r: v( E9 w- _ - End If- R$ I1 m/ M, Z- L' X- Z' w
-
5 u, b+ |4 j/ w$ H: B# K0 f/ t4 O - ME32.szModule = vbNullString
# P/ E; V( x" o0 S% C - ) `: v$ B& \9 i# v: U
- Loop Until module32Next(hSnapShot, ME32) = 0
# o$ u; o/ i. D' k - CloseHandle hSnapShot3 N- y- x- y3 W4 n( |
- GetModuleBaseByProcName = ModuleBase
6 W/ T( c/ n' r2 k0 ]4 E' D4 }# S( x
! @- T- ~% [7 @6 k/ x- End Function
* @1 ~' R4 `7 P) K' T: g! }8 X+ k- g - 2 Y) x- ]3 l6 Z; @
- 7 F$ \ X$ T D& I+ f' m y' L0 {
- Private Function GetMemory(ByVal Adderss As Long, Optional Length As Byte = 4) As Long+ n, M$ }' K; f' E, j
- ReadProcessMemory hProcess, Adderss, GetMemory, Length, 0
" H" E, ?, K, i - End Function' Y6 L* I9 \* D1 B1 Z5 P
- Private Sub SetMemoryAsm(ByVal Adderss As Long, NumVal As asmNum)
8 g j) C# z6 ~: ]2 U - WriteProcessMemory hProcess, Adderss, NumVal, 3, 0: I E* P1 W: ^
- End Sub y& r3 P( L; @- k7 T, m1 a
$ {; T% C" N, v/ m1 F
: o# }. o+ r$ t$ W! p: R$ U* O- Private Function FindGame() As Boolean
; i/ f) S6 v/ A1 l -
- _3 J0 B9 K' f( U" Z6 R, q6 J; p0 p1 { - PID = GetProcIdByName("MineSweeper.exe")
: `9 J* H$ }" _1 d) V' N6 F3 G -
. ]& O' u# |' a+ z5 e& `5 Z+ p1 F2 q - Select Case PID
( D# t% o7 U: T3 U - Case 0
O% i# J9 M6 l: | - FindGame = False' f$ D/ z) Y) z; i
- Case Else
6 o. b$ X& G4 ?. K+ n& p- }5 s: }% R - Dim adrBase As Long4 U, |) Q0 Z4 T# o3 Z9 |
- adrBase = GetModuleBaseByProcName("MineSweeper.exe") {: E/ y, g6 t. x+ W
- adrTime = adrBase + &H21446
1 x7 q, c1 B$ D+ X. ]6 D, j - adrMine = adrBase + &H868B4
3 l* K; z; C7 D! | - FindGame = True
?. Z( _9 u5 [3 { - End Select$ R3 l Z2 e$ S$ Q" _
- End Function2 k; F$ n* d# ^+ T* Q2 `
- 4 g' |7 x- f* L O. t. R
- Private Sub TrainerState(ByVal State As Boolean)% C6 v* e2 L7 y |0 n- n
- chkGameTime.Enabled = State; b3 C5 w9 P1 I
- btnRefresh.Enabled = State0 a* w8 B$ s1 t1 p6 A2 m
- Select Case State- P* b& H- T7 Q$ ~
- Case True Z$ A4 [8 U* T L. x/ A9 w( |4 {
- btnCatchGame.Caption = "ReleaseGame"- o: C7 c7 F; |% q0 g8 r: D+ Z5 R
- Case False
1 X5 @1 v; {' B" R - btnCatchGame.Caption = "CatchGame"
5 {# I' C7 p |/ D$ x - chkGameTime.Value = False1 r) G' H% U& g
- End Select
1 z5 M) g# ?1 x/ H/ H7 J V - End Sub6 [$ C0 p5 u1 @( g0 C
- * ]$ s8 d7 j: J: q) w; b, G
) \" ~2 A5 m3 b5 H; W. b- Private Sub AsmState(ByVal State As Boolean)7 a$ a$ O f& m( y& E1 l! _7 A
- Dim asm As asmNum
% j- ]' F" I* ]: r4 S - Select Case State- {) f) ~( K6 @7 q( E
- Case True
9 I2 O/ ]3 T4 ]" t9 F+ Z9 Y9 { - asm.nuM1 = &H90
( {# _; e5 a5 r3 N& ^0 _ - asm.nuM2 = &H90
) J% m! e" J. c - asm.nuM3 = &H900 @5 ^/ {4 h' U# Y. l5 a9 P: [
- Case False
' g$ x1 m9 N7 [" s( a& U. [0 m - asm.nuM1 = &HD9; y& k0 T4 R9 o7 S% h
- asm.nuM2 = &H588 Y$ G9 ]( L/ ?/ _9 k
- asm.nuM3 = &H1C
E+ b8 P4 K7 h% P - End Select
4 f9 x# O, H3 C1 \2 x9 g - Call SetMemoryAsm(adrTime, asm)
j$ N$ L- I2 `( c- x* M# f - End Sub; _1 Y2 D [' {6 W/ I4 T% t
- p+ A2 ^- t* i- . |5 E+ g4 A( {' k' t- x! A
- Private Sub chkGameTime_Click()( x# y7 ^8 Q* _% w9 T
- AsmState (chkGameTime.Value)
& W7 l& J- E) m. ?; y - End Sub. P0 E9 n& F8 m5 n4 A
- ) m7 C& c2 ]2 J: ~; V
- ! Z Y1 y3 K- I, ^0 j$ z( h0 _) x
- Private Sub isOpen(ByVal State As Boolean)
2 c: [5 z; v3 p n - Select Case State
. f$ k% M( \. |- E8 O( v - Case True" |. a0 {. H; V& W
- If FindGame = True Then" c2 k$ f) @! @" n) J0 G7 s0 L
- hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, PID)5 P$ `% E3 e0 f& Q2 R2 n
- TrainerState (True)
* `% w r- E9 s) k' q! ]/ w - End If
+ q" t5 j2 E- |( a( R - Case False7 d3 G4 A9 P/ }: n- W: r. F$ b
- If FindGame = True Then" {( g6 @; q2 a' _% e3 a
- AsmState (False), v) [# @; B& Z& ?
- CloseHandle hProcess
" p h- e" I9 V) g - End If/ n- }3 b: q) N
- End Select
5 x' ^, K- ?% c( g0 } - End Sub0 L0 \, K2 j1 X1 ^& }
- ! V' X3 ~, ]3 b, m! c& v
- 8 ~) |# U8 N- I) [: Q4 X2 W
- Private Sub btnCatchGame_Click()( g! U7 L3 X$ n3 T- e
- Select Case btnCatchGame.Caption' f& n! ?- Q7 @% K, p7 l7 n2 G$ Y
- Case "CatchGame") V9 K2 B* l6 K: b& q
- isOpen (True)
: K( f3 F3 q5 ~$ {0 g# G - Case "ReleaseGame"! M' I- u% n F" H6 S! \. d) E
- isOpen (False)9 Q5 t! z! p! o3 s
- TrainerState (False)& P2 C7 e/ a3 n5 ^
- End Select
" r/ _6 S5 u, k6 X' H$ c$ e - End Sub* k* O' i/ ]. M- y! C
- 3 Q- a8 L; L3 W+ h' p
- Private Sub btnRefresh_Click()
- d+ ?! V+ z5 E- |5 \3 U
, J# r* T+ j+ z- Dim mineColumn As Byte, mineLine As Byte
: [* `* g. Y8 m+ z' c. \ - Dim adrPoint As Long, adrTemp As Long, adrColumn As Long
8 A1 C( c$ t. C" _3 X0 Y4 m; s - Dim i As Byte, j As Byte
3 G. O( ]9 |" n8 M! i) E% O- B - 0 {# R4 m' n1 T q! o1 U' |/ F
- 0 C3 O7 g4 L$ w# s# [6 \8 _
- - b: W2 I% P) b
- btnRefresh.Enabled = False
], k4 P; E& r& _: }: _' S! y' l. H -
0 s( w: I/ \7 X1 d0 _ - adrTemp = GetMemory(adrMine)
6 @5 D% c: L9 k; I- m! E, x - adrPoint = GetMemory(adrTemp + &H10)& t6 B: f) r* [) y" Q" W' p8 M9 m
- ! o# J b% v# l& S/ g
- mineLine = GetMemory(adrPoint + &H8) - 1% i$ v- W0 D( Z+ e4 B
- mineColumn = GetMemory(adrPoint + &HC) - 1
/ a1 e4 j, i3 G3 O - - f) [9 m# d# s$ {/ E. ^
- adrPoint = GetMemory(adrPoint + &H44)3 v" [/ ^3 v% c" H
- adrPoint = GetMemory(adrPoint + &HC)
! f* Y% `- R# F) r, N - 4 m9 X, H' @' l; J% _2 y8 e& [
-
' I% O' R- J' ^# o$ E - 7 P+ {: n X) o6 O% U
- For i = 0 To 30
% a7 ^. M; h4 h" t. g7 @ - adrColumn = GetMemory(adrPoint + i * 4)9 u0 H# H* ?- v; I& t, H6 w
- adrColumn = GetMemory(adrColumn + &HC)
; I6 y x: u5 W1 b. d0 s# i - For j = 0 To 239 k& j! o, i' ?$ T) }/ P
- If i > mineColumn Or j > mineLine Then: {/ @2 W r7 D5 l
- Sheet1.Cells(j + 1, i + 1) = ""
2 \5 i" m! {5 D1 J9 b }* r* V5 ?( Z - Else
3 s( z+ O) Z7 ?! e - Sheet1.Cells(j + 1, i + 1) = GetMemory(adrColumn + j, 1)4 h6 ~1 ~7 I& K( `7 P
- End If
, ^; k' v* I5 Q$ L& V - Next j
, e, V4 Q% d% { - Next i
- z3 a8 k5 k3 O& U6 K( |: D5 V - btnRefresh.Enabled = True( J$ M2 N! m( @+ ]- D# ?. ]
- 8 _0 |& p6 K5 f: X# u8 M6 K
- 2 }5 z/ i& V+ Y
- End Sub
9 L3 {" @1 i& O# D8 n5 o - ! n" G% G* {( g/ o( X/ C! X1 |: I
- Private Sub UserForm_Initialize()
, @/ x# F" s) ?& W - TrainerState (False)
3 `8 d3 G/ k' ]5 o - Sheet1.Cells(1, 2) = 1
! U0 f# V- Z* {; G$ C/ z, g& W) ]+ U - End Sub/ G( e5 L A* R5 N) v# {
- $ z }4 x- v( ^0 Y. l8 x
- Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
1 n' i- ]% {& }$ r2 ]3 t2 q3 \ - isOpen (False)
5 G- x( G/ @) I4 x3 N2 w! U - End Sub
$ S/ D) x8 p; Z+ M( v2 d& s
复制代码
6 B& v0 [' s& o) \0 y/ }
" Q1 |2 F1 s2 j V2 M* U2 @ {5 e+ r6 y2 w- ~+ ^4 D& K
% Z7 W$ M! _1 V1 p2 v( c |
|