【问题标题】:How can I list visible windows and their ID?如何列出可见窗口及其 ID?
【发布时间】:2014-05-13 19:03:22
【问题描述】:

作为一个 Linux 爱好者,当我必须在 Windows 上工作时,我使用 cygwin 和一个名为 VirtuaWin 的虚拟桌面。我已经设置好了,所以我有 12 个活动桌面(每个两个屏幕),并且可以使用 Alt-F1 .. Alt-F12 快速切换。

现在,由于它是 Windows,因此必须定期重新启动。每次发生这种情况时,我都需要重新启动数十个应用程序并将它们移动到我习惯使用它们的桌面(例如,#1 上的 eclipse 和其他代码开发,#3 上的 R,#4 上的 chrome,outlook #8 等)我想做的是编写一个脚本来打开所有这些应用程序并将它们的窗口移动到适当的桌面。

我看到有一个命令行使用 VirtuaWin 在打开的窗口上实现某些功能,即 VirtuaWin.exe -msg <Msg> <wParam> <lParam> 其中“<Msg><wParam><lParam> 是根据标准 Windows SendMessage 函数的数字” (根据 VirtuaWin 中内置的帮助)。显然,VirtuaWin.exe -msg 1049 $wn 2 会将 ID 为 $wn 的窗口移动到第二个桌面。

太好了。但问题是:如何,例如从一个 bash 脚本,我是否可以获取每个应用程序的窗口 ID?

【问题讨论】:

    标签: windows cygwin


    【解决方案1】:

    也许你会发现这个例子很有用。

    #include <windows.h>
    #include <stdio.h>
    
    
    BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) {
    
      printf("HWND: %u\n", hwnd);
    
      char className[256];
      if (GetClassName(hwnd, className, sizeof className) == 0)
        fprintf(stderr, "GetClassName failed.\n");
      else
        printf("Class Name: %s\n", className);
    
      char windowText[256];  // text in the window's title bar
      if (GetWindowText(hwnd, windowText, sizeof windowText) == 0)
        fprintf(stderr, "GetWindowText failed.\n");
      else
        printf("Window Text: %s\n", windowText);
    
      putchar('\n');
    
      return TRUE;
    }
    
    
    int main() {
    
      BOOL ret = EnumDesktopWindows(
        NULL,             // Desktop to enumerate (NULL is default)
        EnumWindowsProc,  // Callback function
        0);               // lParam value to callback function
    
      if (ret == 0) fprintf(stderr, "EnumDesktopWindows failed.\n");
    
      return 0;
    }
    

    【讨论】:

    • 谢谢@ooga,但我正在寻找可以从 cygwin bash 命令行运行的东西。没有这样的命令吗?我正试图将任何 Windows 投资保持在最低限度,而不是真的想在 Windows 上建立 C 开发环境......
    • 不知道有没有这样的命令。但是由于您已经安装了 cygwin,安装 gcc 并编译和运行上述程序将是一小步。
    • 太棒了!比我想象的要简单得多,事实上我已经安装了 gcc。非常感谢!为了完整起见,这是我所做的: 1. 检查 gcc 是否已安装(gcc --version 输出 4.8.2)。 2. cat @ooga 的代码到 wlist.c 3. gcc -o wlist wlist.c 4. ./wlist 并且它完美地工作。现在我需要做的是编辑源以输出“默认 IME”以外的其他内容作为窗口文本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 2014-04-18
    相关资源
    最近更新 更多