EnumThreadWindows枚举线程的所有窗口

本文介绍了一个使用 C++ 实现的枚举指定线程所有窗口的示例代码。通过该代码可以找到并操作特定窗口,例如打开对话框并关闭。涉及窗口句柄、线程ID获取及窗口消息发送等关键技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<p style="margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px; "><span class="pln">BOOL CALLBACK </span><span class="typ" style="color: rgb(102, 0, 102); ">EnumThreadWndProc</span><span class="pun" style="color: rgb(102, 102, 0); ">(</span><span class="pln">HWND hwnd</span><span class="pun" style="color: rgb(102, 102, 0); ">,</span><span class="pln"> LPARAM lParam </span><span class="pun" style="color: rgb(102, 102, 0); ">)</span>
<span class="pun" style="color: rgb(102, 102, 0); ">{</span><span class="pln">   </span>
<span class="pln">    std</span><span class="pun" style="color: rgb(102, 102, 0); ">::</span><span class="pln">list</span><span class="pun" style="color: rgb(102, 102, 0); "><</span><span class="pln">HWND</span><span class="pun" style="color: rgb(102, 102, 0); ">>*</span><span class="pln"> plist </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0); ">(</span><span class="pln">std</span><span class="pun" style="color: rgb(102, 102, 0); ">::</span><span class="pln">list</span><span class="pun" style="color: rgb(102, 102, 0); "><</span><span class="pln">HWND</span><span class="pun" style="color: rgb(102, 102, 0); ">>*)</span><span class="pln">lParam</span><span class="pun" style="color: rgb(102, 102, 0); ">;</span>
<span class="pln">    plist</span><span class="pun" style="color: rgb(102, 102, 0); ">-></span><span class="pln">push_back</span><span class="pun" style="color: rgb(102, 102, 0); ">(</span><span class="pln">hwnd</span><span class="pun" style="color: rgb(102, 102, 0); ">);</span>
<span class="pln">    </span><span class="kwd" style="color: rgb(0, 0, 136); ">return</span><span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136); ">true</span><span class="pun" style="color: rgb(102, 102, 0); ">;</span>
<span class="pun" style="color: rgb(102, 102, 0); ">}</span></p><p style="margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px; ">
</p><p style="margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px; "><span class="kwd" style="color: rgb(0, 0, 136); ">int</span><span class="pln"> main</span><span class="pun" style="color: rgb(102, 102, 0); ">(</span><span class="kwd" style="color: rgb(0, 0, 136); ">void</span><span class="pun" style="color: rgb(102, 102, 0); ">)</span>
<span class="pun" style="color: rgb(102, 102, 0); ">{</span>
<span class="pln">    </span><span class="typ" style="color: rgb(102, 0, 102); ">CWnd</span><span class="pun" style="color: rgb(102, 102, 0); ">*</span><span class="pln"> pWnd </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln"> </span><span class="typ" style="color: rgb(102, 0, 102); ">CWnd</span><span class="pun" style="color: rgb(102, 102, 0); ">::</span><span class="typ" style="color: rgb(102, 0, 102); ">FindWindow</span><span class="pun" style="color: rgb(102, 102, 0); ">(</span><span class="pln">NULL</span><span class="pun" style="color: rgb(102, 102, 0); ">,</span><span class="pln"> </span><span class="str" style="color: rgb(0, 136, 0); ">"360云盘"</span><span class="pun" style="color: rgb(102, 102, 0); ">);</span>
<span class="pln">    </span><span class="kwd" style="color: rgb(0, 0, 136); ">if</span><span class="pun" style="color: rgb(102, 102, 0); ">(</span><span class="pln">pWnd</span><span class="pun" style="color: rgb(102, 102, 0); ">)</span>
<span class="pln">    </span><span class="pun" style="color: rgb(102, 102, 0); ">{</span>
<span class="pln">        DWORD dwtheadid</span><span class="pun" style="color: rgb(102, 102, 0); ">;</span>
<span class="pln">        DWORD dwProcessId</span><span class="pun" style="color: rgb(102, 102, 0); ">;</span>
<span class="pln">        </span><span class="com" style="color: rgb(136, 0, 0); ">//根据窗口得到线程ID,进程ID</span>
<span class="pln">        dwtheadid </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln"> </span><span class="typ" style="color: rgb(102, 0, 102); ">GetWindowThreadProcessId</span><span class="pun" style="color: rgb(102, 102, 0); ">(</span><span class="pln">pWnd</span><span class="pun" style="color: rgb(102, 102, 0); ">-></span><span class="typ" style="color: rgb(102, 0, 102); ">GetSafeHwnd</span><span class="pun" style="color: rgb(102, 102, 0); ">(),&</span><span class="pln">dwProcessId</span><span class="pun" style="color: rgb(102, 102, 0); ">);</span>

<span class="pln">        std</span><span class="pun" style="color: rgb(102, 102, 0); ">::</span><span class="pln">list</span><span class="pun" style="color: rgb(102, 102, 0); "><</span><span class="pln">HWND</span><span class="pun" style="color: rgb(102, 102, 0); ">></span><span class="pln"> list1</span><span class="pun" style="color: rgb(102, 102, 0); ">;</span>
<span class="pln">        </span><span class="com" style="color: rgb(136, 0, 0); ">//枚举线程的所有窗口</span>
<span class="pln">        </span><span class="typ" style="color: rgb(102, 0, 102); ">EnumThreadWindows</span><span class="pun" style="color: rgb(102, 102, 0); ">(</span><span class="pln">dwtheadid</span><span class="pun" style="color: rgb(102, 102, 0); ">,</span><span class="typ" style="color: rgb(102, 0, 102); ">EnumThreadWndProc</span><span class="pun" style="color: rgb(102, 102, 0); ">,</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0); ">(</span><span class="pln">LPARAM</span><span class="pun" style="color: rgb(102, 102, 0); ">)&</span><span class="pln">list1</span><span class="pun" style="color: rgb(102, 102, 0); ">);</span>

<span class="pln">        </span><span class="com" style="color: rgb(136, 0, 0); ">//发消息给窗口打开一个对话框</span>
<span class="pln">        pWnd</span><span class="pun" style="color: rgb(102, 102, 0); ">-></span><span class="typ" style="color: rgb(102, 0, 102); ">PostMessage</span><span class="pun" style="color: rgb(102, 102, 0); ">(</span><span class="pln">WM_USER</span><span class="pun" style="color: rgb(102, 102, 0); ">+</span><span class="lit" style="color: rgb(0, 102, 102); ">2017</span><span class="pun" style="color: rgb(102, 102, 0); ">,</span><span class="pln"> </span><span class="lit" style="color: rgb(0, 102, 102); ">0</span><span class="pun" style="color: rgb(102, 102, 0); ">,</span><span class="pln"> </span><span class="lit" style="color: rgb(0, 102, 102); ">0x00000002</span><span class="pun" style="color: rgb(102, 102, 0); ">);</span>
<span class="pln">        </span><span class="typ" style="color: rgb(102, 0, 102); ">Sleep</span><span class="pun" style="color: rgb(102, 102, 0); ">(</span><span class="lit" style="color: rgb(0, 102, 102); ">3000</span><span class="pun" style="color: rgb(102, 102, 0); ">);</span>
<span class="pln">       </span>
<span class="pln">        std</span><span class="pun" style="color: rgb(102, 102, 0); ">::</span><span class="pln">list</span><span class="pun" style="color: rgb(102, 102, 0); "><</span><span class="pln">HWND</span><span class="pun" style="color: rgb(102, 102, 0); ">></span><span class="pln"> list2</span><span class="pun" style="color: rgb(102, 102, 0); ">;</span>
<span class="pln">        </span><span class="com" style="color: rgb(136, 0, 0); ">//再次枚举线程的所有窗口</span>
<span class="pln">        </span><span class="typ" style="color: rgb(102, 0, 102); ">EnumThreadWindows</span><span class="pun" style="color: rgb(102, 102, 0); ">(</span><span class="pln">dwtheadid</span><span class="pun" style="color: rgb(102, 102, 0); ">,</span><span class="typ" style="color: rgb(102, 0, 102); ">EnumThreadWndProc</span><span class="pun" style="color: rgb(102, 102, 0); ">,</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0); ">(</span><span class="pln">LPARAM</span><span class="pun" style="color: rgb(102, 102, 0); ">)&</span><span class="pln">list2</span><span class="pun" style="color: rgb(102, 102, 0); ">);</span>
<span class="pln">        </span>
<span class="pln">        </span><span class="com" style="color: rgb(136, 0, 0); ">//查找刚打开的那个对话框</span>
<span class="pln">        std</span><span class="pun" style="color: rgb(102, 102, 0); ">::</span><span class="pln">list</span><span class="pun" style="color: rgb(102, 102, 0); "><</span><span class="pln">HWND</span><span class="pun" style="color: rgb(102, 102, 0); ">>::</span><span class="pln">iterator it </span><span class="pun" style="color: rgb(102, 102, 0); ">=</span><span class="pln"> list2</span><span class="pun" style="color: rgb(102, 102, 0); ">.</span><span class="kwd" style="color: rgb(0, 0, 136); ">begin</span><span class="pun" style="color: rgb(102, 102, 0); ">();</span>
<span class="pln">        </span><span class="kwd" style="color: rgb(0, 0, 136); ">for</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0); ">(;</span><span class="pln"> it</span><span class="pun" style="color: rgb(102, 102, 0); ">!=</span><span class="pln">list2</span><span class="pun" style="color: rgb(102, 102, 0); ">.</span><span class="kwd" style="color: rgb(0, 0, 136); ">end</span><span class="pun" style="color: rgb(102, 102, 0); ">();</span><span class="pln"> it</span><span class="pun" style="color: rgb(102, 102, 0); ">++)</span>
<span class="pln">        </span><span class="pun" style="color: rgb(102, 102, 0); ">{</span>
<span class="pln">            </span><span class="kwd" style="color: rgb(0, 0, 136); ">if</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0); ">(</span><span class="pln">std</span><span class="pun" style="color: rgb(102, 102, 0); ">::</span><span class="pln">find</span><span class="pun" style="color: rgb(102, 102, 0); ">(</span><span class="pln">list1</span><span class="pun" style="color: rgb(102, 102, 0); ">.</span><span class="kwd" style="color: rgb(0, 0, 136); ">begin</span><span class="pun" style="color: rgb(102, 102, 0); ">(),</span><span class="pln">list1</span><span class="pun" style="color: rgb(102, 102, 0); ">.</span><span class="kwd" style="color: rgb(0, 0, 136); ">end</span><span class="pun" style="color: rgb(102, 102, 0); ">(),</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0); ">*</span><span class="pln">it</span><span class="pun" style="color: rgb(102, 102, 0); ">)==</span><span class="pln">list1</span><span class="pun" style="color: rgb(102, 102, 0); ">.</span><span class="kwd" style="color: rgb(0, 0, 136); ">end</span><span class="pun" style="color: rgb(102, 102, 0); ">())</span>
<span class="pln">            </span><span class="pun" style="color: rgb(102, 102, 0); ">{</span>
<span class="pln">                </span><span class="kwd" style="color: rgb(0, 0, 136); ">break</span><span class="pun" style="color: rgb(102, 102, 0); ">;</span>
<span class="pln">            </span><span class="pun" style="color: rgb(102, 102, 0); ">}</span>
<span class="pln">        </span><span class="pun" style="color: rgb(102, 102, 0); ">}</span>

