社区
网络编程
帖子详情
窗口句柄能不能跨进程使用!?
xiangshifu99
2003-10-09 02:44:36
窗口句柄能不能跨进程使用!?
有3个进程 A,B,C
在A中取得B进程的一个窗口句柄,现传给C使用,不知道C得到的句柄有没有用?
...全文
859
18
打赏
收藏
窗口句柄能不能跨进程使用!?
窗口句柄能不能跨进程使用!? 有3个进程 A,B,C 在A中取得B进程的一个窗口句柄,现传给C使用,不知道C得到的句柄有没有用?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
18 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
蒋晟
2003-10-12
打赏
举报
回复
同一个桌面上窗口句柄的可以跨进程使用
Command what is yours
Conquer what is not
sevencat
2003-10-12
打赏
举报
回复
GDI句柄可能就不行了。
贴一个枚举GDI句柄的代码。
一般来说GDI对象比较多一点。这个代码就是将所有的GDI对象解码出来。(有的可能没有,但我不知道问题出在什么地方)
是参考的那本windows图形编程里面的。
//gditable.h
#pragma once
#include "resource.h"
typedef unsigned (CALLBACK *proc0)(void);
struct GdiTableCell
{
void *pKernel;
//指向核心内存的指针,你是看不到的,
unsigned short nProcess;
//进程ID,你可以三个键一起按能看到。
unsigned short nCount;
//引用计数?
unsigned short nUpper;
//另一个放进程ID的地方
unsigned short nType;
//类型了,你自己试试看到底是什么类型吧。
void *pUser;
//有的GDI对象会将一些东西放到用户区,这个就是了(有可能DIB的图像区)
};
void init(GdiTableCell *&pGDITable);
// GdiTable.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include "GdiTable.h"
#include <assert.h>
#include <stdio.h>
#include <time.h>
#define EVENT_TIME_FORMAT "%b %d %H:%M:%S"
#define EVENT_TIME_MAXLEN 32
int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE,LPTSTR,int)
{
GdiTableCell *pGDITable;
init(pGDITable);
FILE *filewrite=fopen("log.txt","a");
if(filewrite==NULL)
return 0;
char time_string[EVENT_TIME_MAXLEN];
time_t now;
struct tm * tmnow;
time(&now);
if (!(tmnow = localtime(&now)))
strcpy(time_string,"?");
else
strftime(time_string,EVENT_TIME_MAXLEN,EVENT_TIME_FORMAT,tmnow);
fprintf(filewrite,"Decode Gdi Table %s:\n",time_string);
for(int i=0;i<16384;i++)
{
if((pGDITable->pKernel!=NULL)&&(pGDITable->nProcess!=0))
{
fprintf(filewrite,"%8X %8d %8d %8d %8x %8X\n",pGDITable->pKernel,pGDITable->nProcess,pGDITable->nCount,pGDITable->nUpper,pGDITable->nType,pGDITable->pUser);
}
pGDITable++;
}
return 0;
}
void init(GdiTableCell *&pGDITable)
{
proc0 pGdiQueryTable=(proc0)GetProcAddress(GetModuleHandle("GDI32.dll"),"GdiQueryTable");
assert(pGdiQueryTable);
if(pGdiQueryTable)
pGDITable=(GdiTableCell*)pGdiQueryTable();
else
{
pGDITable=NULL;
MessageBox(NULL,"Error","error",MB_OK);
}
}
jerry
2003-10-12
打赏
举报
回复
窗口句柄是系统级的资源,可以跨进程使用的。
我经常这样用的
szjay
2003-10-12
打赏
举报
回复
这么多人说了,但没一个说得详细的
xiangshifu99
2003-10-10
打赏
举报
回复
大家应该用过SPY以及类似软件,注意了没有,每一个窗口都有一个不变的16进制字符串,如果没有猜错的话,那个应该是一个句柄!?我认为是可以了!
cchuocp
2003-10-10
打赏
举报
回复
句柄可以用,但只有部分消息可以用。
tryber
2003-10-10
打赏
举报
回复
窗口的句柄是在被销毁之前是唯一的,可以跨进程,跨线程, 放心用吧.
wangjs720
2003-10-10
打赏
举报
回复
sure
studyingpersons
2003-10-10
打赏
举报
回复
mark
finix
2003-10-10
打赏
举报
回复
1需要复制
DuplicateHandle
2利用继承性
前提进程间有关系.如A 创建B....
3命名
像CREATEEVENT()有个参数是名字
yaoha2003
2003-10-09
打赏
举报
回复
我只知道句柄在系统的某一时刻是唯一的,你这样能不能用我不知道,UP
szclm
2003-10-09
打赏
举报
回复
其实能不能用特别的标识呢,我们即然能枚举进程,那我们当然可以通过A进程,去枚举出B进程呀!如果你有对应的B进程的类格式,不就可以引用了吗?呵呵,不知我这样说对不对!
sevencat
2003-10-09
打赏
举报
回复
假如行的话,我能用这个句柄进行操作吗?
假如我能用他,就意味着我可以对任意的窗口进行操作?
有些GDI句柄是全局的(好像是画刷吧,用得比较多的那玩意儿)
句柄结构表一般是放在系统区的一个地方(不同的进程这个表的虚拟内存地址可能还不一样,不过有个未公开的API可以得到他)
很遗憾,句柄表是一个很长的数据(好像是64位的),有数据的真实地址,另外还有进程号,还有我记不清了,因此每个API调用句柄可能都会先查一下这个句柄是不是属于你这个进程的,假如不是的,根本不可能调用成功。
Agemo
2003-10-09
打赏
举报
回复
一个简单明了的怀疑就是,系统创建进程时,都相应给每个进程创建一个句柄索引表,既然句柄索引表是process-dependent的,那么肯定不能如楼主所述的那样使用。
Agemo
2003-10-09
打赏
举报
回复
我表示怀疑,不过没有细考虑。凭我现在大脑里的印象,我认为不可以的根据是:每个进程创建的时候,系统都给创建一个句柄表,其实每个进程所获得的句柄都是对系统资源的参考的索引,应该是indirect的,就是不是直接引用的。所以两个进程对同一个系统资源的句柄是未必相同的。所以对同一个进程A所创建的窗口,A使用此窗口的句柄是A进程的句柄索引表中的一个索引,B通过一个api函数调用,获得的同一个窗口资源的句柄是和A中的不一样的,虽然有可能两个索引都一样,同理,进程C必须自己调用api函数获得此窗口句柄才行,不能用B进程传过来的那个,虽然会因为巧合而可以使用。我的猜想是,当B进程调用api函数获得那个窗口资源时,所做的工作就是在进程B的句柄索引表中增加一项,真正的资源引用指针被作为值插入,对应此指针的有一个索引,此索引就被当作句柄返回给了用户进程使用。可以看windows核心编程,我的记忆力不太好,再加上工作后没有搞过windows的东西,所以可能记忆有误。反正我现在的回答是:不可以。
fengzi_zhu
2003-10-09
打赏
举报
回复
句柄是系统资源在句柄所对应的对象生存期内该句柄是唯一的。也就是不用进程在不同时刻使用同一个句柄时,不能保证该句柄的对象是否是同一个。
xiaohyy
2003-10-09
打赏
举报
回复
可以。。
yintongshun
2003-10-09
打赏
举报
回复
先形成实例再用
通过
窗口
句柄
取得
进程
ID
通过
窗口
句柄
取得
进程
ID,源码是易语言API函数GetWindowThreadProcessId的应用教程。@易语言代码大全详解。
VC
进程
ID获得主
窗口
句柄
获得
进程
名
VC获得
进程
ID获得主线程ID获得
窗口
句柄
获得主
窗口
获得
进程
名 1.
窗口
类名
窗口
句柄
窗口
标题
窗口
句柄
HWND FindWindow( LPCTSTR lpClassName, //
窗口
类名 可用 VC或者VS自带的Spy++查看 LPCTSTR lpWindowName //
窗口
标题 ); 举例: 以 记事本为例, 记事本
窗口
类名 为:NotePad,
窗口
标题 视按具体情况而定,假设为"新建 文本文档.txt - 记事本"
窗口
类名
窗口
句柄
TCHAR lpClassName[]=TEXT("NotePad"); HWND hWnd=::FindWindow(lpClassName,NULL); if(hWnd && IsWindow(hWnd)) ::ShowWindow(hWnd,SW_HIDE);
窗口
标题
窗口
句柄
TCHAR lpWindowName[]=TEXT("新建 文本文档.txt - 记事本"); HWND hWnd=::FindWindow(NULL,lpWindowName); if(hWnd && IsWindow(hWnd)) ::ShowWindow(hWnd,SW_HIDE); 2.
窗口
句柄
进程
ID
窗口
句柄
主线程ID 要
使用
到的函数: DWORD GetWindowThreadProcessId( HWND hWnd, //目标
窗口
句柄
LPDWORD lpdwProcessId //返回目标
窗口
对应
进程
ID ); 例子: DWORD dwProcId=0;//存放返回的
进程
ID DWORD dwThreadId=0;//存放返回的主线程ID HWND hWnd=XXXX;//这里省略,可能用任务方式得到一个
窗口
的
句柄
.比如用1中的方法. dwThreadId=GetWindowThreadProcessId(hWnd,&dwProcId);//同时得到
进程
ID和主线程ID. 3.
窗口
HAND CWnd 用CWnd::FromHandle(HWND hWnd)函数.很多类都有这个函数. 4.
进程
名
进程
ID (注:
进程
名,即在"任务管理器"中看到的名字) 用CCheckObject类(详细实现源文件); 例子: 以记事本为例,
进程
名为 NOTEPAD.EXE (不一定是大写哦,得到任务管理器是显示而定); CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); DWORD dwProcId=ch.GetProcessId(Name); 5.
进程
名 主线程ID 例子: CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); DWORD dwThreadId=ch.GetThreadId(Name); 6.
进程
名 主
窗口
句柄
CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); HWND hWnd=ch.GetTargetWindowHanle(Name); 7. 其它说明 从CCheckObject类和上面的源码中,不难写出从
进程
ID 主线程ID
进程
ID 主
窗口
句柄
主线程ID--->主
窗口
句柄
等等其它类似转换. 对于主
窗口
,特点如下: A.
不能
用
进程
ID,要用线程ID,因为一个
进程
可能有多个线程,每个线程都可能会有主
窗口
. B. 主
窗口
不会有WS_CHILD属性 C. 主
窗口
没有父
窗口
D. 主
窗口
一般都有子
窗口
(这个不是一定的,但是具有普遍性)
C#通过
进程
名获取
窗口
句柄
C#通过
进程
名获取
窗口
句柄
,也可以获取当前
窗口
句柄
。本人在c#2013测试通过。
通过
进程
id获取主
窗口
句柄
及主
窗口
标题
通过
进程
id获取到所在
进程
的主
窗口
的
句柄
,及通过该主
窗口
句柄
获取当前主
窗口
的标题,
进程
名;这是一个demo例程,仅供参考
取
窗口
句柄
+
进程
名+
进程
ID
取指定标题
窗口
的
句柄
,
进程
名,
进程
ID 取指定标题
窗口
的
句柄
,
进程
名,
进程
ID 取指定标题
窗口
的
句柄
,
进程
名,
进程
ID 取指定标题
窗口
的
句柄
,
进程
名,
进程
ID 取指定标题
窗口
的
句柄
,
进程
名,
进程
ID
网络编程
18,363
社区成员
64,197
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章