c# 判断窗体是否永在最前(TopMost),调用windows API

摘要:
您可以参考博客c#,使表单始终首先调用windowsapi,将表单设置为最顶层。此函数获取有关指定窗口的信息,并获取指定额外窗口内存中偏移位地址的32位整数值。有效值的范围从0到额外窗口内存空间中的字节数-4。例如,必须使用CallWindowProc函数来调用窗口过程。

  许多程序都可以把自身的窗体设为最前显示状态,这个可以参考博客c#让窗体永在最前 调用windows api 将窗体设为topmost。那么如何判断桌面上的一个窗体是否为最前显示状态呢,不光是自己的程序,还包括其它程序。我们可以通过调用Windows Api的GetWindowLong方法判断。

  GetWindowLong是一个Windows API函数。该函数获得有关指定窗口的信息,函数也获得在额外窗口内存中指定偏移位地址的32位度整型值。

  函数原型:LONG GetWindowLong(HWND hWnd,int nlndex);

  参数说明:

    hWnd:窗口句柄及间接给出的窗口所属的窗口类。

    nIndex:指定要获得值的大于等于0的值的偏移量。有效值的范围从0到额外窗口内存空间的字节数一4例如,若指定了12位或多于12位的额外类存储空间,则应设为第三个32位整数的索引位8。要获得任意其他值,指定下列值之一:

      GWL_EXSTYLE(-20):获得扩展窗口风格。

      GWL_HINSTANCE(-6):获得应用实例的句柄。

      GWL_HWNDPARENT(-8):如果父窗口存在,获得父窗口句柄。

      GWL_ID(-12):获得窗口标识。

      GWL_STYLE(-16):获得窗口风格。

      GWL_USERDATA(-21):获得与窗口有关的32位值。每一个窗口均有一个由创建该窗口的应用程序使用的32位值。

      GWL_WNDPROC(-4):获得窗口过程的地址,或代表窗口过程的地址的句柄。必须使用CallWindowProc函数调用窗口过程。

  返回值:如果函数成功,返回值是所需的32位值;如果函数失败,返回值是0。

  代码如下:

  public class CheckTopMost

  {
    private const int WS_EX_TOPMOST = 0x00000008;
    [DllImport("user32.dll", SetLastError = true)]
    public static extern int GetWindowLong(IntPtr hWnd, int nIndex);

    /// <summary>
    /// 判断窗口是否为TopMost
    /// </summary>
    /// <param name="hWnd"></param>
    /// <returns></returns>
    public static bool CheckIsTopMost(IntPtr hWnd)
    {
      int style = GetWindowLong(hWnd, WS_EX_TOPMOST);
      style = style & WS_EX_TOPMOST;
      if (style == WS_EX_TOPMOST)
      {
        return true;
      }
      return false;
    }
  }

免责声明:文章转载自《c# 判断窗体是否永在最前(TopMost),调用windows API》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇DNS服务器原理介绍(一)JDK反编译的两种方式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mysql8中窗口函数

引用自: https://blog.csdn.net/yeshang_lady/article/details/102728513 在以前的MySQL版本中是没有窗口函数的,直到MySQL8.0才引入了窗口函数。窗口函数是对查询中的每一条记录执行一个计算,并且这个计算结果是用与该条记录相关的多条记录得到的。 1.窗口函数与聚合函数 窗口函数与聚合函数很像...

MySQL数据库中几种数据类型的长度

在MySQL里新建表自然会涉及设置字段长度,但有时会发现长度限制在一些字段类型中不起作用?字段长度是按字节算还是字符算? 如图中:int看起来只要还在本身类型取值范围内就行,字段长度没有起到作用;而char确实被限制在了5个字符中,甚至不是字节。 背后玄机在于不同数据类型的规则不同。 1、整数类型 这里的宽度和数据类型的取值是没有关系的,显示宽度只指明M...

Ubuntu Server版安装小记

之前一直是用Ubuntu的桌面版装docker,桌面版本身用起来比较方便,但开销较大,如果建立多个虚拟机就比较费劲了。今天试了一下server版的Ubuntu,发现还是比较方便的,相比桌面版,有如下好处: 占用空间小,只占用3G左右 占用内存小,甚至512MB内存也能较好的启动 这里记录下安装过程:   1. 下载 目前Ubuntu最小的版本是19.1...

SQL-Redis使用详细教程

 一、Redis基础部分:  1、redis介绍与安装比mysql快10倍以上  *****************redis适用场合**************** 1.取最新N个数据的操作 2.排行榜应用,取TOP N 操作 3.需要精确设定过期时间的应用 4.计数器应用 5.Uniq操作,获取某段时间所有数据排重值 6.实时系统,反垃圾系统7.Pu...

kernel内存、地址【转】

转自:https://blog.csdn.net/ivychend/article/details/79785303 1 物理地址、虚拟地址、总线地址2 编址方式2.1 外设访问2.1.1 映射3 虚拟地址映射4 内存布局4.1 动态映射区4.2 永久映射区4.3 固定映射区4.4 high memory4.5 DMA4.6 实际内存布局5 /proc/目...

微信小程序setdata修改数组或对象

1、this.setdata修改数组的固定一项的值 changeItemInArr: function() { this.setData({ 'arr[0].text':'changed data' }) }, 2、动态修改数组某一项的值 changeItemInArr: function(index) { let...