開啟外部程式後,無法找到他的 Handle |
缺席
|
linly
一般會員 發表:42 回覆:37 積分:15 註冊:2007-10-07 發送簡訊給我 |
我寫了一個簡單的 win32 ,會在點一下 Form 後開啟外部程式,並且找到他、把它設定成 Form 的子視窗,
最後移動到我想要的地方,看似正常,不過有發生一件事情,就是如果事先就把目標應用程式開啟(如 Word), 然後才執行我的程式(記得按下左鍵),這樣就會發生我沒辦法把開啟的應用程式(如 Word)的 Handle 找到, 並且移動到我要的地方,請問是為什麼呀!! 以下是按下左鍵滑鼠事件的程式碼,完整的部分我有上傳上來, 還沒有察覺是為什麼耶,因為如果是小程式(例如 sol.exe),就不會發生這種問題,不知道是為什麼耶,感謝您 熱心的指導與答覆: [code cpp] static STARTUPINFO si; static PROCESS_INFORMATION pi; ... switch(msg) { case WM_LBUTTONDOWN: // 初始化 CreateProcess 所需要的結構 ZeroMemory(&si,sizeof(STARTUPINFO)); ZeroMemory(&pi,sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOWNORMAL; CreateProcess(lpApplicationName,NULL,NULL,NULL,false,0,NULL,NULL,&si,&pi) ; // 函式等候,直到參數之處理緒進入待機狀態 WaitForInputIdle(pi.hProcess,INFINITE); // 列舉所有上層視窗 EnumWindows((WNDENUMPROC)EnumWindowsProc, (LPARAM)(HANDLE)hwnd); // 設定我所開啟的應用程式的父視窗,以及設定位置 SetParent(childHwnd, hwnd); SetWindowPos(childHwnd, HWND_TOP, 0, 0, maxW, maxH-(int)(maxH*80./maxW), 4); break; .... } .... ... // Enumwindows 所需要的 CALLBACK Function BOOL CALLBACK EnumWindowsProc( HWND hwnd, LPARAM lparam ) { // GetParent 函式如果回傳 0,代表發生錯誤或者 top-level 視窗沒有 owner,否則 // 有父視窗就回傳父視窗的代碼,有 top-level 視窗有 onwer 就回傳 owner 代碼 if( GetParent(hwnd) == 0 && IsWindowVisible(hwnd) && GetLastError() == 0 ) { GetWindowThreadProcessId(hwnd,&lpdwProcessId); if( lpdwProcessId == pi.dwProcessId ) { childHwnd = hwnd; return false; // 不在繼續往下列舉 } } return true; } [/code] |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |