- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
使用 user32.dll
和 C# 我写了你在下面看到的方法。使用窗口的进程句柄,它将在提供的 (x, y)
处设置窗口位置。地点。
但是,在多监视器环境中,下面的代码仅将窗口位置设置为主监视器。我也希望能够选择哪个显示器。
有人可以解释一下如何使用 SetWindowPos
来实现这一点吗?或者可能与另一个 user32.dll
的组合功能?
[DllImport("user32.dll", SetLastError = true)]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);
private const int SWP_NOSIZE = 0x0001;
private const int SWP_NOZORDER = 0x0004;
private const int SWP_SHOWWINDOW = 0x0040;
public static void SetWindowPosition(Process p, int x, int y)
{
IntPtr handle = p.MainWindowHandle;
if (handle != IntPtr.Zero)
{
SetWindowPos(handle, IntPtr.Zero, x, y, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_SHOWWINDOW);
}
}
基于 Jimi 评论的解决方案。
(0, 0)
)的左侧。
(0, 0) - (1920, 0) = (-1920, 0)
现在,当我拨打
SetWindowPosition
在我的客户端代码中,我这样称呼它:
SetWindowPosition(Process p, -1920, 0);
注意:如果显示器的分辨率不同,我不知道你会怎么做。这是一个更复杂的话题,而不是我要问的问题。此外,我认为没有必要深入探讨该主题,因为上面的简单示例解决了我的所有问题。
最佳答案
系统显示配置和 VirtualScreen
在 Windows 系统中,Primary Screen (编程视角)是左上角位置设置为的显示设备。 Point(0,0)
.
这意味着显示器位于 左 主屏幕,将有 负 X
坐标(如果显示为纵向布局,Y
坐标可能为负)。
上的显示右 将有 正 X
坐标(如果显示为纵向布局,Y
坐标可能为负)。
显示在主屏幕左侧 :
换句话说,显示为负 Point.X
起源。Point.X
origin 是前面所有 Screens[].Width
的总和, 从 Point.X
中减去主屏幕的原点坐标。
显示在主屏幕右侧 :
换句话说,显示为正值 Point.X
起源。Point.X
origin 是前面所有 Screens[].Width
的总和, 主要包括 , 添加到原点 Point.X
主屏幕的坐标。
关于 Dpi 意识的重要说明 :
如果应用程序不是 DPI Aware,则所有这些措施都可能受到系统执行的虚拟化和自动 DPI 缩放的影响。所有度量都将统一为默认的 96 Dpi:应用程序将接收缩放值。这还包括从非 Dpi ware Win32 API 函数中检索到的值。见:
High DPI Desktop Application Development on Windows
在 中启用对所有目标系统的支持app.manifest
文件,取消注释所需的部分。
添加/取消注释 DpiAware and DpiAwareness sections在 app.manifest
文件。
PerMonitorV2 Dpi Awareness模式可以在app.config
中设置文件(可从 Windows 10 Creators Edition 获得)。
另见:
DPI and Device-Independent Pixels
Mixed-Mode DPI Scaling and DPI-aware APIs
示例:
考虑一个带有 3 个监视器的系统:
PrimaryScreen (\\.\DISPLAY1): Width: (1920 x 1080)
Secondary Display (Right) (\\.\DISPLAY2): Width: (1360 x 768)
Secondary Display (Left) (\\.\DISPLAY3): Width: (1680 x 1050)
PrimaryScreen:
Bounds: (0, 0, 1920, 1080) Left: 0 Right: 1920 Top: 0 Bottom: 1080
Secondary Display (Right):
Bounds: (1360, 0, 1360, 768) Left: 1360 Right: 2720 Top: 0 Bottom: 768
Secondary Display (Left):
Bounds: (-1680, 0, 1680, 1050) Left: -1680 Right: 0 Top: 0 Bottom: 1050
\\.\DISPLAY3
,坐标将相应修改:
Screen
宽度 :所有
Screens
的总和宽度。
Screen
.
Size
由
SystemInformation.PrimaryMonitorSize 举报
\\.\DISPLAY[N]
属性。
VirtualScreen
界限是:
Bounds: (-1680, 0, 3280, 1080) Left: -1680 Right: 3280 Top: 0 Bottom: 1080
在第二种配置中,
VirtualScreen
界限是:
Bounds: (0, 0, 4960, 1080) Left: 0 Right: 4960 Top: 0 Bottom: 1080
Screen.FromControl([Control reference])
Screen
包含指定
Control
的最大部分的对象引用。
Screen.FromHandle([Window Handle])
Screen
包含
Handle
引用的 Window\Control 的最大部分的对象
Screen.FromPoint([Point])
Screen
包含特定
Point
的对象
Screen.FromRectangle([Rectangle])
Screen
包含指定
Rectangle
的最大部分的对象
Screen.GetBounds()
(重载)
Rectangle
引用包含以下内容的屏幕边界的结构:
Point
Rectangle
Control
引用 \\.\DISPLAY[N]
在其中显示当前表单,请调用(例如):
Screen.FromHandle(this);
要确定在哪个屏幕中显示辅助表单:
var f2 = new Form2();
f2.Location = new Point(-1400, 100);
f2.Show();
Rectangle screenSize = Screen.GetBounds(f2);
Screen screen = Screen.FromHandle(f2.Handle);
screenSize
将等于
\\.\DISPLAY3
界限。
screen
将是
Screen
代表
\\.\DISPLAY3
的对象属性。
screen
对象也会报告
\\.\DISPLAY[N]
Screen
的名称其中
form2
显示。
hMonitor
Screen 对象的句柄 :
hMonitor
返回调用
[Screen].GetHashCode();
IntPtr monitorHwnd = new IntPtr([Screen].GetHashCode());
或者使用相同的 native Win32 函数:
[Flags]
internal enum MONITOR_DEFAULTTO
{
NULL = 0x00000000,
PRIMARY = 0x00000001,
NEAREST = 0x00000002,
}
[DllImport("User32.dll", SetLastError = true)]
internal static extern IntPtr MonitorFromWindow(IntPtr hwnd, MONITOR_DEFAULTTO dwFlags);
[DllImport("User32.dll", SetLastError = true)]
internal static extern IntPtr MonitorFromPoint([In] POINT pt, MONITOR_DEFAULTTO dwFlags);
[DllImport("User32.dll", SetLastError = true)]
internal static extern IntPtr MonitorFromRect([In] ref RECT lprc, MONITOR_DEFAULTTO dwFlags);
WM_WINDOWPOSCHANGED
留言,调用 MonitoFromWindow
,然后 GetScaleFactorForMonitor以确定是否有 DPI 更改并最终对新设置使用react。 lpszDriver
GDI 的参数
CreateDC功能。它将返回
Graphics.FromHdc 的显示器的 hDC可用于创建有效的 Graphics 对象,该对象将允许在特定屏幕上绘制。
[DllImport("gdi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
internal static extern IntPtr CreateDC(string lpszDriver, string lpszDevice, string lpszOutput, IntPtr lpInitData);
[DllImport("gdi32.dll", SetLastError = true, EntryPoint = "DeleteDC")]
internal static extern bool DeleteDC([In] IntPtr hdc);
public static IntPtr CreateDCFromDeviceName(string deviceName)
{
return CreateDC(deviceName, null, null, IntPtr.Zero);
}
Screen[] screens = Screen.AllScreens;
IntPtr screenDC1 = CreateDCFromDeviceName(screens[0].DeviceName);
IntPtr screenDC2 = CreateDCFromDeviceName(screens[1].DeviceName);
using (Graphics g1 = Graphics.FromHdc(screenDC1))
using (Graphics g2 = Graphics.FromHdc(screenDC2))
using (Pen pen = new Pen(Color.Red, 10))
{
g1.DrawRectangle(pen, new Rectangle(new Point(100, 100), new Size(200, 200)));
g2.DrawRectangle(pen, new Rectangle(new Point(100, 100), new Size(200, 200)));
}
DeleteDC(screenDC1);
DeleteDC(screenDC2);
关于c# - 在多个显示器上使用 SetWindowPos,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53012896/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!