如何列出可见窗口及其ID?

时间:2014-05-13 19:03:23

标签: windows cygwin

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

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

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

大。但问题是:如何从例如一个bash脚本,我获取每个应用程序的窗口ID吗?

1 个答案:

答案 0 :(得分: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;
}