我想请教,如何知道一个窗口是由哪个EXE文件运行产生的?

解决方案 »

  1.   

    先取得这个窗口的Handle
    然后用GetWindowThreadProcessID取得所属进程句柄
    然后再枚举系统中所有进程比较一下就OK
      

  2.   

    如何获得桌面上任意窗口   
        
    1.先用 Finwindow 找到Desktop窗口句柄(98下通常是0x00000080),所有窗口都是它的子窗口(如你有SPY++会看得很清楚),调用GetWindow()选GW_CHILD 可得其子窗口,选GW_HWNDNEXT或调用GetNextWindow()可得其平级下一窗口,作一递归函数既可得到所有窗口句柄;2。对于带有title的窗口,调用GetWindowText()可得其标题,但要注意必须是该进程的顶级窗口,即其父窗口为Desktop,否则可能得到子窗口(如view)的显示内容,同理,调用SetWindowText()既可改变标题;3。这个问题我不确定,仅供参考:驻留程序中装个钩子,当有窗口生成时响应;不知是否还有其他截取系统响应的方式如重载系统函数之类。
     
     
      

  3.   

    我知道如何取得桌面的所有窗口句柄,但不知如何知道这个窗口是哪个EXE文件运行产生的?
      

  4.   

    //还有别忘了在 uses 部分加上TLHelp32单元function GetAppName(const AWindowHandle: THandle): string;varPI: DWORD;ContinueLoop:BOOL;SnapshotHandle:THandle;ProcessEntry32:TProcessEntry32;beginResult := '';GetWindowThreadProcessId(AWindowHandle, @PI);SnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);ProcessEntry32.dwSize := Sizeof(ProcessEntry32);ContinueLoop := Process32First(SnapshotHandle,ProcessEntry32);while ContinueLoop dobeginif ProcessEntry32.th32ProcessID = PI thenbeginResult := ProcessEntry32.szExeFile;break;end;ContinueLoop:=Process32Next(SnapshotHandle, ProcessEntry32);end;CloseHandle(SnapshotHandle);end;用以上的方法找到窗口HANDLE和PROCESSID后,用GETWINDOWTHREADPROCESS这个API函数可以得到创建窗口的PROCESSID,再和PROCESSID比较一下,可以找到!