老妖还是一个经典的问题,但我google baidu均未找到经典的答案,这次我想应该不会花一个晚上了 -_-!

BCB2006 2007-11-23 09:39:05
疑问:已知进程名,如何通过它找到主窗口,得到窗口句柄。

目前的问题:已经通过进程名获得了一个和改进程名一直的句柄,但不是主窗口句柄,无法通过该句柄对主窗口操作。如最大,最小等..

因为窗口名字是不固定的,所以不能通过findwindow一类的来找。我的代码如下:

//---------------------------------------------------------------------------
DWORD __fastcall FindProcessName(String strPName)
{
DWORD procid = 0 ;
AnsiString ExeFile;
HANDLE snapshot;
PROCESSENTRY32 processinfo;

processinfo.dwSize = sizeof(processinfo);
snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

if(snapshot==NULL)
{
return false;
}

bool flag = Process32First(snapshot,&processinfo);

while(flag)
{

ExeFile = AnsiString(processinfo.szExeFile);
if(ExeFile == strPName)
{
procid = processinfo.th32ProcessID ; break ;
}
flag = Process32Next(snapshot,&processinfo);
}
return procid ;
}


//---------------------------------------------------------------------------
BOOL CALLBACK EnumProc2Wnd(HWND hWnd,LPARAM lParam)
{
DWORD dwProcessId;
GetWindowThreadProcessId(hWnd, &dwProcessId);
LPWNDINFO pInfo = (LPWNDINFO)lParam;
if(dwProcessId == pInfo->dwProcessId)
{
pInfo->hWnd = hWnd;
return false;
}
return true;
}

//---------------------------------------------------------------------------

HWND __fastcall FindWndProcessID(DWORD dwProcessId)
{

WNDINFO wi;
wi.dwProcessId = dwProcessId;
wi.hWnd = NULL;
EnumWindows((FARPROC)EnumProc2Wnd,(LPARAM)&wi);
return wi.hWnd;
}

//---------------------------------------------------------------------------

void __fastcall TfmMain::btnIARClick(TObject *Sender)
{
DWORD dwPID= FindProcessName(IARPROC) ;
if(dwPID != 0)
{
HWND hWnd = FindWndProcessID(dwPID);
if(hWnd != NULL)
{

// ShowMessage("IAR RUNNING");
ShowWindow(hWnd , SW_RESTORE);
SendMessage(hWnd, WM_SYSCOMMAND, SC_RESTORE, 0);
int h = int(hWnd) ;
ShowMessage(IntToStr(h));
//PostMessage( hWnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0 );
//BringWindowToTop(hWnd);
}
else
{
//没有找到句柄
}
}
else
{
//没有改进程ID
}
}
//


不知道还有没有什么好的方法没有,期待老妖的回复!!
先谢一个!
...全文
107 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
laowang2 2008-01-16
  • 打赏
  • 举报
回复
up
alloutoflove 2007-11-26
  • 打赏
  • 举报
回复
额,如果只是判断窗口是否可见直接用IsWindowVisible就可以了, 没必要用GetWindowLong那么麻烦.
ccrun.com 2007-11-24
  • 打赏
  • 举报
回复
我现在北京出差,没有太多时间研究,等我周日回去吧。
BCB2006 2007-11-24
  • 打赏
  • 举报
回复
TO constantine(飘遥的安吉儿)
想写得通用一点,不至于换个进程名还要看一下class吧。那样也太麻烦

toalloutoflove(andrew / ichigo)

多谢,正在研究中...
alloutoflove 2007-11-24
  • 打赏
  • 举报
回复
基本思路就是这样的, 多分析一下主窗口的特性, 修改一下判断程序...
BCB2006 2007-11-24
  • 打赏
  • 举报
回复
自己搞定了,原来visibal是可以用GetWindowLong查看的,感谢各位的回复!!
BCB2006 2007-11-24
  • 打赏
  • 举报
回复
好的,先谢一个!周日等你的回复
constantine 2007-11-23
  • 打赏
  • 举报
回复
窗体的caption不固定就用窗体的类名不就行了吗,这个总不会变了吧
BCB2006 2007-11-23
  • 打赏
  • 举报
回复

if(hWnd != NULL)
{

// ShowMessage("IAR RUNNING");
ShowWindow(hWnd , SW_RESTORE);
SendMessage(hWnd, WM_SYSCOMMAND, SC_RESTORE, 0);
int h = int(hWnd) ;
ShowMessage(IntToStr(h));
//PostMessage( hWnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0 );
//BringWindowToTop(hWnd);
}




以上是调试代码,我是通过SPY4WIN发现主窗口句柄和我通过进程名查找的句柄是不一样的,也就是说
通过进程名查找到的不一定是主窗口。

还有论坛发了帖子的怎么编辑啊,我管理帖子-》编辑时,提示没有权限,难道不能编辑?

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