2023年05月11日 其他資源
c#中通過process啟動的外部第三方程式mainwindowhandle控制代碼為0
前幾天遇到了乙個在c#的winform程式中,啟動乙個第三方jar程式,並修改jar執行窗體的標題的問題。
大體的需求就是上面說明的那樣,下面是當初設想的思路和實現**。
step1
// 根據jar檔案的路徑,啟動該jar
process p = process.start(jarfilepath);
step2
// 引用windowsapi中setwindowtext的宣告
[system.runtime.interopservices.dllimport("user32.dll", entrypoint = "setwindowtext")]
public static extern int setwindowtext(intptr hwnd, string lpstring);
step3
// 得到啟動的jar窗體的控制代碼
intptr hwnd = p.mainwindowhandle;
step4
// 改變jar窗體的標題欄文字
setwindowtext(hwnd, "標題欄新文字");
通過上面這四個步驟,感覺應該就可以改變啟動的外部第三方程式的視窗標題欄了。
但,實際執行結果卻不是想象的那樣。追究為什麼啟動的外部第三方應用程式窗體的標題欄文字為什麼沒有改變,是哪行**沒被執行到,或是哪行**出錯了,在debug單步執行時,卻又沒發現任何問題,新窗體的控制代碼也正常,執行完上面第四步驟的那行**之後,看新窗體的標題欄文字,完美地被改變了。
百思不得其解,接下來的思路就是看不debug單步執行時,哪行出了問題,於是在關鍵步驟3的後面,新增了下面的除錯輸出**
console.writeline("handle>>>" + hwnd);
這時的執行結果果然暴漏了問題所在,除錯語句輸出的mainwindowhandle為0.
接下來問題的關鍵就是找到為什麼process.mainwindowhandle得到的窗體控制代碼是0的問題的原因。
幾經google之後,發現了問題的原因,國外專家給出的原因解釋,感覺還挺靠譜的。
大體意思就是通過process.start得到的process還沒在工作列上建立出icon來,所以這個process貌似就被認為是不可見的,所以得到的控制代碼就是0.
看到這裡就很容易理解為什麼在debug單步除錯時,process.mainwindowhandle是正常的原因了
基於上面這些解釋,找到了在step3之前增加一下**的解決方案。
while (p.mainwindowhandle == intptr.zero)
到此,問題解決。但仍殘留了乙個值得思考的問題。在process類下有waitforinputidle()這個方法,看msdn上的解釋貌似也是等待,我嘗試著不用上面那個while迴圈,而用p.waitforinputidle();來代替,結果是不行的。
為什麼呢,希望有對此熟悉的朋友能給個解釋。
mysql控制代碼為0 窗體控制代碼總是0
c 中通過process啟動的外部第三方程式mainwindowhandle控制代碼為0 前幾天遇到了乙個在c 的winform程式中,啟動乙個第三方jar程式,並修改jar執行窗體的標題的問題。大體的需求就是上面說明的那樣,下面是當初設想的思路和實現 step1 根據jar檔案的路徑,啟動該jar...
滑鼠獲取窗體控制代碼
通過滑鼠座標獲取窗體控制代碼 cpoint lppoint getcursorpos lppoint 得到當前座標 hwnd hwnd 定義窗體控制代碼 hwnd windowfrompoint lppoint char formtitle max path char classname max p...
獲取視窗控制代碼(內部窗體)
要找到某個cwnd物件的hwnd,用getsafehwnd 在視窗類中,可以直接訪問 m hwnd 在視窗類外,可以用afxgetmainwnd m hwnd獲得。想得到乙個控制項的的控制代碼 getdlgitem id xx m hwnd 得到檢視的控制代碼 afxgetmainwnd getac...