请教!!
解决方案 »
- 如何取出数据库中某个年份的数据
- 关于调用C的DLL中回调函数问题
- 怎样根据数据库关联的字段创建动态的导航栏
- 如何提取.exe文件图标,并加载到ListView中?给出源码送100分
- 如何将richtextbox里面的数据提取出来做计算
- 在VB SCRIPT 里面如何创建一个不存在的目录
- 推荐一个很好很好的网站
- 菜鸟请教
- 在VB6中能否编译标准的DLL,而非activex dll?
- VBA的高手请帮忙!如何用程序识别WORD中的特殊格式,例如:项目符号等
- 高手请进。急。在线等
- GetWindowThreadProcessId(hwnd, PId)可以实现由句柄找到PID,请教:怎么才能由PID找到相应的Hwnd?
请教:如何由由phn得到hwnd???
//试验使用EnumWindows函数
//给定进程pid,查找它的可见的主窗口句柄,实现对进程主窗口的某些操作#include <windows.h>
#include <stdio.h>
#include <tlhelp32.h>
BOOL CALLBACK MyEnumWindowsProc(
HWND hwnd, // handle to parent window
LPARAM lParam // application-defined value
);
DWORD pidwin;
HWND Myhwnd;
DWORD ProcessId;//欲查找的进程pid
HANDLE ProcessHandle;//目标进程的句柄
DWORD State;
BOOL FindPid(DWORD Pid);//查找给定的pid值是否存在
char ProcessName[20];//存储进程名字
char WindowText[512];//假设512字节已足够装下窗口的标题
void main(int argc,char *argv[])
{
//=====================查找输入的pid是否存在======================= char pid[8];
int i = 0;
if(argc != 2)
{
printf("Usage: FindPidWin /[pid]\n");
Sleep(2000);
return;
}
//变量初始化
ZeroMemory(pid,8);
ZeroMemory(ProcessName,20);
ZeroMemory(WindowText,512);
//获取输入的pid
do{
(*argv)++;
}while(**argv != '/');
while((**argv != '\0')&&(i<8))
{
(*argv)++;
pid[i++] = **argv;
}
//字符串转变成整型
ProcessId = atoi(pid); if(!FindPid(ProcessId))
{
printf("没有找到PID为%d的进程!\n",ProcessId);
return;
}
printf("Find Process Pid:%d Name:%s Successfully!\n",ProcessId,ProcessName);
//===================================================================== DWORD command;
pidwin = NULL;
Myhwnd = NULL;
EnumWindows(MyEnumWindowsProc,0);
if(Myhwnd == NULL)//没有找到窗口
{
printf("进程%s\tpid:%d当前没有可见窗口!\n",
ProcessName,ProcessId);
return;
}
else//找到目标进程的主窗口
{
GetWindowText(Myhwnd,WindowText,512);
printf("进程%s的主窗口句柄为:0x%X\n",ProcessName,Myhwnd);
printf("窗口0x%X的标题: %s\n",Myhwnd,WindowText);
ProcessHandle = OpenProcess(SYNCHRONIZE,FALSE,ProcessId);
if(ProcessHandle == NULL)//有错误发生
{
printf("打开目标进程时候出错,错误码:%d",GetLastError());
return;
}
else//可以对窗口进行处理了
{
printf("命令码\n");
printf("0-隐藏窗口\t1-显示窗口\t2-最小化窗口\n");
printf("3-最大化窗口\t4-禁止窗口\t5-使能窗口\n");
printf("6-发送WM_CLOSE消息到窗口\t7-退出程序\n");
Input:
printf("Command:");
scanf("%u",&command);
if(command>7)
{
printf("illegal operation!\7\n");
goto Input;
}
if(command==7)
return;
if(command>=0 &&command<=3)//窗口显示控制
ShowWindow(Myhwnd,command);
else
if(command>=4 && command<=5)//窗口使能控制
EnableWindow(Myhwnd,command-4);
else//输入为6,关闭窗口所在应用程序
{
printf("Send WM_CLOSE Message to window:0x%X\n",Myhwnd);
SendMessage(Myhwnd,WM_CLOSE,0,0);
State = WaitForSingleObject(ProcessHandle,5000);
switch( State )
{
case WAIT_TIMEOUT:
printf("在发送WM_CLOSE消息5秒后目标进程%s仍未结束!\n",ProcessName);
break;
case WAIT_OBJECT_0://目标进程退出,发信号
printf("目标进程%s已经退出!\n",ProcessName);
return;//退出本程序
default:
break;
}
}
goto Input;//继续输入操作命令
}
}
}
BOOL CALLBACK MyEnumWindowsProc(HWND hwnd,LPARAM lParam)
{
if(IsWindowVisible(hwnd))
{
GetWindowThreadProcessId(hwnd,&pidwin);
if(pidwin == ProcessId)
{
//找到其主窗口句柄放入Myhwnd中
Myhwnd = hwnd;
for(;;)
{
hwnd = GetParent(Myhwnd);
if(hwnd != NULL)//传入的hwnd不是主窗口
{
printf("Window:%XH的父窗口是:%XH\n",Myhwnd,hwnd);
Myhwnd = hwnd;
}
else //hwnd为NULL,Myhwnd已是主窗口句柄
return FALSE;
}
}
}
return TRUE;//继续枚举
}//查找指定的pid是否存在
BOOL FindPid(DWORD Pid)
{
BOOL Exist = FALSE;
HANDLE hSnapshot = NULL;
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32);
Process32First(hSnapshot,&pe);
do
{
if(pe.th32ProcessID == Pid)
{
//存储进程名
strcat(ProcessName,pe.szExeFile);
Exist=TRUE;
break;
}
}
while(Process32Next(hSnapshot,&pe) == TRUE);
CloseHandle(hSnapshot);
return Exist;}
辛苦了!可惜我看不懂VC的东东,哪能位大侠帮忙给个VB的?或者翻译一下?谢谢先!
关键在于:
GetWindowThreadProcessId
CreateToolhelp32Snapshot
Process32Next