線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3720
推到 Plurk!
推到 Facebook!

視窗控制語系問題

答題得分者是:wjhsu
epoch
一般會員


發表:4
回覆:6
積分:2
註冊:2004-09-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-06-26 18:40:13 IP:60.248.xxx.xxx 訂閱
小弟需要對他人的程式做控制, 使用FindWindow以視窗title為參數取得視窗handle, 但在控制OpenDialog時出現了問題.
我的OS為繁體中文版, OpenDialog的標題列為"開啟", 但如果將程式拿到簡體中文版執行,OpenDialog的標題列為"打開".
程式將取不到視窗handle, 若拿到英文的OS上又是同樣的狀況, 請問有什麼一勞永逸的解決方法嗎?
wjhsu
初階會員


發表:9
回覆:32
積分:48
註冊:2004-06-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-06-27 00:19:59 IP:123.195.xxx.xxx 訂閱
"假設" OpenDialog出現時各元件的"相對位置"都相同, 那提供一個方法試試...
主要是利用GetWindowPlacement()這個API, 先"off-line"找出所需元件的"位置", 並記錄下來,
然後每次在OpenDialog出現並且用FindWindow()找到後, 就用"比較位置"的方法找到它內部元件的Handle,
這方法對於沒有Caption的元件(如:空白的Edit)也行...

需注意的是, GetWindowPlacement()找到的位置是相對於它的Parent的值, 例如: 放在Panel裏的按鈕,
在搜尋位置時, 就要先找到Panel, 再找出按鈕....

之前, 我有做類似的東西, 你可以下載看看...
http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=93988

主要在 ..tComponent\tComponent.cpp 檔裏

1. off-line找出主視窗下所有元件的位置(含元件的Parent)
==> bool __fastcall tForm::SaveConfiguration(HWND hwnd,AStr FileName)

2. on-line時要用元件的位置找出其Handle
==> bool __fastcall tComponent::FindHandle(HWND TopForm, TStringList *List, int index)



===================引 用 epoch 文 章===================
小弟需要對他人的程式做控制, 使用FindWindow以視窗title為參數取得視窗handle, 但在控制OpenDialog時出現了問題.
我的OS為繁體中文版, OpenDialog的標題列為"開啟", 但如果將程式拿到簡體中文版執行,OpenDialog的標題列為"打開".
程式將取不到視窗handle, 若拿到英文的OS上又是同樣的狀況, 請問有什麼一勞永逸的解決方法嗎?
epoch
一般會員


發表:4
回覆:6
積分:2
註冊:2004-09-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-06-27 10:04:38 IP:60.248.xxx.xxx 訂閱

謝謝大大的回覆.
您說 "每次在OpenDialog出現並且用FindWindow()找到後, 就用"比較位置"的方法找到它內部元件的Handle"
但我的問題正是在於使用FindWindow()有困難,FindWindow()是用視窗標題為參數來取得handle,
不同語系的作業系統OpenDialog的視窗標題都不一樣啊>"<,

換個問法好了, 那有無其他方法不需要視窗標題就可以取得OpenDialog的handle嗎?
編輯記錄
epoch 重新編輯於 2008-06-27 10:06:31, 註解 無‧
wjhsu
初階會員


發表:9
回覆:32
積分:48
註冊:2004-06-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-06-27 10:49:12 IP:61.219.xxx.xxx 訂閱
不好意思, 沒有看仔細, 我以為是要找OpenDialog裏的"開啟"按鈕...
剛剛試了一下, 用ClassName來找好像可以
.. 用FindWindow("#32770",NULL);

"#32770"是在我的電腦上找出的OpenDialog的ClassName,
我不知道是否有通用性, 可能要試試...

我試了兩種OpenDialog, 一種顯示"開啟", 一種是BCB的"Open", 是可以的
至於不同語系, 就沒辨法試了..
epoch
一般會員


發表:4
回覆:6
積分:2
註冊:2004-09-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-06-27 17:52:25 IP:60.248.xxx.xxx 訂閱
奇怪在我的電腦試不行耶, 這個方法我之前也有試過也是不行, classname確實是#32770

我用HWND hOpenDialog = FindWindow("#32770",NULL);抓不到handle
要HWND hOpenDialog = FindWindow(NULL, "開啟");或HWND hOpenDialog = FindWindow("#32770", "開啟");才行
不知道是哪裡出了問題
epoch
一般會員


發表:4
回覆:6
積分:2
註冊:2004-09-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-06-27 18:02:39 IP:60.248.xxx.xxx 訂閱
剛剛又試了一下
HWND hOpenDialog = FindWindow("#32770",NULL);
是可以抓到handle, 但不是我要的, 用spy 看了一下原來我電腦有數十個#32770正在跑, 那我該怎麼抓到我要的呢?
wjhsu
初階會員


發表:9
回覆:32
積分:48
註冊:2004-06-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-06-28 01:03:23 IP:123.195.xxx.xxx 訂閱
我想, 會出現OpenDialog, 應該都有一個主視窗, 假設如此的話, 剛剛試了下面的程式, 可以找到
其中, ParentWin就是打開OpenDialog的主視窗,
Note:
下面程式找到的不一定是OpenDialog, 所以前提是主視窗下的OpenDialog要已經出現時才可以用,
目前試的結果, 是都會找到主視窗下最後的焦點視窗, 例"開啟舊檔", "開新檔"的對話框....

[code cpp]
HWND OpenDialog;

OpenDialog = ::GetTopWindow(NULL);

while(OpenDialog!=NULL)
{
if ( ParentWin != NULL &&
ParentWin == ::GetParent(OpenDialog) &&
::IsWindowEnabled(OpenDialog))
break;

OpenDialog = ::GetNextWindow(OpenDialog,GW_HWNDNEXT);
Application->ProcessMessages();
}

[/code]
epoch
一般會員


發表:4
回覆:6
積分:2
註冊:2004-09-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-06-28 09:13:54 IP:60.248.xxx.xxx 訂閱

===================引 用 wjhsu 文 章===================
我想, 會出現OpenDialog, 應該都有一個主視窗, 假設如此的話, 剛剛試了下面的程式, 可以找到
其中, ParentWin就是打開OpenDialog的主視窗,
Note:
下面程式找到的不一定是OpenDialog, 所以前提是主視窗下的OpenDialog要已經出現時才可以用,
目前試的結果, 是都會找到主視窗下最後的焦點視窗, 例"開啟舊檔", "開新檔"的對話框....

[code cpp]
HWND OpenDialog;

OpenDialog = ::GetTopWindow(NULL);

while(OpenDialog!=NULL)
{
if ( ParentWin != NULL &&
ParentWin == ::GetParent(OpenDialog) &&
::IsWindowEnabled(OpenDialog))
break;

OpenDialog = ::GetNextWindow(OpenDialog,GW_HWNDNEXT);
Application->ProcessMessages();
}

[/code]

謝謝wjhsu大大, 這個方法確實可行^^~
系統時間:2024-04-17 0:24:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!