【问题标题】:Visual Studio Console Window LocationVisual Studio 控制台窗口位置
【发布时间】:2011-11-20 02:38:50
【问题描述】:

是否可以让 Visual Studio 中的控制台窗口在每次编译时都显示在屏幕上的相同位置?

每次编译时我都必须移动它,因为它的起始位置会重叠。

【问题讨论】:

  • Ehm,你说的是调试时的控制台窗口吗?
  • 大卫,这是一个糟糕的建议,但看起来我需要创建一个框架来手动分配控制台窗口。有什么方法可以在我的 IDE 设置中简单地更改它?
  • @Aux 不,你没有,你只是使用 Win32 API。

标签: c++ visual-studio-2008 debugging


【解决方案1】:

默认情况下,您可以更改每个应用程序的控制台窗口设置,并且窗口将在下次运行此应用程序时保存它们。您可以通过单击控制台标题栏上的右键,然后选择“属性和布局”选项卡来更改开始位置。然后取消选中“让系统定位窗口”复选框并输入您想要的坐标。

不幸的是,当您在没有调试器 (Ctrl + F5) 的情况下运行应用程序时,Visual Studio 将启动 cmd.exe /c <your app> 命令。因此,更改此窗口上的属性也会更改系统中所有控制台会话的设置。

这不适用于调试运行,因为在调试器下 VS 仅启动应用程序,因此设置仅适用于其控制台窗口。

【讨论】:

  • 你今天至少让某人开心。谢谢。
  • 谢谢!我一直在 Visual Studio 之上,但现在不是。
【解决方案2】:

我带着同样的问题来到这里,并且确信 VS 中必须有一个选项。我最终编写了一个在后台运行的快速 python 脚本,搜索窗口并设置它的最后位置。还可以选择将其设置为始终在顶部,并将位置保留在文件中。希望能帮助别人。

import win32api
import win32gui
import win32con
import msvcrt
import sys
import time
import threading
import pywintypes
import argparse
import re
import weakref
import pickle

def log_message(message,*args):
     print(("[%s]" % message).ljust(30) ," ... ",*(str(arg) for arg in args))

def make_file_name(arguments):
    return arguments.save_file_name or "window_" + re.sub("[^a-z]","_",arguments.title_text,flags=re.IGNORECASE)

def update_proc(flags,arguments):            
    found_pos  = (0,0,500,500)
    found_hwnd = -1

    if arguments.save_to_file and not arguments.reset:
        load_file_name = make_file_name(arguments)
        try:
            with open(load_file_name,"rb") as load_file:
                found_pos = pickle.load(load_file)
        except:pass

    while not flags.exit: 
        try:
            hwnd = win32gui.FindWindow(arguments.class_text,arguments.title_text)
            if not hwnd: continue

            if hwnd != found_hwnd:
                log_message("new window found",hwnd)
                for _ in range(10):
                    win32gui.SetWindowPos(hwnd,0 if not arguments.on_top else win32con.HWND_TOPMOST,*found_pos,0)
                    time.sleep(0.01)
                log_message("setting window position",found_pos)

            found_hwnd = hwnd

            time.sleep(0.1)

            if win32gui.IsIconic(found_hwnd):
                continue

            rect = win32gui.GetWindowRect(found_hwnd)
            new_pos = (rect[0],rect[1],rect[2]-rect[0],rect[3]-rect[1])

            #ignore negative pos
            if True in [ r < 0 for r in new_pos[0:2] ]:
                continue

            if new_pos == found_pos:
                continue


            if arguments.save_to_file:
                log_message("saving position",new_pos)
                save_file_name = make_file_name(arguments)
                try:
                    with open(save_file_name,"wb") as save_file:
                        pickle.dump(new_pos,save_file)
                except:pass
            else:
                log_message("updading stored position",new_pos)

            found_pos = new_pos
        except pywintypes.error:pass

if __name__ == "__main__":

    parser = argparse.ArgumentParser()
    parser.add_argument("-s","--savetofile",help="Save window settings to a file",action="store_true",dest="save_to_file")
    parser.add_argument("-sfn","--savefilename",type=str,help="File name to use if --savetofile specified (or a default is generated)",dest="save_file_name")
    parser.add_argument("-ot","--ontop",help="Window Always Ontop",dest="on_top",action="store_true")
    parser.add_argument("-c","--class",type=str,help="Window Class Name",dest="class_text")
    parser.add_argument("-r","--reset",help="Reset Window Position",action="store_true")        
    parser.add_argument("-t","--title",type=str,help="Window Title Text",required=True,dest="title_text")

    arguments = parser.parse_args()

    flags = type("", (), {"exit":False})()
    update_thread = threading.Thread(target=update_proc,args=[weakref.proxy(flags),arguments])
    update_thread.start()

    if arguments.save_to_file:
        log_message("saving to file",make_file_name(arguments))

    while True:

        if flags.exit: break
        key = msvcrt.getch()

        if key == b'q':
            flags.exit = True
            log_message("exiting")
            break

    update_thread.join()

【讨论】:

    猜你喜欢
    • 2020-11-09
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多