当前位置:首页 » 文件传输 » hwnd窗口能被多进程访问吗
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

hwnd窗口能被多进程访问吗

发布时间: 2022-09-10 07:45:16

① Windows窗口句柄和进程句柄详细关系是什么

所谓句柄实际上是一个数据,是一个Long (整长型)的数据。

句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。

从上面的定义中的我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样,每个人都会有一个,不同的人的姓名不一样,但是,也可能有一个名字和你一样的人。从数据类型上来看它只是一个16位的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。

如果想更透彻一点地认识句柄,我可以告诉大家,句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道,Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢?

为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。

句柄地址(稳定)→记载着对象在内存中的地址————→对象在内存中的地址(不稳定)→实际对象

本质:WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的,相反的,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。

但是必须注意的是程序每次从新启动,系统不能保证分配给这个程序的句柄还是原来的那个句柄,而且绝大多数情况的确不一样的。假如我们把进入电影院看电影看成是一个应用程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次电影院售给我们的门票总是不同的一个座位是一样的道理。

线程是指程序的一个指令执行序列,WIN32 平台支持多线程程序,允许程序中存在多个线程。 在单 CPU 系统中,系统把 CPU 的时间片按照调度算法分配给各个线程,因此各线程实际上是分时执行的,在多 CPU 的 Windows NT 系统中, 同一个程序的不同线程可以被分配到不同的 CPU 上去执行。由于一个程序的各线程是在相同的地址空间运行的,因此设及到了如何共享内存, 如何通信等问题,这样便需要处理各线程之间的同步问题,这是多线程编程中的一个难点。

线程,也被称为轻量进程(lightweight processes)。计算机科学术语,指运行中的程序的调度单位。

线程是进程中的实体,一个进程可以拥有多个线程,一个线程必须有一个父进程。线程不拥有系统资源,只有运行必须的一些数据结构;它与父进程的其它线程共享该进程所拥有的全部资源。线程可以创建和撤消线程,从而实现程序的并发执行。一般,线程具有就绪、阻塞和运行三种基本状态。

在多中央处理器的系统里,不同线程可以同时在不同的中央处理器上运行,甚至当它们属于同一个进程时也是如此。大多数支持多处理器的操作系统都提供编程接口来让进程可以控制自己的线程与各处理器之间的关联度(affinity)。

进程是程序在一个数据集合上运行的过程(注:一个程序有可能同时属于

多个进程),它是操作系统进行资源分配和调度的一个独立单位,进程可以简单的分为系统进程(包括一般

Windows程序和服务进程)和用户进程

② 一个进程中句柄在另一个进程中能用吗

句柄是有用的.但是我建议你要使用其它进程的句柄用DuplicateHandle API函数

修正一下,共享句柄是无效的.因为在WINDOWS里,每个进程里都有一个进程句柄表,对应的就是自己拥有可以使用句柄.如果一个句柄共享的话,仅仅只对创建它的进程有效,而其他进程虽说获取了相同值得句柄,但是在他们的句柄表里没有对应的有效句柄,那么该值是无效的.我们都知道句柄标示的是一个资源,一个内核对象,如果需要访问其他进程的句柄就必须用DuplicateHandle API函数
,或者OpenXXXX函数,但请记住,获取了有效的句柄后用完必须释放掉,不然会造成资源浪费.

③ ShowWindow(hWnd,SW_RESTORE)怎么不能激活窗口呀

一个进程可能有多个窗口,只有一个窗口是负责显示的
if ( pid == dwProcessID )
{
TCHAR szClassName[MAX_PATH]={0};
GetClassName(h,szClassName,MAX_PATH);
if (lstrcmp(szClassName,TEXT("WinRarWindow"))==0)
return h;
}

④ 在VC6.0中,HWND、hwnd、hWnd三者之间有什么区别若有,那么区别是什么能详细地讲解一下吗

HWND 是窗口句柄的类(handle of window)

hwnd、hWnd都是定义一个HWND的类,只不过微软用的都是匈牙利命名法,所以微软文档中都是用hWnd的,hwnd估计是一般应用MFC的程序员这样用。

⑤ MFC:在父窗口中打开了一个子窗口,然后在子窗口中访问非父窗口的其他窗口的控件。怎么实现。

你的意思就是获取子窗口句柄

1.先要获取主窗口的句柄
获取方法参考:

1.通过进程名称寻找进程 获得进程ID->枚举所有窗口->选出进程ID的主窗口句柄

2.通过窗口名称FindWindow出主窗口句柄

2.::GetDlgItem(这个函数可以获取子窗口的句柄)
例程:

HWND 主窗口句柄=::FindWindow(......);

HWND 子窗口句柄=::GetDlgItem(主窗口句柄,1231);//1231是子窗口在主窗口中的ID

//可以利用GetDlgItem(子窗口句柄,111);这样以此类推,一直到你所要的窗口为止

char 文本[MAX_PATH]={0};

::GetWindowText(子窗口句柄,文本,MAX_PATH);

MessageBox(.........);

Q:怎么获得子窗口在主窗口中的ID?
A:可以通过一些辅助软件获得,比如SPY++、精易助手 ,等等。

传递类的指针即可

⑥ 关于PostThreadMessage能实现进程间通信吗

线程消息可以跨进程发,没问题的。

不过一个线程可能拥有很多窗口,你指定一个线程ID的话,应当是哪个窗口收到呢?窗口的消息循环一般都指定了GetMessage中的窗口句柄参数,一般的窗口是收不到PostThreadMessage邮寄的消息的。(个人见解)

我平时给线程发消息一般都是针对有“消息循环...

感谢回答,不过你第一句话好像说的就不太对吧?消息循环是针对线程的,并非针对窗口吧,postthreadmessage是给某个线程消息循环发消息,SendMessage的第一个参数就是给哪个窗口发,第二个参数才是消息类型,这样,某个线程从他的消息循环中取出消息的时候,MSG本身就包含了hwnd,所以完全不存在你说的那个问题吧。
自己仔细看了几个函数的MSDN,得到了一个简单的“结论”(不对,欢迎评判):
1
BOOL PostThreadMessage( DWORD idThread,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);

The PostThreadMessage function posts a message to the message queue of the specified thread. It returns without waiting for the thread to process the message.

说了,是给消息队列的某个线程。
2 DWORD GetWindowThreadProcessId( HWND hWnd,
LPDWORD lpdwProcessId
);

The GetWindowThreadProcessId function retrieves the identifier of the thread that created the specified window and, optionally, the identifier of the process that created the window.

参照一下参数返回信息。

Parameters

hWnd
[in]Handletothewindow.
lpdwProcessId
[out].IfthisparameterisnotNULL,;otherwise,itdoesnot.
ReturnValue

.