如何使用C#获取和设置另一个应用程序的位置?
例如,我想得到记事本的左上角坐标(让我们说它漂浮在100,400处),此窗口的位置为0,0.
实现这一目标的最简单方法是什么?
我正在尝试使用辅助功能API来改变其他应用程序窗口的位置.我希望做的是从所有应用程序获取屏幕上的所有窗口,然后将它们全部移动到给定的偏移量(比如说5或10)或任何价值).我这样做有困难,因为这是针对我的Objective-C编程的第一天.
这就是我现在正在做的事情.首先,我找到了Windows列表及其PID CGWindowListCopyWindowInfo.然后,对于我AXUIElementCreateApplication用来获取窗口的每个AXUIElementRef窗口.之后,我应该使用AXUIElementCopyAttributeValue属性kAXPositionAttribute(我没有获得正确的位置,总是得到零).最后,我应该将所需的偏移量添加到位置并使用AXUIElementSetAttributeValue属性kAXPositionAttribute和新的位置点(即使我设置了0,0的绝对值,我也会得到运行时错误).
有人可以用我上面描述的片段来帮助我,因为我尝试了很多没有运气的东西.此外,它不应该完全像我决定在上面实现它.如果有更好的方法可以做到这一点,那么我很乐意改变它.
更新: 根据评论中的要求,以下是其中一个尝试的代码段:
// Get all the windows
CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
NSArray* arr = CFBridgingRelease(windowList);
// Loop through the windows
for (NSMutableDictionary* entry in arr)
{
// Get window PID
pid_t pid = [[entry objectForKey:(id)kCGWindowOwnerPID] intValue];
// Get AXUIElement using PID
AXUIElementRef elementRef = AXUIElementCreateApplication(pid);
CFTypeRef position;
CGPoint point;
// Get the position attribute of the window (maybe something is wrong?)
AXUIElementCopyAttributeValue(elementRef, …Run Code Online (Sandbox Code Playgroud) 如何在此之前区分当前最小化窗口是否最大化,而不是C#/ WinForms中的正常状态?
if (WindowState == FormWindowState.Minimized)
{
Properties.Settings.Default.Location = RestoreBounds.Location;
Properties.Settings.Default.Size = RestoreBounds.Size;
Properties.Settings.Default.IsMaximized = ...; // How do I know if the window would be restored to maximized?
}
Run Code Online (Sandbox Code Playgroud)
我想使用应用程序设置使我的窗口的位置和状态持久,我正在关注/sf/answers/131342851/,但如果窗口在关闭时被最小化,我不想要它在下一个应用程序启动时启动最小化(这是目前的答案).
我想要的是窗口如果在最小化时已经最大化则开始最大化,并且如果窗口在最小化时处于正常状态则开始处于正常状态.
当我.show()对话时它通常会向左侧显示一点,我不知道为什么.我想把所有打开的对话框放在中心,所以我用过:
qr = dlgNew.frameGeometry()
cp = QtGui.QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
dlgNew.move(qr.topLeft())
Run Code Online (Sandbox Code Playgroud)
并且:
sG = QtGui.QApplication.desktop().screenGeometry()
x = (sG.width()-dlgMain.width()) / 2
y = (sG.height()-dlgMain.height()) / 2
dlgMain.move(x,y)
dlgMain.show()
Run Code Online (Sandbox Code Playgroud)
我的问题是,哪种是正确/更好的使用方式,有什么区别?
我拆分窗口同时查看所选缓冲区的两个不同部分.如果我切换到其中一个窗口中的另一个缓冲区然后切换回原始缓冲区,我将丢失之前的窗口位置---我将在两个窗口中看到所选缓冲区的相同部分.如何在缓冲开关之间恢复窗口位置?
我正在设计一个使用Adobe Flash CS6的桌面应用程序,使用air 3.2 for desktop(在flash目标设置中).在空中设置中,有一个高级选项卡,可以设置应用程序窗口位置的初始值.我不知道应该如何将它设置到屏幕中间.
这是一个截图:

我有点不确定调用 GetWindowPlacement() 函数的一些返回值的含义,所以我需要您的帮助。
我将调用它来获取隐藏窗口的正常尺寸。
首先,showCmd字段的值从哪里来?在返回结构(WINDOWPLACement 结构)的 Microsoft 文档中,所有可能值的描述都使用动词/动作词;例如,“SW_MAXIMIZE:最大化指定窗口”或“SW_SHOWNOACTIVATE:以最新的大小和位置显示窗口” ”。
我想获取隐藏窗口的尺寸而不先取消隐藏/恢复它,因此对于动词,似乎我必须在调用 GetWindowPlacement 之前调用 SetWindowPlacement() 并将 showCmd 设置为 SW_SHOWNOACTIVATE 。那是对的吗?
那么我是否正确理解该字段获取其各种值的主要(也许是唯一)方式是通过在某处显式调用 SetWindowPlacement() ?
我的第二个问题与 rcNormalPosition 返回值有关。这些数据包括窗户装饰,还是客户价值?
感谢您的时间!
我正在使用 C# 控制台应用程序。如何将应用程序窗口移动到屏幕中央?
框架版本: .NET Core 3.1
窗口大小: 37x20 ( Console.SetWindowSize(37, 20);)
c# windows console-application window-position netcoreapp3.1
我正在使用SetWindowPos并MoveWindow调整窗口大小和居中。它可以正常工作,但是在Windows Media Player或“控制面板”等几个窗口上,当您关闭窗口并再次打开它时,新的调整大小/移动不会反映出来。手动调整大小时,更改将在下次打开窗口时反映出来。即使我打电话UpdateWindow,更改也不会反映出来。我需要发送窗口以便保存更改吗?有RedrawWindow帮助吗?谢谢?