如何列出属于所选窗口 PID 的所有 Wine 窗口句柄?

如何列出属于所选窗口 PID 的所有 Wine 窗口句柄?

我有以下winedbg命令,它提供了所有窗口句柄的列表:

$ winedbg --command "info wnd"
Window handle        Class Name        Style    WndProc  Thread   Text
00010020             #32769            96000000 00000000 00000022 -- Empty --
 006c02e4            tooltips_class32  84800000 00000000 00000115 -- Empty --
 00270280            tooltips_class32  84800001 00000000 00000115 -- Empty --
 002101a6            tooltips_class32  84800001 00000000 000000d6 -- Empty --
 001700c4            tooltips_class32  84800000 00000000 000000d6 -- Empty --
 019a02ca            ComboLBox         44808041 00000000 00000115 -- Empty --
 00700040            tooltips_class32  94800000 00000000 000000d6 -- Empty --
 004106c8            tooltips_class32  84800001 00000000 00000115 -- Empty --
 008f0172            tooltips_class32  84800000 00000000 00000115 -- Empty --
 007402a8            ComboLBox         44808041 00000000 00000115 -- Empty --
 003807de            MetaQuotes::MetaT 14cf8000 00000000 00000115 1809640: MetaT
  00230782           msctls_statusbar3 5400014e 00000000 00000115 -- Empty --
  000f0670           AfxControlBar140s 56002800 00000000 00000115 Standard
   003b065a          Static            50000100 00000000 00000115 -- Empty --
   00110678          ToolbarWindow32   5400186e 00000000 00000115 Timeframes
   0050069a          ToolbarWindow32   5400186e 00000000 00000115 Line Studies
   001f06ac          ToolbarWindow32   5400186e 00000000 00000115 Charts
   001706b2          ToolbarWindow32   5400186e 00000000 00000115 Standard
  001d05e2           AfxControlBar140s 56008200 00000000 00000115 Tester
   001a048e          Afx:00400000:b:00 56000000 00000000 00000115 Terminal
      002c0118       Shell Embedding   56010000 00000000 00000115 Shell Embeddin
 00900386            nsAppShell:EventW 04c00000 00000000 00000115 nsAppShell:Eve
 07bf01c4            nsAppShell:EventW 04c00000 00000000 000000d6 nsAppShell:Eve

我想过滤该列表,使其仅包含属于特定进程 ( terminal.exe/ 000000ce) 的窗口句柄,但问题是上面的列表没有 pid 列表(所以我可以grep),并且我的进程有 33 个不同的线程:

$ winedbg --command "info proc"
 pid      threads  executable (all id:s are in hex)
 000000ce 33       'terminal.exe'
 0000002b 8        'rpcss.exe'
 00000021 4        'explorer.exe'
 0000000e 5        'services.exe'
 0000001a 3        \_ 'plugplay.exe'
 00000012 4        \_ 'winedevice.exe'

可用的步骤可以通过以下方式列出(为了便于阅读,删除了一些步骤):

$ winedbg --command "info thread"
process  tid      prio (all id:s are in hex)
0000000e services.exe
    0000011a    0
    0000001d    0
    00000014    0
    00000010    0
    0000000f    0
000000ce terminal.exe
    000000de    0
    0000013a    0
    0000004f    0
    00000115    0

过滤窗口句柄列表以仅包含属于特定进程的窗口句柄的最简单方法是什么?

是否有任何我不知道的特殊选项,或者我需要几行解析脚本来匹配 pid->thread->wnd id 和grep它?

答案1

以下是列出所选句柄的命令(替换terminal.exe为应用程序名称):

$ winedbg --command "info wnd" | grep -wf <(winedbg --command "info threads" | ex +"/terminal.exe\n\zs/;,/^\S/-p" -scq! /dev/stdin | awk '{print $1}' )

基本上,我们通过特定的线程列表来grep获取所有窗口处理程序()的列表。info wnd该列表由ex编辑器根据输出进行解析,并保存到由( )加载的info threads特殊文件 ( ) 中。 awk 命令用于打印列出线程 ID 的第一列。/dev/fdgrep-f

使用语法说明ex

  • +"cmd"- 运行命令
  • /terminal.exe\n\zs/;,/^\S/-p

    • /pattern1/;,/pattern2/- 范围搜索(;将光标置于第一个模式之后)
    • /terminal.exe\n\zs/- 搜索terminal.exe并标记起点 ( \zs)
    • /^\S/- 选择在第一个非空行处结束
    • -p- 打印上面的选择,减去一行(相关邮政
    • -scq!-s默默地、强行地(!)执行q伊特C命令
    • /dev/stdin- 从标准输入读取内容

相关内容