2012-03-11 62 views
0

如何检测当前会话是否是VB6应用程序中的终端服务(远程桌面)会话?如何检测是否在VB6的终端服务会话中?

+0

你可以尝试迫使窗口恢复(未最大化)负载状态,看看是否有帮助。 – Deanna 2012-03-12 12:07:27

+0

你是什么意思? 'Form.WindowState'或一些API调用? – CJ7 2012-03-12 12:20:21

+0

是的,'Form.WindowState = vbNormal'。 – Deanna 2012-03-12 12:29:59

回答

3

使用SM_REMOTESESSION标志调用GetSystemMetrics function会告诉您应用程序是否在终端服务会话中运行。

要调用从VB 6,你需要声明它的模块中,像这样:

Const SM_REMOTESESSION As Long = &H1000 
Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long 

如果您在终端服务环境中运行,返回值将是非零。

...但是,您应该确实修复您的居中代码,而不是试图通过不同的行为解决此问题,具体取决于您是否在终端服务会话中运行。这只会为你带来更多的工作,并引入更多的错误。不幸的是,我无法告诉你,如果您使用的是居中代码而没有看到它有什么问题。

+0

@克雷格:这不是链接问题的答案。问题是您的代码中心窗口不正确。它做出了一些正常工作的假设,但在终端服务下运行时会崩溃。 – 2012-03-12 07:07:16

+0

@克雷格:啊,我明白你在说什么了。您没有编写表单居中代码,您正在设置属性并让VB处理它。所以这个错误在于VB关于屏幕坐标的假设,而不是你可以修复的东西。是的,我了解TS配置工具的含义,但这并不能改变居中代码错误的事实,只是如果您无法访问源代码,则可以解决此问题。 – 2012-03-12 09:41:47

+0

最好的办法是使用'SPI_GETWORKAREA'手动对齐表格。VB忽略任务栏停靠位置并且不会在分辨率更改时重新加载屏幕大小。你的bug不太常见,也没有那么令人讨厌。 – wqw 2012-03-12 15:07:39

0

我有同样的问题。据我了解,你的表单将你想要的东西放在你想要的地方(例如屏幕中央)。您的应用程序在普通桌面上运行良好,但在终端环境中将会最大化。如果是这样,我发现了一个小窍门。把一个计时器该窗体上,使其interval=1timer1_timer事件

Me.WindowState = 0 
'then put the movement code like this 
formname.Top = (Screen.Height/2) - (formname.Height/2) -400 '(400 for form title bar) 
formname.Left = (Screen.Width/2) - (formname.Width/2) 
timer1.interval=0 
timer1.enabled=false 

就是这样写的。 [email protected]

+1

我通过向表单加载和激活事件添加了'Form.WindowState = vbNormal'来解决了这个问题。 – CJ7 2012-06-03 03:01:21