我正在尝试检索监视器ID,如Windows显示属性(#1,2等等)中所示,但我似乎无法找到方法.我尝试过使用EnumDisplayMonitors和EnumDisplayDevices.它们都返回类似"\.\ DISPLAY1"的内容.但是,此数字并不总是与Windows显示的数字相匹配,尤其是当使用2个视频卡驱动3个或更多显示器时.我是否缺少检索此信息的API调用,或者有没有办法从注册表或其他地方获取它?谢谢!
我尝试过这些方法:
Win32: EnumDisplayMonitors,EnumDisplayDevices:这些都没有返回活动的监视器,也没有一个返回正确的ID.
WMI: "select*from Win32_DesktopMonitor"不会返回所有监视器,也没有ID.
注册表:我在不同地点找到了显示器,我找到的地方都没有我想要的信息.
任何帮助深表感谢.:)
更新:这些是我要查找的监视器编号:

我正在使用VNC(客户端上的tigervnc-1.1.0,服务器上的RealVNC-4.1.2)连接到远程系统.客户端系统有两个使用Nvidia twinview的显示器,有效分辨率为3200x1200.
当我告诉vncviewer使用全屏时,远程系统窗口(1600x1200)在两个监视器中居中,两侧都有大的黑色空间.我也尝试在客户端系统上运行Xinerama而不是twinview,但这没有任何区别.
有没有办法在没有VNC帧的情况下以全屏模式运行vncviewer,但是将它限制为单个监视器?
由于我使用一台带有电视作为第二个显示器的笔记本电脑,我想制作一个小脚本,它将触发屏幕设置从扩展到克隆,当它设置为克隆时,它应该将屏幕设置设置为扩展。我想用 C# 制作它,因为它是我的主要语言,我认为它可以解决我的问题。
所以我现在制作了一个像这样的控制台应用程序:
class Program
{
static void Main(string[] args)
{
DisplayChanger.Start();
}
private static Process DisplayChanger = new Process
{
StartInfo =
{
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden,
FileName = "DisplaySwitch.exe",
Arguments = "/extend"
}
};
}
Run Code Online (Sandbox Code Playgroud)
创建新流程效果很好。但我的问题是,如何检查“显示”的状态?我需要它,以便我可以运行测试以查看要启动的进程。
感谢您的帮助 :)
我希望我不会发一个重复的问题,但我无法找到这样的问题,所以也许我很安全?无论如何...
对于我正在制作的应用程序,我将同时打开两个应用程序(两个独立的进程和窗口).运行这些应用程序的计算机将具有多个监视器.我希望第一个应用程序/窗口全屏显示并占用我的一个显示器(简单部分),另一个应用程序/全屏显示在第二个显示器上.如果可能的话,我希望他们以这种方式初始化.
目前,我使用此代码使我的窗口全屏:
this.setVisible(false);
this.setUndecorated(true);
this.setResizable(false);
myDevice = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
myDevice.setFullScreenWindow(this);
Run Code Online (Sandbox Code Playgroud)
它所在的类是JFrame类的扩展,myDevice的类型为"GraphicsDevice".当然有可能有一个更好的方法来使我的窗口全屏,以便我可以在两个不同的显示器上全屏显示两个不同的应用程序.
如果我不清楚,请说明,我会尝试编辑澄清!
我已经确定我可以使用GetSystemMetrics(SM_CMONITORS)来查询连接的监视器的数量,但是他们可以通过什么方式来控制CreateWindowEx()用于窗口的监视器?
有没有办法检索除主要显示器之外还有多少额外显示器的信息,它们的编号方式,尺寸是什么等等?我知道在.net土地上这很容易.
根据我对互斥锁的了解 - 它们通常在共享资源上提供锁定功能.因此,如果一个新线程想要访问这个锁定的共享资源 - 它要么退出要么必须不断轮询锁定(并且等待锁定会浪费处理器周期).
但是,监视器具有条件变量,这些条件变量为等待线程提供了更加异步的方式 - 将它们置于等待队列中,从而不会使它们占用处理器周期.
这是监视器相对于互斥锁(或没有条件变量的任何通用锁定机制)的唯一优势吗?
我对Java有点困惑notify().以下示例来自教科书.
public synchronized consume() {
while(queue.isEmpty()) {
try{ wait(); } catch (InterruptedException e) {}
}
// Assume that getElement() notifies to producers.
element = queue.getElement();
...
}
public synchronized produce() {
while(queue.isFull()) {
try{ wait(); } catch (InterruptedException e) {}
}
element = new Element();
...
queue.addElement(element);
notifyAll();
}
Run Code Online (Sandbox Code Playgroud)
我完全理解produce()上面例子中的方法.但是,任何人都可以告诉我为什么我们不在notifyAll()第一个方法(consume())结束时使用?简而言之,为什么不喜欢这样:
public synchronized consume() {
while(queue.isEmpty()) {
try{ wait(); } catch (InterruptedException e) {}
}
// Assume that getElement() notifies to producers.
element …Run Code Online (Sandbox Code Playgroud) monitors ×8
winapi ×3
c++ ×2
java ×2
.net ×1
asynchronous ×1
awt ×1
c# ×1
fullscreen ×1
mutex ×1
screens ×1
settings ×1
synchronized ×1
vnc ×1
windows ×1