如何使通过进程打开的win32程序窗口始终置顶

如何使通过进程打开的win32程序窗口始终置顶,第1张

枚举顶层(top-level)窗口枚举桌面顶层窗口相对于枚举进程来说可能要容易一些。枚举桌面顶层窗口的方法是用 EnumWindows() 函数。不要用 GetWindow()来创建窗口列表,因为窗口之间复杂的父子及同胞关系(Z-Order)容易造成混乱而使得枚举结果不准确。EnumWindows()有两个参数,一个是指向回调函数的指针,一个是用户定义的 LPARAM 值, 针对每个桌面窗口(或者顶层窗口)它调用回调函数一次。然后回调函数用该窗口句柄做一些处理,比如将它添加到列表中。这个方法保证枚举结果不会被窗口复杂的层次关系搞乱,因此,一旦有了窗口句柄,我们就可以通过 GetWindowText() 得到窗口标题。枚举进程建立系统进程列表比枚举窗口稍微复杂一些。这主要是因为所用的 API 函数对于不同的 Win32 *** 作系统有依赖性。在 Windows 9x、Windows Me、Windows 2000 Professional 以及 Windows XP 中,我们可以用 ToolHelp32 库中的 APIs 函数。但是在 Windows NT 里,我们必须用 PSAPI 库中的 APIs 函数, PSAPI 库是 SDK 的一部分。本文我们将讨论上述所有平台中的实现。附带的例子程序将对上述库中的 APIs 进行包装,以便包装后的函数能支持所有 Win32 *** 作系统。使用 ToolHelp32 库枚举进程ToolHelp32 库函数在 KERNEL32dll 中,它们都是标准的 API 函数。但是 Windows NT 40 不提供这些函。ToolHelp32 库中有各种各样的函数可以用来枚举系统中的进程、线程以及获取内存和模块信息。其中枚举进程 只需用如下三个的函数:CreateToolhelp32Snapshot()、Process32First()和 Process32Next()。使用 ToolHelp32 函数的第一步是用 CreateToolhelp32Snapshot() 函数创建系统信息“快照”。这个函数可以让你选择存储在快照中的信息类型。如果你只是对进程信息感兴趣,那么只要包含 TH32CS_SNAPPROCESS 标志即可。 CreateToolhelp32Snapshot() 函数返回一个 HANDLE,完成调用之后,必须将此 HANDLE 传给 CloseHandle()。接下来是调用一次 Process32First 函数,从快照中获取进程列表,然后重复调用 Process32Next,直到函数返回 FALSE 为止。这样将遍历快照中进程列表。这两个函数都带两个参数,它们分别是快照句柄和一个  PROCESSENTRY32 结构。调用完 Process32First 或 Process32Next 之后,PROCESSENTRY32 中将包含系统中某个进程的关键信息。其中进程 ID 就存储在此结构的 th32ProcessID。此 ID 可以被传给 OpenProcess() API 以获得该进程的句柄。对应的可执行文件名及其存放路径存放在 szExeFile 结构成员中。在该结构中还可以找到其它一些有用的信息。注意:在调用 Process32First() 之前,一定要记住将 PROCESSENTRY32 结构的 dwSize 成员设置成 sizeof(PROCESSENTRY32)。使用 PSAPI 库枚举进程在 Windows NT 中,创建进程列表使用 PSAPI 函数,这些函数在 PSAPIDLL 中。这个文件是随 Platform SDK 一起分发的,最新版本的 Platform SDK 可以从这里下载:使用这个库所需的 PSAPIh 和 PSAPIlib 文件也在该 Platform SDK 中。为了使用 PSAPI 库中的函数,需将 PSAPIlib 添加到代码项目中,同时在所有调用 PSAPI API 的模块中包含 PSAPIh 文件。记住一定要随可执行文件一起分发 PSAPIDLL,因为它不随 Windows NT 一起分发。你可以点击这里单独下载 PSAPIDLL 的可分发版本(不用完全下载 Platform SDK)。与 ToolHelp32 一样,PSAPI 库也包含各种各样有用的函数。由于篇幅所限,本文只讨论与枚举进程有关函数:EnumProcesses()、EnumProcessModules()、GetModuleFileNameEx()和 GetModuleBaseName()。创建进程列表的第一步是调用 EnumProcesses()。该函数的声明如下:BOOL EnumProcesses( DWORD lpidProcess, DWORD cb, DWORD cbNeeded );EnumProcesses()带三个参数,DWORD 类型的数组指针 lpidProcess;该数组的大小尺寸 cb;以及一个指向 DWORD 的指针 cbNeeded,它接收返回数据的长度。DWORD 数组用于保存当前运行的进程 IDs。cbNeeded 返回数组所用的内存大小。下面算式可以得出返回了多少进程:nReturned = cbNeeded / sizeof(DWORD)。注意:虽然文档将返回的 DWORD 命名为“cbNeeded”,实际上是没有办法知道到底要传多大的数组的。EnumProcesses()根本不会在 cbNeeded 中返回一个大于 cb 参数传递的数组值。结果,唯一确保 EnumProcesses()函数成功的方法是分配一个 DWORD 数组,并且,如果返回的 cbNeeded 等于 cb,分配一个较大的数组,并不停地尝试直到 cbNeeded 小于 cb现在,你获得了一个数组,其元素保存着系统中每个进程的ID。如果你要想获取进程名,那么你必须首先获取一个句柄。要想从进程 ID 得到句柄,就得调用 OpenProcess()。一旦有了句柄,则需要得到该进程的第一个模块。为此调用 EnumProcessModules() API:EnumProcessModules( hProcess, &hModule, sizeof(hModule), &cbReturned );调用之后,hModule 变量中保存的将是进程中的第一个模块。记住进程其实没有名字,但进程的第一个模块既是该进程的可执行模块。现在你可以用 hModule 中返回的模块句柄调用 GetModuleFileNameEx() 或 GetModuleBaseName() API 函数获取全路径名,或者仅仅是进程可执行模块名。两个函数均带四个参数:进程句柄,模块句柄,返回名字的缓冲指针以及缓冲大小尺寸。用 EnumProcesses() API 返回的每一个进程 ID 重复这个调用过程,你便可以创建 Windows NT 的进程列表。16位进程的处理方法在 Windows 95,Windows 98 和 Windows ME 中,ToolHelp32 对待16位程序一视同仁,它们与 Win32 程序一样有自己的进程IDs。但是在 Windows NT,Windows 2000 或 Windows XP 中情况并不是这样。在这些 *** 作系统中,16位程序运行在所谓的 VDM 当中(也就是DOS机)。为了在 Windows NT,Windows 2000 和 Windows XP 中枚举16位程序,你必须使用一个名为 VDMEnumTaskWOWEx()的函数。在源代码模块中必须包含 VDMDBGh,并且 VDMDBGlib 文件必须与项目链接。这两个文件都在 Platform SDK 中。该函数的声明如下:INT WINAPI VDMEnumTaskWOWEx( DWORD dwProcessId, TASKENUMPROCEX fp,LPARAM lparam );此处 dwProcessId 是 NTVDM 中拟枚举的16位任务进程标示符。参数 fp 是回调枚举函数的指针。参数 lparam 是用户定义的值,它被传递到枚举函数。枚举函数应该被定义成如下这样:BOOL WINAPI Enum16( DWORD dwThreadId,WORD hMod16,WORD hTask16,PSZ pszModName,PSZ pszFileName,LPARAM lpUserDefined );该函数针对每个运行在 NTVDM 进程中的16位任务调用一次,NTVDM 进程ID将被传入 VDMEnumTaskWOWEx()。如果想继续枚举则返回 FALSE,终止枚举则返回 TRUE。注意这是与 EnumWindows()相对的。关于代码本文附带的代码例子将 PSAPI 和 ToolHelp32 封装到一个名为 EnumProcs() 的函数中。该函数的工作原理类似 EnumWindows(),有一个指向回调函数的指针,并要对该函数进行重复调用,针对系统中的每个进程调用一次。另一个参数是用户定义的 lParam。下面是该函数的声明:BOOL WINAPI EnumProcs( PROCENUMPROC lpProc, LPARAM lParam );使用该函数时,要象下面这样声明回调函数:BOOL CALLBACK Proc( DWORD dw, WORD w16, LPCSTR lpstr, LPARAM lParam );参数 dw 包含 ID,“w16”是16位任务的任务号,如果为32位进程则为0(在 Windows 95 中总是0),参数lpstr 指向文件名,lParam 是用户定义的,要被传入 EnumProcs()。EnumProcs() 函数通过显示链接使用 ToolHelp32 和 PSAPI,而非通常所用的隐式链接。之所以要这样做,主要是为了让代码能够在二进制一级兼容,从可以在所有 Win32 *** 作系统平台上运行。

