全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1877
推到 Plurk!
推到 Facebook!

開啟外部程式後,無法找到他的 Handle

缺席
linly
一般會員


發表:42
回覆:37
積分:15
註冊:2007-10-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-10-12 21:40:34 IP:218.168.xxx.xxx 訂閱
我寫了一個簡單的 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]
附加檔案:470f79529db9d_OpenApp.cpp
系統時間:2024-04-26 8:28:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!