文档章节

C#获取窗口句柄概念和方法实例

短短的歼击机
 短短的歼击机
发布于 2012/11/13 16:01
字数 498
阅读 6766
收藏 1

在Windows中,句柄是一个系统内部数据结构的引用。例如当你操作一个窗口,或说是一个Delphi窗体时,系统会给你一个该窗口的句柄,系统会通知你:你正在操作142号窗口,就此你的应用程序就能要求系统对142号窗口进行操作——移动窗口、改变窗口大小、把窗口极小化为图标等。实际上许多 Windows API函数把句柄作为它的第一个参数,如GDI(图形设备接口)句柄、菜单句柄、实例句柄、位图句柄等,不仅仅局限于窗口函数。换句话说,句柄是一种内部代码,通过它能引用受系统控制的特殊元素,如窗口、位图、图标、内存块、光标、字体、菜单等。

Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
  Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
  Private Const WS_EX_LAYERED = &H80000
  Private Const GWL_EXSTYLE = (-20)
  Private Const LWA_ALPHA = &H2
  Private Sub Form_Activate()
  On Error Resume Next
  For i = 0 To 150 Step 2.5
  SetLayeredWindowAttributes Me.hwnd, 0, i, LWA_ALPHA
  DoEvents
  Next i
  End Sub
  Private Sub Form_load()
  Dim rtn As Long
  rtn = GetWindowLong(Me.hwnd, GWL_EXSTYLE)
  rtn = rtn Or WS_EX_LAYERED
  SetWindowLong Me.hwnd, GWL_EXSTYLE, rtn
  SetLayeredWindowAttributes Me.hwnd, 0, 0, LWA_ALPHA
  End Sub

//获取窗口标题
[DllImport("user32", SetLastError = true)]
public static extern int GetWindowText(
    IntPtr hWnd,//窗口句柄
    StringBuilder lpString,//标题
    int nMaxCount //最大值
    );

//获取类的名字
[DllImport("user32.dll")]
private static extern int GetClassName(
    IntPtr hWnd,//句柄
    StringBuilder lpString, //类名
    int nMaxCount //最大值
    );

//根据坐标获取窗口句柄
[DllImport("user32")]
private static extern IntPtr WindowFromPoint(
Point Point  //坐标
);

private void timer1_Tick(object sender, EventArgs e)
{
    int x = Cursor.Position.X;
    int y = Cursor.Position.Y;
    Point p = new Point(x, y);
    IntPtr formHandle = WindowFromPoint(p);//得到窗口句柄
    StringBuilder title = new StringBuilder(256);
    GetWindowText(formHandle, title, title.Capacity);//得到窗口的标题
    StringBuilder className = new StringBuilder(256);
    GetClassName(formHandle, className, className.Capacity);//得到窗口的句柄
    this.textBox1.Text = title.ToString();
    this.textBox2.Text = formHandle.ToString();
    this.textBox3.Text = className.ToString();
}

© 著作权归作者所有

短短的歼击机

短短的歼击机

粉丝 82
博文 268
码字总数 269797
作品 0
武汉
高级程序员
私信 提问
C#查找指定窗口的子窗口的句柄

using System.Collections.Generic;using System.Linq;using System.Text;using System.Runtime.InteropServices; namespace Util{...

u013934107
2018/04/26
0
0
PreTranslateMessage用法及ID--HANDLE--HWND三者之间的互相转换

利用PreTranslateMessage,响应按钮控件的按下(WMLBUTTONDOWN)和松开(WMLBUTTONUP) VC的button控制只有两个事件,一个是单击事件,一个事双击事件。在这个方面VB就方便多了。但是我们有其...

IMGTN
2012/06/05
1K
0
模块句柄(实例句柄)和句柄的区别

看过windows核心编程的都知道有很多概念。同时如果你不只对windows有所了解,对linux mac等 *unix操作系统也有所了解的话。可能会出现有的东西都重合,而有的没有。这里说下win下句柄概念。 ...

土匪猿
2018/05/15
0
0
Win32 程序在启动时激活前一个启动程序的窗口

版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:http://blog.csdn.net/wpwalter/)...

謎之E菌
2018/08/27
0
0
C# 通过进程名/进程Id 操作窗口/程序

1. 判断窗口是否存在 1 private bool IsWindowExist(IntPtr handle) 2 { 3 return (!(GetWindow(new HandleRef(this, handle), 4) != IntPtr.Zero) && IsWindowVisible(new HandleRef(this,......

@winter
2018/07/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

一起来学Java8(三)——方法引用

在一起来学Java8(一)——函数式编程中有一个简单的函数式编程的例子: import java.util.function.Consumer;class Person { public static void sayHello(String name) { S...

猿敲月下码
2分钟前
0
0
读书笔记:深入理解ES6(十一)

第十一章 Promise与异步编程   Promise可以实现其他语言中类似Future和Deferred一样的功能,是另一种异步编程的选择,它既可以像事件和回调函数一样指定稍后执行的代码,也可以明确指示代码...

张森ZS
25分钟前
3
0
面试官,Java8 JVM内存结构变了,永久代到元空间

在文章《JVM之内存结构详解》中我们描述了Java7以前的JVM内存结构,但在Java8和以后版本中JVM的内存结构慢慢发生了变化。作为面试官如果你还不知道,那么面试过程中是不是有些露怯?作为面试...

程序新视界
33分钟前
20
0
Elasticsearch 实战(一) - 简介

官腔 Elasticsearch,分布式,高性能,高可用,可伸缩的搜索和分析系统 基本等于没说,咱们慢慢看 1 概述 百度:我们比如说想找寻任何的信息的时候,就会上百度去搜索一下,比如说找一部自己喜...

JavaEdge
38分钟前
14
0
【jQuery基础学习】11 jQuery性能简单优化

本文转载于:专业的前端网站➦【jQuery基础学习】11 jQuery性能简单优化 关于性能优化 合适的选择器 $("#id")会直接调用底层方法,所以这是最快的。如果这样不能直接找到,也可以用find方法继...

前端老手
47分钟前
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部