1、首先要知道仅仅电脑是无法实现这个功能的,因此需要借助一个叫做Desk pin的软件实现这个功能,百度即可下载

2、我们进入官网进行下载,下载完成后进行安装,这个软件没有中文,简单的英文是有的

3、安装完成后,进入菜单栏,我这里是WIN8的菜单栏,打开这个软件

4、这时候右下角会出现这个图标,说明启动成功了,如果没找到,可能在小三角内部

5、对着小图标右键,我们可以进入进行简单的设置,如快捷键等等

6、如图是我使用快捷键进行置顶的 *** 作,鼠标单击即可取消置顶。

1、首先上网搜索下载一个名为<DeskPins>的软件,并将软件解压到本地文件夹中。

2、为了以后使用方便,我们选择将<DeskPins>发送到桌面快捷方式。

3、双击桌面上的<DeskPins>图标,这时你会发现桌面右下角的任务栏出现了<DeskPins>程序图标,表示程序可以正常工作了。

4、直接鼠标左键单击<DeskPins>图标或者右键单击图标后选择<Enterpinmode>,此时我们会发现鼠标的光标会变成一个大头针形状。

5、将大头针形状的图标移至想要置顶的程序框图上单击一下,然后就会发现程序框图的右上角会附着一个红色大头针形状的图标,此时我们就已经将此程序置顶了,当你再去切换打开其他窗口时,此程序窗口始终在最前面。

