|
本帖最后由 differentrain 于 2014-6-20 16:05 编辑
/ w' U# ~& j9 ?$ h( Z
4 |: }8 d: n# ~3 ~+ J不怎么用Office系列,今天偶然和朋友聊起来,突发奇想用Excel做了个扫雷的修改器....[em1127]( R) A7 p7 b* m7 g( {
虽然不会Excel,不过VB咱小时候还是学过的...[em1124]
' w) ]9 e; A( y0 E8 c. U9 G, ^- N4 e5 f
我用的Win7的扫雷,其他版本的估计不行..可以停止计时和在表格中现实地雷位置...' J2 q; g+ e1 E
附件就是那个表格...如果版本不对就直接看代码部分自己复制过去也行..
9 R4 a0 g) o, i. z' w顺便说,VBA简直反人类..MS为什么不出VBA.NET啊...大段的代码要自己写,而且抽象性巨差..... t* w' H/ @; j) h7 O
; g2 t1 z q- z
MineSweeperTrainer.rar
(22.27 KB, 下载次数: 6)
1 D7 r" l* @+ Y/ M
5 {! G/ x3 E/ H0 _1 c1 {8 L
. j4 ]( o4 U& O5 C% u* f3 R6 m) x, v; l S7 R
9 t6 u! L/ t( a) K; M- 【控件】
" _. H3 L% z0 J8 B
+ s' m9 a( v' C- 窗体:frmMain
+ I1 i! _5 C, a8 S2 G* r - 按钮:btnCatchGame,btnRefresh5 V1 N% x. [& |: i3 ~
- 选择框:chkGameTime
复制代码
% X1 \6 o- V: E+ s) D3 f
\4 I" }0 |/ v3 x3 M1 {8 B, @* d4 `- y) x8 a) W- n' p% o Y+ u
. R8 y J7 l/ z9 s6 Z% u- 【代码】
% E M, u# I; q/ P8 J$ A$ t - + f2 T" C( _( O
7 `/ p' O) ]7 ]1 q9 X0 d% [- Option Explicit: N. f2 }* i# I0 S8 a
; W! I6 {# b+ U
+ A- @& u3 _: |- Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long' c& P3 X Z+ f. n7 b7 d, Z
- Private Declare Function module32First Lib "kernel32" Alias "Module32First" (ByVal hSnapShot As Long, lppe As moduleENTRY32) As Long
9 H. k4 u4 R h) \ - Private Declare Function module32Next Lib "kernel32" Alias "Module32Next" (ByVal hSnapShot As Long, lppe As moduleENTRY32) As Long1 ]: R8 X) Q7 \& [( e
- Private Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, lppe As PROCESSENTRY32) As Long
6 {8 J9 b5 p# x! s3 w4 a, v - Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, lppe As PROCESSENTRY32) As Long+ X: o8 m* t- b$ U4 p
- Private Declare Function lstrcmpi Lib "kernel32" Alias "lstrcmpiA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
& n* z( {$ Z* Q- q+ |/ q/ ] - , D5 ^( l, F$ k) k+ e6 G/ \( {( L3 G
- # `+ ~1 L: Z, ~& k# G
- Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long, f& f- D @$ @ \, M L/ J) Q
- 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 Long6 u B7 C( X8 D
- 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 Long5 M0 X2 f8 Z+ w% L1 ~, U
- Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long3 d: ]6 B' w5 @
+ S* U, e. K5 I' R
. X! u& i& D& L1 Y( B3 C& \- Private Const TH32CS_SNAPPROCESS = &H2
# p) v1 C3 E0 H4 z" E. B - Private Const TH32CS_SNAPmodule = &H8
; k& y! n8 n) T- V0 c7 z. }# D( g1 L9 f/ | - Private Const CB_SHOWDROPDOWN = &H1570 c6 Z# v# j5 t; T
- Private Type moduleENTRY329 r0 ~2 g+ e+ w$ D3 l. l# W
- dwSize As Long
9 X3 t' f/ u& Z8 X; ~1 p - th32ModuleID As Long9 u$ n' T3 I) N/ a7 ?
- th32ProcessID As Long
0 D/ q8 p: t9 h8 ]4 c4 Z. N - GlblcntUsage As Long
: H2 d' v) A/ n% z! x) V - ProccntUsage As Long
: f5 `6 O5 _& E. J0 M8 C - modBaseAddr As Long* F2 X+ |6 D J5 n
- modBaseSize As Long: M- @" Z) g5 h' N7 ~
- hModule As Long! e2 k* K- ?' B
- szModule As String * 256
" ^6 |& }- ^/ X) V( ?$ W" [ - szExePath As String * 10242 `& H" l7 s/ y) H s* |+ a7 B
- End Type
% K3 I8 X( y H& Z; L* P$ `. u
7 i; n; c! u3 ?4 K0 x6 ^& R+ d% X) V0 \- Private Type PROCESSENTRY32
J8 N5 Y/ k2 r# _ - dwSize As Long C, ]7 g6 p7 s) d
- cntUsage As Long
) u2 X# N4 W# \2 Y - th32ProcessID As Long
( Y Q# h* g: E- A( ~, b - th32DefaultHeapID As Long. C [# ?9 n/ H; [2 v+ r( R6 R
- th32ModuleID As Long
' H; y; L2 p! R1 I! q/ i" m8 b3 B - cntThreads As Long
5 c6 U; k# Q. R9 P! p - th32ParentProcessID As Long
: R, D9 i9 d) n$ K5 ~- R8 ^6 l - pcPriClassBase As Long
' f% o; B" Y; Y0 v/ i - dwFlags As Long
% h0 M8 L l- j" U - szExeFile As String * 1024' Y0 t, ?2 Y0 U6 Q+ o- }4 T5 G" q
- End Type
2 U# d! O3 N' ~ l8 X - / X7 G( T$ U3 r7 l% n1 x3 d3 q/ E
0 j0 F& |& N' Z( t9 R; F+ h! Q
6 \/ Y( t6 n( g* \- Q; o. v- Private Const PROCESS_ALL_ACCESS = &H1F0FFF
5 Y; _# K' Z1 Z- d4 K0 T4 K - Private hProcess As Long0 o m7 J7 P8 @
- Private PID As Long. @/ M" B. w8 L! H" p- y: V: B* H
- 9 V5 _% S, g- ^% A9 _
- , m" u. ]/ Y: v/ j3 |& u
- Private Type asmNum9 b' ^- P) V% s0 _
- nuM1 As Byte
; z& o) F* f0 Z5 j5 h; q+ A - nuM2 As Byte
) F4 ^) ], t' W, h6 Y - nuM3 As Byte
5 L: T2 y9 k3 g0 x5 l# E# e l - End Type1 P& P' R5 \2 u/ ] D& @! v+ g* p
- " ^$ k7 J1 s3 t$ a$ G8 `$ b6 X
- Private adrTime As Long6 B: s$ [2 E- ~: D+ D) G0 g8 o) N: N
- Private adrMine As Long% t5 t+ q3 v6 {) F. w
6 B) ` {" r! K2 ~/ h, w- Private Function GetProcIdByName(ByVal ProcName As String) As Long( t3 o/ |( `8 g- L3 C
- Dim PE32 As PROCESSENTRY325 \% W- R* A4 y, |# Z
- Dim Procid As Long. f' u* ?4 t/ p( i+ G' X s7 B
- Dim hSnapShot As Long
' x7 L( l0 {# j - hSnapShot = CreateToolhelp32Snapshot(ByVal TH32CS_SNAPPROCESS, ByVal 0)
4 B+ c9 {7 U1 ]& b! W6 Z! v% x - PE32.dwSize = LenB(PE32)1 b1 A% E! Y) q0 s6 h1 T6 w
- Process32First hSnapShot, PE325 I* Q+ i% d; m, x9 z0 C9 y- R
- Do
& J6 x/ R$ i9 w - If lstrcmpi(Trim$(ProcName), Trim$(PE32.szExeFile)) = 0 Then. H8 n/ u/ r. |: l- b1 U! M
- Procid = PE32.th32ProcessID: c) M! N4 e2 ]/ \
- Exit Do
. {2 q' C6 _. s1 I# Q( o- E6 V3 y- s - End If8 S, |" ]4 O8 U1 l
- PE32.szExeFile = vbNullString
8 ]7 {$ P( d/ [# `1 {. ?- d$ g) n - Loop Until Process32Next(hSnapShot, PE32) = 0
( ~% H4 s/ p ^ - CloseHandle hSnapShot
% Y8 ?6 ?; T6 D - GetProcIdByName = Procid
/ R- W+ B! v3 h+ e9 e - End Function/ v$ r" W% I$ V( Z; {
- ) ?2 b- ~" z& ^5 n* S" H: i
- 7 a O' C, L1 G& S3 O) z+ F8 S t
- ) W# ^, R& t- C; ^% |& N
- Private Function GetModuleBaseByProcName(ByVal ModuleName As String) As Long
- l8 M4 [, Q! p9 z: w - 0 }1 v0 W# n2 A8 B5 V! P- G4 y" p
- Dim ME32 As moduleENTRY32, ModuleBase As Long0 G- \; |1 A8 W& m
- Dim hSnapShot As Long; q* |' ]* h9 F: ~( Y' z) J' I( L @
- hSnapShot = CreateToolhelp32Snapshot(ByVal TH32CS_SNAPmodule, ByVal PID)
" f5 B- \8 X% I - ME32.dwSize = LenB(ME32)
0 e+ P) F9 Q0 h! p& W3 J( u3 f& C3 e$ V - module32First hSnapShot, ME320 b+ w: _4 ^/ z0 b% N/ g
- + a8 j8 [% T5 V
- Do; v% c9 Z- l' R" A! a0 Y$ M
-
, I2 Y, e8 U1 }- O4 h- L* ?' n5 H: w - If lstrcmpi(Trim$(ModuleName), Trim$(ME32.szModule)) = 0 Then1 }% R3 h+ |: {' ?! \( m
- ModuleBase = ME32.modBaseAddr+ ~: T/ R" G. _2 x. P- {: _$ r
- Exit Do) _0 J% @+ Z ?
- End If
8 b3 |; A' f+ u2 L) f7 f& ~/ e - ' G5 B) o" l' ^1 U ^+ k
- ME32.szModule = vbNullString D/ @2 d2 |" S. H- r
-
3 q) P) A+ U" Q" j - Loop Until module32Next(hSnapShot, ME32) = 0' ]1 P' u5 W( E; I
- CloseHandle hSnapShot
$ R/ D2 l7 k: L! I% Q6 K4 ~ - GetModuleBaseByProcName = ModuleBase3 D( C* }/ a. J" ^
( I: t6 J t' d( K1 _0 A- End Function5 H. X/ t2 Q s$ E. N
- & B+ Z, X8 l; D0 Y* h/ c/ f
- / l7 p! z! f! p9 y+ [3 S# b
- Private Function GetMemory(ByVal Adderss As Long, Optional Length As Byte = 4) As Long0 R3 J# g! L2 S" `! F) e: A
- ReadProcessMemory hProcess, Adderss, GetMemory, Length, 0
: Z4 Y5 U! _7 L; F - End Function M6 `# D" [9 T; _$ u) \1 f! [4 A& B! {
- Private Sub SetMemoryAsm(ByVal Adderss As Long, NumVal As asmNum)
% p C v: J5 D - WriteProcessMemory hProcess, Adderss, NumVal, 3, 0
5 @; ~5 H a# i' m- r - End Sub
; W9 a) I- ^5 `( l, O# @- i* | - 9 J3 C% z0 x: l4 y
- ; C3 I ~2 [! j/ P( U2 H! o
- Private Function FindGame() As Boolean% M/ i5 g) b7 P$ g
-
/ F* K; `# b7 V' _4 @7 Y - PID = GetProcIdByName("MineSweeper.exe")2 n. T" H9 |/ z
-
' @" s. N! I: g: y - Select Case PID k. w/ S% [; O. V; `
- Case 0
% o7 X4 @/ L" ^- } S1 _ - FindGame = False
0 u, y( S3 I9 c3 e - Case Else: q1 _7 I; S: V' Y/ w3 {
- Dim adrBase As Long4 ?: G& j3 j2 i+ P7 v x
- adrBase = GetModuleBaseByProcName("MineSweeper.exe")( @. i! i" ^. q! _9 y! `: H( y
- adrTime = adrBase + &H21446
4 f8 h& C! t' s5 e1 | - adrMine = adrBase + &H868B4
. G, E. X4 c! [! K+ D" g9 X9 h2 a" Z4 G - FindGame = True4 z' ^: k* ~: S
- End Select
0 k. M9 Q3 v9 \% l9 { - End Function
. U: y; G0 ? N. F# A. ~- E
' W. n" U9 E: S: k- Private Sub TrainerState(ByVal State As Boolean)
7 i6 Z) p z, z" h- H - chkGameTime.Enabled = State. a2 f, z! s* a8 ~* B6 ~
- btnRefresh.Enabled = State
( E- P, ~( ~9 R- W: i! r( Y, ? - Select Case State( t- t5 K! i1 `8 n R# u- S
- Case True
5 B1 U# S; s% v( D3 I# N5 w6 s - btnCatchGame.Caption = "ReleaseGame"
1 E6 N {3 W* Q' D, y9 r- x* H - Case False
( i0 q5 a C' r7 e- U: i, j+ U' K - btnCatchGame.Caption = "CatchGame"9 A# P2 A' a% {' o
- chkGameTime.Value = False
* \' ^# Y" I; k* c! e - End Select8 d1 `# P/ J+ k8 p
- End Sub
" E* S% W( x7 B5 L' w- K
7 Y( g7 Z: z, G& f/ R
7 B! i% r* A3 ^- y5 m4 K- Private Sub AsmState(ByVal State As Boolean)9 r: \) u& R& W) i
- Dim asm As asmNum# u$ q/ Z- g$ F" k% o( u& ?1 R) [% C
- Select Case State& G% `9 s( s/ @, W( Q; U& z+ n
- Case True! d; M/ B6 V" `* P+ @
- asm.nuM1 = &H901 v7 ?+ s1 m7 ^$ j
- asm.nuM2 = &H901 g# ]# R! q2 w* N
- asm.nuM3 = &H90
" J( w8 l3 W$ W* p& B - Case False; y( l# X/ k2 J' d5 G, x
- asm.nuM1 = &HD9
! Y' e4 ^3 I* ~& w3 ^ - asm.nuM2 = &H58
/ _5 R4 w2 @ r - asm.nuM3 = &H1C
6 s6 Q2 r5 a" {; N3 C+ h - End Select
( D& H; v' i- B6 _0 m - Call SetMemoryAsm(adrTime, asm)5 R* S' u2 A6 n0 \! S7 |: _
- End Sub: d: z. R( T: L; C, K9 ^: V; p
- 0 a0 I& B2 M/ i! F. S9 I" Y3 u' n
- , T6 ~4 d' N5 k" L4 h
- Private Sub chkGameTime_Click()
% u' Z" j$ n# M4 n! f - AsmState (chkGameTime.Value)
! k( ~$ X. k$ C0 y9 \ - End Sub
9 A* l r/ ^6 ?9 L
- ^6 M( l1 ~5 I4 k: i/ Q
' p0 o( f" e! p9 |# r; t% y- Z- Private Sub isOpen(ByVal State As Boolean)
$ I' y, ^4 b" B+ C3 i2 J! h - Select Case State) H; l& |, [. V7 A& ~& r
- Case True/ b/ \/ W8 y8 Y% y- |
- If FindGame = True Then
9 a1 w6 Z! x8 o2 l w - hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, PID)
# e3 }' j+ M% w+ A8 _8 Z - TrainerState (True)
6 m6 k1 S, r8 t! a - End If c; l6 W. {1 }% V2 t1 v' W
- Case False8 _. r# U9 i0 \" D2 P
- If FindGame = True Then
8 M5 e9 g- M+ U" V" s7 r/ C; k - AsmState (False)+ k# b a8 R6 X; p# J
- CloseHandle hProcess
1 B. @1 s4 ?- J! x - End If
7 M, }& \7 {9 ~. S. V, c - End Select; S* s2 s6 L2 v* x9 x" l
- End Sub
' a; r( U5 V5 P* d5 W6 _; n+ a
2 g$ k& g( d0 L- 7 M/ O4 r$ Z( x( i# {& k( u
- Private Sub btnCatchGame_Click()
9 Y4 l3 A; e: ~8 _ - Select Case btnCatchGame.Caption; r* f" d$ d( O
- Case "CatchGame"$ r. u8 Z0 W" O' i2 r
- isOpen (True)
& x+ J4 a' @; a3 d3 k" _4 v) X - Case "ReleaseGame"
1 Y0 N0 C% I c9 a2 ] - isOpen (False)
# |* l) |2 d2 [8 ^ - TrainerState (False)1 g. f* u3 M. z H4 S$ @- M( d
- End Select( o0 P+ W# a' J/ }* F2 U
- End Sub
/ L. [# X; k% f- F& x. U4 P- b( c - % B. T4 q' L% B5 Z
- Private Sub btnRefresh_Click()! H$ V( x: c0 w' h* \
4 b, b" G; U/ u- P8 |$ N/ p7 {+ I. e4 s- Dim mineColumn As Byte, mineLine As Byte
1 q P) V6 u. T1 W1 G* L+ L$ e - Dim adrPoint As Long, adrTemp As Long, adrColumn As Long: X& X, D7 O/ g5 `
- Dim i As Byte, j As Byte3 u) ]0 j- _& v, G8 S+ h
1 T& n2 ?5 P# D( U& M4 c- 0 `& }6 n! p" `0 T" S
- , |+ i% |/ w/ h0 ?) V: w% y
- btnRefresh.Enabled = False
, U) q ]+ L j3 U - 5 C( F7 Y( p: n
- adrTemp = GetMemory(adrMine)
0 C$ G" f' z% w" G3 G: `' x5 H - adrPoint = GetMemory(adrTemp + &H10)
$ m0 k/ q: q. @6 s - $ |# q# j0 [- i0 y% C
- mineLine = GetMemory(adrPoint + &H8) - 1; X; M% @8 m- ?! }7 y. J
- mineColumn = GetMemory(adrPoint + &HC) - 1- _: t; d3 W9 G2 M8 H
-
! s! d c+ ~3 h' { - adrPoint = GetMemory(adrPoint + &H44)2 i$ l6 q- f4 C6 t: u: g
- adrPoint = GetMemory(adrPoint + &HC)
( _- K" y( Q) X6 A) k0 n, {/ T: m -
! T. V+ l. t2 c: o- ~ -
) q- A2 O2 L8 Z' g; J6 O) c4 l- h2 v - 0 j" v# E' c/ z2 N" i+ g3 j
- For i = 0 To 30
: v2 n7 V4 c- e+ E' F2 A- }' Q - adrColumn = GetMemory(adrPoint + i * 4)& b; U; f' D, X8 \9 e& D
- adrColumn = GetMemory(adrColumn + &HC)" @: ?5 S1 M) V# C& M! k
- For j = 0 To 23
' D Z( U3 [7 I5 W' I4 H4 i) D' U) L - If i > mineColumn Or j > mineLine Then
/ C' j. F7 O9 W$ z* z) x8 h( m - Sheet1.Cells(j + 1, i + 1) = ""9 a: W1 f" P1 {/ W; m
- Else5 l$ r/ T! `' p) O5 c/ m
- Sheet1.Cells(j + 1, i + 1) = GetMemory(adrColumn + j, 1)
- c3 L! z0 E' v8 F8 P1 I - End If% g$ G9 t! i6 ?# S3 J) N) `
- Next j$ N3 v" K3 V1 I: H$ q
- Next i
) {0 k* \8 Y3 a& k/ Y+ T, d. @ - btnRefresh.Enabled = True- h- x. \& C- X+ f$ O
- - n. t3 x M) L( Z
- : z4 X0 h& @2 g, U6 j6 ^
- End Sub; w% D! h9 r7 V+ A5 Q# W+ x2 Z
5 C# |: q3 X9 R1 v4 o- Private Sub UserForm_Initialize() c! H; Q! A: H9 M& ?
- TrainerState (False)
6 v$ L0 K/ f1 {, T - Sheet1.Cells(1, 2) = 1
% V9 H+ U' t8 n& y1 H - End Sub2 }& ~7 a+ u4 g0 \* k+ K
% Z" D- o8 Q# |% D/ S, b; t$ D# B. X, N4 w- Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
- }5 o6 C* N7 r - isOpen (False)# G6 N" s% ~. B& X
- End Sub
Q7 G' T8 r! O& a9 m- D- x. k
复制代码 / B4 n* R6 o& @, o/ E2 j0 a& R& _
" x- a; w2 v0 `& B' V" v. j0 x0 u; ]4 I: V8 x/ S5 S$ K
! m' k# Z; \: U& [ |5 k6 o |
|