<span class="pln">        </span><span class="kwd" style="color: rgb(0, 0, 136); ">if</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0); ">(</span><span class="pln">it</span><span class="pun" style="color: rgb(102, 102, 0); ">!=</span><span class="pln">list2</span><span class="pun" style="color: rgb(102, 102, 0); ">.</span><span class="kwd" style="color: rgb(0, 0, 136); ">end</span><span class="pun" style="color: rgb(102, 102, 0); ">()</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0); ">)</span>
<span class="pln">        </span><span class="pun" style="color: rgb(102, 102, 0); ">{</span>
<span class="pln">            </span><span class="com" style="color: rgb(136, 0, 0); ">//发送ESC键,关闭它</span>
<span class="pln">            </span><span class="typ" style="color: rgb(102, 0, 102); ">PostMessage</span><span class="pun" style="color: rgb(102, 102, 0); ">(*</span><span class="pln">it</span><span class="pun" style="color: rgb(102, 102, 0); ">,</span><span class="pln">WM_KEYDOWN</span><span class="pun" style="color: rgb(102, 102, 0); ">,</span><span class="pln"> VK_ESCAPE</span><span class="pun" style="color: rgb(102, 102, 0); ">,</span><span class="pln"> </span><span class="lit" style="color: rgb(0, 102, 102); ">0x00010001</span><span class="pun" style="color: rgb(102, 102, 0); ">);</span>
<span class="pln">        </span><span class="pun" style="color: rgb(102, 102, 0); ">}</span>
<span class="pln">    </span><span class="pun" style="color: rgb(102, 102, 0); ">}</span>
<span class="pln">    </span><span class="kwd" style="color: rgb(0, 0, 136); ">return</span><span class="pln"> </span><span class="lit" style="color: rgb(0, 102, 102); ">0</span><span class="pun" style="color: rgb(102, 102, 0); ">;</span>
<span class="pun" style="color: rgb(102, 102, 0); ">}</span></p>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值