Keith™ 发表于 2003-11-25 15:06:04

激活新窗口

好的,任何熟悉API的人都请帮助….
在我将新的应用程序窗口指定为HWND_TOPMOST后,我需要将AutoCAD当前图形设置为当前窗口
这是一个场景……
我正在开发一个外部应用程序,该应用程序与AutoCAD一起在windows中运行。我需要这个应用程序保持在顶部,这样用户可以随时更改设置,并且可以看到,这样用户就可以选择与程序相关的命令
我已经能够设置外部对话框的HWND_TOPMOST设置,但每当我将命令发送到AutoCAD时,我都必须在图形窗口中单击2或3次,使其成为当前窗口,以便使用该程序。这真是一个令人沮丧的提议
我希望外部应用程序保持在顶部,但处于非活动状态,AutoCAD当前图形变为活动状态,这样我就不必在图形中单击2次或3次,然后不经意地在错误的位置单击并重新启动<我说清楚了吗?
**** Hidden Message *****

Keith™ 发表于 2003-11-26 14:37:21

好吧,只是让你们知道...你没事了...我收到了一封来自陌生人的电子邮件(也许他们不想冒犯我,因为他们让我感到自卑),总之答案是:

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Boolean
SetForegroundWindow FindWindow(vbNullString, AcadApplication.Caption)

他只是给我指了正确的方向,剩下的就是我的了...
这个API太棒了!!

daron 发表于 2003-11-26 14:48:23

好吧,如果你没有发现,我想把你送到vbdesign.net.我有一些问题。编程应用编程接口有什么用,你如何理解?

SMadsen 发表于 2003-11-26 15:01:33

KEB,只是好奇,难道你不必采取具体行动来保持灭活的窗户在顶部吗?
我以为SetForegroundWindow会把whdl放在前面,而例如PutFocus会简单地允许它处理而不放在前面。

SMadsen 发表于 2003-11-26 15:03:25

达伦,看看http://www.allapi.net。他们有一些很棒的(免费的)资源。

Keith™ 发表于 2003-11-26 15:08:21

SMadsen,非活动窗口位于控制应用程序后面。控制应用程序设置了HWND_TOPMOST位,因此将始终保持在顶部(类似于选择“始终位于顶部”复选框时的 WinZip)。
最上面的窗口可以是非活动的,无论哪个窗口是活动的窗口,它都将保留在顶部但显示为灰色。
我需要的是让最顶层的应用程序自动使AutoCAD窗口成为活动窗口,因为它是在AutoCAD之外完成的,因此该过程是通过API函数处理的。
我已经在我的程序中实现了函数调用,它工作得非常好。
Daron,API编程允许您使用在任何dll,exe,odl,arx,tlb以及您可以想象的任何其他格式的可执行二进制文件中定义为可移植的任何函数。
想想你所知道的C和C++函数。您所要做的就是在VBA中使用适当的参数和类型声明该函数,然后您可以简单地调用该C或C++函数。
例如,您希望更改 AutoCAD 的标题以反映在 VBA 中定义的插件包。在普通 VBA 中,AcadApplication.Caption 是“只读”的,因此您无法使用 AcadApplication.Caption 应用新字幕。Caption = “New Caption”,但您可以通过声明 SetWindowText C++ 命令来调用它,并在其中设置字幕。这是一个强大的东西,如果你不确定你在做什么,可能会让你陷入麻烦。
看看这篇文章,看看我的意思。

SMadsen 发表于 2003-11-26 15:29:17

听起来很棒。必须尽快检查一下。
在Mac上,可以通过其窗口程序指定始终位于顶部的窗口。我对Windows中的Z排序感到困惑,似乎您可以在这样的窗口顶部强制窗口。
是的..并通过使AutoCAD为每个命令播放音乐而与同事陷入困境

Keith™ 发表于 2003-11-26 15:35:28

我没有想到……也许可以制作一个小程序,在后台运行,每5到10分钟等待一次,然后播放他们的“you got mail”波。他们会想知道到底发生了什么。

SMadsen 发表于 2003-11-26 15:40:07

这是一个简单的wav的
[代码]

Keith™ 发表于 2003-11-26 16:03:15

现在我们只需要一个计时器......
我在想......

Declare Function SetTimer Lib "user32" (ByVal Hwnd As Long, ByVal IdEvent As Long, ByVal seconds As Long, ByVal Func As Variant) As Long
Sub NewTimer()
Dim RVal As Long
RVal = SetTimer(NULL, 1, 30, NULL)
End Sub

但是我得到了一个无效的NULL错误使用。
页: [1] 2
查看完整版本: 激活新窗口