C#获取当前窗体句柄及该窗体里的信息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#获取当前窗体句柄及该窗体里的信息相关的知识,希望对你有一定的参考价值。

用C#获取当前屏幕上主窗体(就是当前操作的窗口,不知道是不是叫主窗体)句柄,通过句柄获取窗体对象,再遍历窗体对象中的控件,返回文本框中的值,并保存到记事本中。还有就是,我要做这个应该是建立windows窗体应用程序还是 控制台应用程序? 新手初学 望见谅。谢谢
不是当前屏幕的主窗口 是某一窗口,就是QQ的个人资料那个窗口。

C#获取当前窗体句柄及该窗体里的信息可以参考以下的代码:

FindWindow(

lpClassName, 窗口的类名

lpWindowName: PChar 窗口的标题

): HWND; 返回窗口的句柄; 失败返回 0

//FindWindowEx 比 FindWindow 多出两个句柄参数:

FindWindowEx(

Parent: HWND; 要查找子窗口的父窗口句柄

Child: HWND; 子窗口句柄

ClassName: PChar;

WindowName: PChar

): HWND;

扩展资料:

句柄语句

HINSTANCE hInstance;

可以改成:

HANDLE hInstance;

上面的2条语句都是对的,表达的是一个意义.

一个WINDOWS应用程序可以用不同的方法获得一个特定项的句柄。许多API函数,诸如CreateWindow,GlobalAlloc,OpenFile的返回值都是一个句柄值。

另外,WINDOWS也能通过应用程序的引出函数将一个句柄作为参数传送给应用程序,应用程序一旦获得了一个确定项的句柄,便可在WINDOWS环境下的任何地方对这个句柄进行操作。其实句柄的大量使用已经影响到了每一个WINDOWS的程序设计。

参考资料来源:百度百科-句柄

参考技术A 这个是建立windows窗体应用程序哈,这个可以新建一个form(就是窗体)然后点击主窗体的特定地方出现这个窗体,这里注意的是你要像QQ一样的话,这里就需要两个窗体都要同时显示出来。追问

我的意思其实是通过代码去获取QQ个人资料的那个窗口句柄 然后通过句柄获取窗体对象,再遍历窗体对象中的控件,返回文本框中的值,并保存到记事本中。 要不你有没有其他的什么办法可以获取到QQ个人资料的那个窗口里的文字信息 并取出来保存到记事本中。

参考技术B 你是想进程注入是吧?这个跟外 G程序很像啊。。还需要用到几个工具呢 ,这个得借助一些内存调试工具才能搞定。至于句柄你可以用VS里自带的工具Spy++去获取,很方便简单,你要是想在内存里动态获取窗体句柄并且读出信息的话也可以调研windows API去实现这个功能,但是可不是你想的那么简单的,要获取窗体句柄,然后获取窗体上控件(就是你想得到的文字信息的承载控件)的句柄,然后读出信息,读出的信息不知道是否加密,如果加密了还要解密(要是加密了我看你还是放弃吧,因为有破解加密算法的能力的话随便破解个腾讯的加密算法就能卖个几十万到几百万的)
PS:用API获取窗体句柄的函数是
FindWindow或者FindWindowEx追问

首先还是谢谢你这么耐心的给我讲解!那获取窗体上控件和控件内容 要怎么实现呢? 现在我能够获取窗体的句柄。接下来该怎么做才能获取窗体上控件和控件内容?

追答

每一个控件在窗体上都被认为是一个子窗体
获取到窗体句柄之后
IntPtr hwnd = FindWindow(null, "你需要获取的窗体的标题,例如:Form1");
IntPtr ButtonHwnd= FindWindowEx(hwnd, IntPtr.Zero, "控件的名字", null);
这样就能得到控件的句柄
SendMessage(ButtonHwnd, WM_SETTEXT, IntPtr.Zero, name);
这样就能更改控件的内容了
如果是button控件
可以这样
SendMessage(ButtonHwnd, WM_LBUTTONDOWN, IntPtr.Zero, null);
SendMessage(ButtonHwnd, WM_LBUTTONUP, IntPtr.Zero, null);
这样就是点击一次按钮
根据不同的控件你可以发送不同的控件消息来控制
读取内容的话用
GetWindowText(ButtonHwnd, szClassName, null);//里面的参数具体形式忘记了,你可以查看下Msdn,非常抱歉我比较忙没有帮你整理出现成的代码。
但是有些控件貌似没有句柄,那样的话就不能读了。就得用内存注入的形式获取存放控件内容的内存地址,然后从内存地址上直接readprocessmemory这个API来读取了(这个就是外挂里读取一些人物信息的方法,例如读出血值,魔法值都是用这个方法)
C#调用windows API的方法你要是不会的话可以追问下,我这有现成的可以给你找找

本回答被提问者采纳

vb 通过句柄将外部程序 设为本程序的子窗体 并 改变其窗体大小

如题 我现在可以获得其句柄 实现设为子窗体, 但如何改变其窗体大小呢?(外部程序没有边框)
望写出代码供参考 谢谢。

有两个Win 32 的API能够改变窗口大小,跟目标窗口有没边框无关:

MoveWindow( ) 和 SetWindowPos( )

比如用 MoveWindow( ) 的:

Option Explicit

Private Declare Function MoveWindow Lib "user32" ( _
                     ByVal hWnd As Long, _
                     ByVal x As Long, ByVal y As Long, _
                     ByVal nWidth As Long, ByVal nHeight As Long, _
                     ByVal bRepaint As Long) As Long

Private Sub Command1_Click()
   Dim hWinWND As Long
   hWinWND = &HC018A    '实际窗口句柄你自己处理
   Call MoveWindow(hWinWND, 30, 120, 510, 300, 1)
End Sub

追问

额 这个不行啊 只是窗体位置发生了变化 但是尺寸并没改变 返回值为1
是不是要先改变外部程序的边框样式(.Borderstyle),改为可调尺寸的边框然后在进行这一命令呢?或者用SetWindowPos()可以实现么?

追答

如果真是这样,这也不是API的问题。
而是你的“目标窗口”自己在控制窗口大小!

不信,你可以自己用VB做一个窗口无边框的程序来试一下。
或者,你也可以新建一个标准EXE工程,画一个按钮,
  然后再画一个TextBox、PictureBox等有句柄的控件。
 把这个控件的句柄传给它,让它处理。
 你都能看到,它不仅可以移动控件的位置,也能改变控件的大小。
如果MoveWindow( ) 不能直到作用,你用 SetWindowPos( ) 同样也不行。

追问

那有什么办法可以解决吗 谢谢了

追答

晕,能有什么办法!
如果它自己随时在“维护窗口的大小”,你却偏要去改变,那不是自找麻烦?

你去分析它的程序文件吧,看它在哪“作怪”,你把它那段代码跳过(或全部NOP掉),就可以了。
(不知道你有这个功力没。反正我是做不到了 -_-!!! )
就是面对 非常、非常长 的一大片汇编代码,然后改它的指令…………
(用反编译工具来处理)

参考技术A 很简单用 sendmessage API

以上是关于C#获取当前窗体句柄及该窗体里的信息的主要内容,如果未能解决你的问题,请参考以下文章

c# 设置窗体句柄

C# 获取窗体的句柄和获取窗体中的空间

获取当前进程(程序)主窗体句柄并设置wpf的父窗体为此句柄

获取当前进程(程序)主窗体句柄并设置wpf的父窗体为此句柄

知道一个窗体的句柄,如何获取这个窗体

c# 用 FindWindowEx 获取子窗体时 出异常