6、当要取消窗口置顶设置时,可以直接单击窗口右上角的大头针图标或者右击任务栏右下角中的程序图标,选择<Removeallpins>将置顶设置取消。

Const HWND_TOPMOST = -1

Const HWND_NOTOPMOST = -2

Const SWP_NOSIZE = &H1

Const SWP_NOMOVE = &H2

Const SWP_NOACTIVATE = &H10

Const SWP_SHOWWINDOW = &H40

Private Declare Sub SetWindowPos Lib "User32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)

Private Sub Form_Activate()

SetWindowPos MehWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE

End Sub

参数表: hwnd ----------- Long,欲定位的窗口

hWndInsertAfter - Long,窗口句柄。在窗口列表中,窗口hwnd会置于这个窗口句柄的后面。也可能选用下述值之一:

HWND_BOTTOM

将窗口置于窗口列表底部

HWND_TOP

将窗口置于Z序列的顶部;Z序列代表在分级结构中,窗口针对一个给定级别的窗口显示的顺序

HWND_TOPMOST

将窗口置于列表顶部,并位于任何最顶部窗口的前面

HWND_NOTOPMOST

将窗口置于列表顶部,并位于任何最顶部窗口的后面

x -------------- Long,窗口新的x坐标。如hwnd是一个子窗口,则x用父窗口的客户区坐标表示

y -------------- Long,窗口新的y坐标。如hwnd是一个子窗口,则y用父窗口的客户区坐标表示

cx ------------- Long,指定新的窗口宽度

cy ------------- Long,指定新的窗口高度

wFlags --------- Long,包含了旗标的一个整数

SWP_DRAWFRAME

围绕窗口画一个框

SWP_HIDEWINDOW

隐藏窗口

SWP_NOACTIVATE

不激活窗口

SWP_NOMOVE

保持当前位置(x和y设定将被忽略)

SWP_NOREDRAW

窗口不自动重画

SWP_NOSIZE

保持当前大小(cx和cy会被忽略)

SWP_NOZORDER

保持窗口在列表的当前位置(hWndInsertAfter将被忽略)

SWP_SHOWWINDOW

显示窗口

SWP_FRAMECHANGED

强迫一条WM_NCCALCSIZE消息进入窗口,即使窗口的大小没有改变

声明:Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

windows

10

15063

版本中,部分“通用应用平台”(universal

windows

platform,简写为

uwp)类型的应用,已经有了“置顶”的功能。比如

win10

自带的“**和电视”应用,就可以“置顶”了。以下是小编整理的有关电脑 *** 作系统的知识,希望对您有所帮助。

1、按下

win

+

s

组合键,搜索“**”关键词,完美匹配“**和电视”windows

应用,回车启动该应用。

2、在打开的“**和电视”应用窗口中,点击打开一个保存视频的文件夹。

3、单击文件夹中的一个视频节目,启动播放该视频。

4、在视频播放窗口中,移动鼠标,窗口下方将会出现半透明的播放控制工具条,其中有一个按钮,移动鼠标到它上面,它会显示“以最小模式播放”的提示。

5、单击“以最小模式播放”按钮,“**和电视”应用窗口将变成一种精简模式。这时,再打开其他应用窗口,“**和电视”应用窗口仍然在桌面的最顶层保持可见,也就是所谓的“置顶”。

6、移动鼠标到视频窗口上,窗口右下角会出现“退出最小模式”按钮,点击它,该窗口会退出“最小模式”状态,其“置顶”状态也随之消失。

1/6

打开微信app,点击下方“发现”,然后点击图示位置“小程序”。

2/6

然后在“小程序”中找到你所要的置顶的小程序,然后长按。

3/6

长按之后,在该小程序上方会d出一个框,显示“标为星标”和“删除”。

4/6

点击上图中的“标为星标”,即可将该小程序置顶到首位。

5/6

再次长按已经置顶的小程序,在小程序上方依旧会d出一个框“取消星标”和“删除”选项,点击“取消星标”,即可取消小程序置顶。

6/6

如果你不想要该小程序,你可以长按小程序,然后点击“删除”,将小程序删除,即可。

分享一个小技巧,把小程序置顶在聊天顶部,随时随地切换状态,用微信聊天的同时也能快速回到小程序。

步骤一:首先打开微信客户端,点击底部的“发现”按钮

步骤二:点击小程序

步骤三:进入到某个小程序的界面,这里以“街店”为例

步骤四:点击小程序右上角的“…”,选择“显示在聊天顶部”。

这样就可以实现聊天界面与小程序迅速的切换了。

以上就是关于如何使通过进程打开的win32程序窗口始终置顶全部的内容,包括:如何使通过进程打开的win32程序窗口始终置顶、怎么把一个窗口置顶、win7里如何让新打开的窗口显示在最前面,而不是被已经打开的窗口遮住等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9653541.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存