locked
如何通过poutlook.exe获取任务、日程、联系人task RRS feed

  • 问题

  • Windows Mobile中的任务、日程、联系人都对应着poutlook.exe这个进程,我做了一个自定义的task manager应用,

    通过获取当前系统的进程进而获取进程的ID,然后通过ID获取主窗口的title,这样就得到任务名称。但是当同时开启任务、日程、

    联系人时只能获取到最后一个开启的应用的窗口名称,而不能同时显示这三个应用,WM自带的任务管理器则可以同时显示这三个任务,

    我的代码如下:

    BOOL GetAllTaskInfo(vector<TASKINFO>& vTaskInfo)
    {
    	HANDLE			hSnapshot = NULL;
    	PROCESSENTRY32	stProcessEntry;
    	TASKINFO		stTaskInfo;
    	BOOL			bResult = FALSE;
    	DWORD			dwCurProcesdID = 0xFFFFFFFF;
    
    	vTaskInfo.clear();
    	dwCurProcesdID = GetCurrentProcessId();
        hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS | TH32CS_SNAPNOHEAPS, 0);
    	if (NULL == hSnapshot || INVALID_HANDLE_VALUE == hSnapshot)
    	{
    		ASSERT(FALSE);
    		return FALSE;
    	}
    	
    	ZeroMemory(&stTaskInfo, sizeof(TASKINFO));
    	ZeroMemory(&stProcessEntry, sizeof(stProcessEntry));
    	stProcessEntry.dwSize = sizeof(PROCESSENTRY32);
        
        bResult = Process32First(hSnapshot, &stProcessEntry);
    	if (!bResult)
    	{
    		if (GetLastError() == ERROR_NO_MORE_FILES)
    		{
    			return TRUE;
    		}
    		else
    		{
    			CloseToolhelp32Snapshot(hSnapshot);
    			return FALSE;
    		}
    	}
    
        do
    	{
    		if (!IsSystemTask(stProcessEntry.szExeFile)
    			&& stProcessEntry.th32ProcessID != dwCurProcesdID)
    		{
    			ExtractIconEx(stProcessEntry.szExeFile, 0, &stTaskInfo.hIconLarge, &stTaskInfo.hIconSmall, 1);
    			if (NULL == stTaskInfo.hIconLarge) 
    			{
    				stTaskInfo.hIconLarge = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_DEFAULT));
    			}
    
    			if (NULL == stTaskInfo.hIconSmall)
    			{
    				stTaskInfo.hIconSmall = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_DEFAULT));
    			}
                
                stTaskInfo.dwProcessID = stProcessEntry.th32ProcessID;
    			_tcscpy(stTaskInfo.szExeFile, stProcessEntry.szExeFile);
    
    			EnumWindows(EnumWindowsProc, (LPARAM)&stTaskInfo);
    			if (0 == _tcslen(stTaskInfo.szTitleName))
    			{
    				if (NULL != stTaskInfo.hIconLarge) 
    				{
    					DestroyIcon(stTaskInfo.hIconLarge);
    					stTaskInfo.hIconLarge = NULL;
    				}
    
                    if (NULL != stTaskInfo.hIconSmall)
    				{
    					DestroyIcon(stTaskInfo.hIconSmall);
    					stTaskInfo.hIconSmall = NULL;
    				}
    				
    				ZeroMemory(&stTaskInfo, sizeof(TASKINFO));
    
    				continue;
    			}
    
                vTaskInfo.push_back(stTaskInfo);
    			ZeroMemory(&stTaskInfo, sizeof(TASKINFO));
    			//ZeroMemory(&stProcessEntry, sizeof(PROCESSENTRY32));
    			//stProcessEntry.dwSize = sizeof(PROCESSENTRY32);
    		}
    	} while (Process32Next(hSnapshot, &stProcessEntry));
    
    	CloseToolhelp32Snapshot(hSnapshot);
    	
    	return TRUE;
    }
    
    BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
    {
    	TASKINFO*	pTaskInfo = (LPTASKINFO)lParam;
    	DWORD		dwID = 0xFFFFFFFF;
    	
    	// If the window doesn't match our criteria, continue enumerating immediately.
    	// Is visible.
    	if (!IsWindowVisible(hwnd))
    	{
    		return TRUE;
    	}
    	
    	// Is not a tool window.
    	if (0 != (GetWindowLong(hwnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW))
    	{
    		return TRUE;
    	}
    
        // Is not the main desktop window.
    	if (GetDesktopWindow() == hwnd)
    	{
    		return TRUE;
    	}
    	
    	// Is not the main window of this app.
    	if (g_hWndCustomTask == hwnd)
    	{
    		return TRUE;
    	}
    
        GetWindowThreadProcessId(hwnd, &dwID);
    	if (dwID == pTaskInfo->dwProcessID)
    	{
    		pTaskInfo->hTaskWnd = hwnd;
    		ZeroMemory(pTaskInfo->szTitleName, sizeof(pTaskInfo->szTitleName));
    		GetWindowText(hwnd, pTaskInfo->szTitleName, MAX_PATH);
    
    		return FALSE;
    	}
    
    	return TRUE;
    }
    
    
    烦请知道的人帮忙看看,谢谢!

    2010年9月9日 10:42

答案

  • 这个涉及到内部开发的问题了,只有开发人员知道了。


    Please remember to mark the replies as answers if they help and unmark them if they provide no help
    2010年9月14日 5:36
    版主

全部回复

  • 我没做过类似的功能,因为contact,calendar,task的title是固定的,我们完全可以用FindWindow 函数才查找它,如果查到说明打了,没有就则说明没有打开。具体窗口的title和class name,可以用remote spy来看。
    Please remember to mark the replies as answers if they help and unmark them if they provide no help
    2010年9月13日 9:43
    版主
  • 我没做过类似的功能,因为contact,calendar,task的title是固定的,我们完全可以用FindWindow 函数才查找它,如果查到说明打了,没有就则说明没有打开。具体窗口的title和class name,可以用remote spy来看。
    Please remember to mark the replies as answers if they help and unmark them if they provide no help

    首先感谢你的回复!

        通过FindWindows是可以找到系统当前开启的应用中是否存在contact、calendar和task,如果这样的话,则需要对poutlook.exe区别对待了,我上面的代码中没有区别对

    待,所以只能获取到这三个中最后一个开启的应用的窗口名称。还是想问一下,poutlook.exe是否有什么标记或方法可以判断系统当前的任务列表中存在contact、calendar或

    task,因为CreateProcess可以通过带不同的参数来分别开启这几个应用,是否存在对应的方法判断poutlook.exe开启了那些对应的应用? 

    2010年9月14日 1:57
  • 这个涉及到内部开发的问题了,只有开发人员知道了。


    Please remember to mark the replies as answers if they help and unmark them if they provide no help
    2010年9月14日 5:36
    版主