-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwin32_console_class.html
163 lines (138 loc) · 14.8 KB
/
win32_console_class.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
<!DOCTYPE html>
<html lang="zh_cn" prefix="og: http://ogp.me/ns#">
<head>
<link href="http://gmpg.org/xfn/11" rel="profile">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<!-- Metadata -->
<meta name="description" content="一个游戏程序员。曾经参与开发过<a href='https://www.bing.com/search?q=%E4%BB%99%E4%BE%A3%E5%A5%87%E7%BC%983'>仙侣奇缘3</a>、<a href='http://sh.70yx.com'>水浒传</a>、<a href='https://itunes.apple.com/cn/app/id938688461'>小米运动</a>、<a href='https://itunes.apple.com/cn/app/id1034182617'>米动</a>和<a href='https://www.taptap.com/app/143658'>无限激战</a>">
<meta property="og:description" content="一个游戏程序员。曾经参与开发过<a href='https://www.bing.com/search?q=%E4%BB%99%E4%BE%A3%E5%A5%87%E7%BC%983'>仙侣奇缘3</a>、<a href='http://sh.70yx.com'>水浒传</a>、<a href='https://itunes.apple.com/cn/app/id938688461'>小米运动</a>、<a href='https://itunes.apple.com/cn/app/id1034182617'>米动</a>和<a href='https://www.taptap.com/app/143658'>无限激战</a>">
<meta property="og:title" content="一个Win32控制台类" />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://funcman.me/win32_console_class.html" />
<meta property="og:image" content="https://funcman.me/images/avatar.png" />
<!-- Enable responsiveness on mobile devices-->
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<title>funcman's blog</title>
<!-- CSS -->
<link href="//fonts.googleapis.com/" rel="dns-prefetch">
<link href="//fonts.googleapis.com/css?family=Droid+Serif:400,700,400italic|Abril+Fatface|PT+Sans:400,400italic,700&subset=latin,latin-ext" rel="stylesheet">
<link rel="stylesheet" href="https://funcman.me/theme/css/poole.css" />
<link rel="stylesheet" href="https://funcman.me/theme/css/hyde.css" />
<link rel="stylesheet" href="https://funcman.me/theme/css/syntax.css" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/css/fork-awesome.min.css" crossorigin="anonymous">
<!-- Feeds -->
<link href="https://funcman.me/rss.xml" type="application/atom+xml" rel="alternate" title="funcman's blog Full Atom Feed" />
<!-- Analytics -->
</head>
<body class="theme-base-0e">
<div class="sidebar">
<div class="container sidebar-sticky">
<div class="sidebar-about">
<h1>
<a href="/">
<img class="profile-picture" src="https://funcman.me/images/avatar.png">
funcman's blog
</a>
</h1>
<p class="lead"></p>
<p class="lead">一个游戏程序员。曾经参与开发过<a href='https://www.bing.com/search?q=%E4%BB%99%E4%BE%A3%E5%A5%87%E7%BC%983'>仙侣奇缘3</a>、<a href='http://sh.70yx.com'>水浒传</a>、<a href='https://itunes.apple.com/cn/app/id938688461'>小米运动</a>、<a href='https://itunes.apple.com/cn/app/id1034182617'>米动</a>和<a href='https://www.taptap.com/app/143658'>无限激战</a> </p>
<p></p>
</div>
<nav class="sidebar-social">
<a class="sidebar-social-item" href="mailto:[email protected]">
<i class="fa fa-envelope"></i>
</a>
<a class="sidebar-social-item" href="https://twitter.com/funcman" target="_blank">
<i class="fa fa-twitter"></i>
</a>
<a class="sidebar-social-item" href="https://github.com/funcman" target="_blank">
<i class="fa fa-github"></i>
</a>
<a class="sidebar-social-item" href="https://funcman.me/rss.xml">
<i class="fa fa-rss"></i>
</a>
</nav>
</div>
</div> <div class="content container">
<div class="post">
<h1 class="post-title">一个Win32控制台类</h1>
<span class="post-date">周日 06 六月 2010</span>
<p>对于编写Win32程序,尤其是游戏这种实时性高的程序来说,断点调试未必是最合适的调试方法。很多时候,我们更渴望看到实时打印的调试信息。</p>
<p>一种方法是使用VC的调试函数OutputDebugString(),将信息输出给VC调试控制台。还有一种方法是在Win32控制台工程的基础上创建窗口程序(入口为main而非WinMain)。可以用宏来控制编译,使Debug版本时有控制台,Release版本没有控制台,像这样:</p>
<div class="highlight"><pre><span></span><code><span class="c1">// 一个简单的方法</span>
<span class="cp">#ifndef _DEBUG</span>
<span class="kt">int</span><span class="w"> </span><span class="n">WINAPI</span><span class="w"> </span><span class="nf">WinMain</span><span class="p">(</span><span class="n">HINSTANCE</span><span class="w"> </span><span class="n">hInstance</span><span class="p">,</span><span class="w"> </span><span class="n">HINSTANCE</span><span class="w"> </span><span class="n">hPrevInstance</span><span class="p">,</span><span class="w"> </span><span class="n">LPSTR</span><span class="w"> </span><span class="n">lpCmdLine</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">nCmdShow</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="cp">#else</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">main</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">argc</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="o">**</span><span class="w"> </span><span class="n">argv</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="cp">#endif</span><span class="c1">//_DEBUG</span>
</code></pre></div>
<p>但这种方法并不灵活,这里介绍一个直接用Win32 API获得控制台的方法。一切皆在代码中:</p>
<div class="highlight"><pre><span></span><code><span class="c1">// DbgCon.h</span>
<span class="cp">#ifndef DBGCON_H</span>
<span class="cp">#define DBGCON_H</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><windows.h></span><span class="c1">;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><stdio.h></span><span class="c1">;</span>
<span class="k">class</span><span class="w"> </span><span class="nc">DbgCon</span><span class="w"> </span><span class="p">{</span>
<span class="k">public</span><span class="o">:</span>
<span class="w"> </span><span class="n">DbgCon</span><span class="p">();</span>
<span class="w"> </span><span class="o">~</span><span class="n">DbgCon</span><span class="p">();</span>
<span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">Show</span><span class="p">();</span>
<span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">Hide</span><span class="p">();</span>
<span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">Top</span><span class="p">();</span>
<span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">NoTop</span><span class="p">();</span>
<span class="k">private</span><span class="o">:</span>
<span class="w"> </span><span class="n">HWND</span><span class="w"> </span><span class="n">HWnd_</span><span class="p">;</span>
<span class="w"> </span><span class="kt">FILE</span><span class="o">*</span><span class="w"> </span><span class="n">ConIn_</span><span class="p">;</span>
<span class="w"> </span><span class="kt">FILE</span><span class="o">*</span><span class="w"> </span><span class="n">ConOut_</span><span class="p">;</span>
<span class="p">};</span>
<span class="cp">#endif</span><span class="c1">//DBGCON_H</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="c1">// DbgCon.cpp</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">"DbgCon.h"</span>
<span class="n">DbgCon</span><span class="o">::</span><span class="n">DbgCon</span><span class="p">()</span>
<span class="o">:</span><span class="w"> </span><span class="n">HWnd_</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="p">,</span><span class="w"> </span><span class="n">ConIn_</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="p">,</span><span class="w"> </span><span class="n">ConOut_</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// 申请一个控制台</span>
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="w"> </span><span class="n">AllocConsole</span><span class="p">()</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">HWnd_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">GetConsoleWindow</span><span class="p">();</span>
<span class="w"> </span><span class="c1">// 把管道转入该控制台</span>
<span class="w"> </span><span class="n">freopen_s</span><span class="p">(</span><span class="o">&</span><span class="n">ConIn_</span><span class="p">,</span><span class="w"> </span><span class="s">"CONIN$"</span><span class="p">,</span><span class="w"> </span><span class="s">"r+t"</span><span class="p">,</span><span class="w"> </span><span class="n">stdin</span><span class="p">);</span>
<span class="w"> </span><span class="n">freopen_s</span><span class="p">(</span><span class="o">&</span><span class="n">ConOut_</span><span class="p">,</span><span class="w"> </span><span class="s">"CONOUT$"</span><span class="p">,</span><span class="w"> </span><span class="s">"w+t"</span><span class="p">,</span><span class="w"> </span><span class="n">stdout</span><span class="p">);</span>
<span class="w"> </span><span class="c1">// 去掉控制台窗口上的关闭功能</span>
<span class="w"> </span><span class="c1">//(控制台窗口上的关闭操作会关掉整个进程)</span>
<span class="w"> </span><span class="n">HMENU</span><span class="w"> </span><span class="n">HMenu</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">GetSystemMenu</span><span class="p">(</span><span class="n">HWnd_</span><span class="p">,</span><span class="w"> </span><span class="n">FALSE</span><span class="p">);</span>
<span class="w"> </span><span class="n">RemoveMenu</span><span class="p">(</span><span class="n">HMenu</span><span class="p">,</span><span class="w"> </span><span class="n">SC_CLOSE</span><span class="p">,</span><span class="w"> </span><span class="n">MF_BYCOMMAND</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
<span class="n">DbgCon</span><span class="o">::~</span><span class="n">DbgCon</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">FreeConsole</span><span class="p">();</span>
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="w"> </span><span class="n">ConOut_</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">fclose</span><span class="p">(</span><span class="n">ConOut_</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="w"> </span><span class="n">ConIn_</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">fclose</span><span class="p">(</span><span class="n">ConIn_</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
<span class="kt">void</span><span class="w"> </span><span class="n">DbgCon</span><span class="o">::</span><span class="n">Show</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// 显示控制台窗口(恢复到正常状态)</span>
<span class="w"> </span><span class="n">ShowWindow</span><span class="p">(</span><span class="n">HWnd_</span><span class="p">,</span><span class="w"> </span><span class="n">SW_SHOWNORMAL</span><span class="p">);</span>
<span class="p">}</span>
<span class="kt">void</span><span class="w"> </span><span class="n">DbgCon</span><span class="o">::</span><span class="n">Hide</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// 隐藏控制台窗口</span>
<span class="w"> </span><span class="n">ShowWindow</span><span class="p">(</span><span class="n">HWnd_</span><span class="p">,</span><span class="w"> </span><span class="n">SW_HIDE</span><span class="p">);</span>
<span class="p">}</span>
<span class="kt">void</span><span class="w"> </span><span class="n">DbgCon</span><span class="o">::</span><span class="n">Top</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// 置顶控制台窗口</span>
<span class="w"> </span><span class="n">SetWindowPos</span><span class="p">(</span><span class="n">HWnd_</span><span class="p">,</span><span class="w"> </span><span class="n">HWND_TOPMOST</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="n">SWP_NOMOVE</span><span class="o">||</span><span class="n">SWP_NOSIZE</span><span class="p">);</span>
<span class="p">}</span>
<span class="kt">void</span><span class="w"> </span><span class="n">DbgCon</span><span class="o">::</span><span class="n">NoTop</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// 取消置顶</span>
<span class="w"> </span><span class="n">SetWindowPos</span><span class="p">(</span><span class="n">HWnd_</span><span class="p">,</span><span class="w"> </span><span class="n">HWND_NOTOPMOST</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="n">SWP_NOMOVE</span><span class="o">||</span><span class="n">SWP_NOSIZE</span><span class="p">);</span><span class="w"> </span>
<span class="p">}</span>
</code></pre></div>
</div>
</div>
</body>
</html>