【问题标题】:Can I set Windows console position programmatically?我可以以编程方式设置 Windows 控制台位置吗?
【发布时间】:2015-10-08 00:30:36
【问题描述】:

感谢 Google,我知道我可以使用第三方应用程序,如 nircmdcmdow 来调整我的 Windows 位置,但我想知道是否有机会使用 Windows 默认的 cmd 工具来实现相同的目标。

我正在编写一个简单的 C 代码,它在两个单独的窗口中运行两个可执行文件。这就是我并行启动两个应用程序的方式:

int main (void)
{
   system("cmd /c start app1");
   system("cmd /c start app2");
}

问题是它们都在同一个位置打开并坐在彼此的顶部,让我手动移动其中一个。

我有没有机会通过我的代码设置他们的位置?

为了更清楚,我在 Windows 上使用 CygWin。

【问题讨论】:

  • 你可以使用FindWindow获取控制台的窗口句柄,然后SetWindowPos

标签: c cmd console position


【解决方案1】:

当然。目前我能想到的方法至少有两种。

一个有点困难:您必须使用 Win32 调用以编程方式找到它们的窗口并将它们移动到您想要的位置。我想你不想这样做,所以算了吧。

另一种方法是执行以下操作:

system("cmd /c start \"a\" app1");
system("cmd /c start \"b\" app1");

然后转到\\HKEY_CURRENT_USER\Console\a\\HKEY_CURRENT_USER\Console\b 并为WindowSizeWindowPosition 创建值,就像在\\HKEY_CURRENT_USER\Console 中找到的值一样。

(请注意,为了在\\HKEY_CURRENT_USER\Console 中创建WindowPosition 值,您必须首先取消选中命令提示符选项对话框的布局选项卡中的“让窗口选择窗口位置”复选框。)

【讨论】:

  • 感谢 Mike,但这种方法不可移植。对?仍然涉及一些设置。除非你告诉我我可以通过我的代码设置所有这些注册表更改(我非常怀疑)
  • @Bababarghi 您可以使用 WinAPI 使用直接 C 设置所有这些注册表值,但是当您使用 #include <Windows.h> 时,您有点丢掉了可移植性
  • 从您调用cmd.exe 的那一刻起,根据定义,您就是不可移植的,所以也许“便携”不是您要寻找的词。如果您想避免设置,当然可以以编程方式设置注册表值。看看这个参考:MSDN - RegSetValueEx function,然后搜索涉及这个函数调用的示例代码。
【解决方案2】:

最简单的方法可能是使用FindWindow 找到每个控制台窗口的句柄,然后使用SetWindowPos 设置它们的位置:

#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

int main(void)
{
     /* start your applications with known window titles */

     HWND handle1 = FindWindow(NULL, "Console Window 1's Title");
     HWND handle2 = FindWindow(NULL, "Console Window 2's Title");

     SetWindowPos(handle1, NULL, newX1, newY1, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
     SetWindowPos(handle2, NULL, newX2, newY2, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
}

【讨论】:

  • 是我在 Windows 上使用 CygWin 的事实,是我不能使用您提到的方法的原因吗?代码似乎无法识别FindWindow
  • @Bababarghi 嗯...这很好奇。我最初使用Visual Studio编译代码,但我只是在cygwin上用gcc试了一下,没有任何问题。
  • @Bababarghi 我突然想到,您可能需要安装 Visual Studio 才能真正访问 Windows API(使用 Windows.h)。如果可以,您可能想要安装 VS2015 Community(它是免费的,它是 C/C++ Windows 开发 IMO 的最佳 IDE)visualstudio.com/products/visual-studio-community-vs
  • 伙计们,有人建议使用ShellReturn = (int)ShellExecute(NULL, "open", "app1.exe", NULL, NULL, SW_SHOWNORMAL); 这是真的吗?
  • @Bababarghi 你的意思是启动你的应用程序吗? ShellExecute 不会改变窗口位置。
猜你喜欢
  • 2016-05-23
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 2021-04-22
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多