2008-12-04 33 views
2

我的詳細資料:運行Windows CE 4.2,Compact Framework 2.0 SP1的自定義移動設備。 C#應用程序正在使用P/Invokes,直到現在沒有任何問題。在.NET CF 2.0中,全局鍵盤鉤子是否會干擾需要按鍵的P/Invokes?

我寫了一個低級別的鍵盤鉤子(與this CodeProject post相似但不完全相同),它奇妙地工作,但有一個例外。我們的軟件所做的一件事就是允許訪問Windows CE的屏幕校準功能;這是您需要點擊一系列目標的屏幕,最後按Esc取消或Enter接受。我們稱這個功能爲via a P/Invoke,我認爲在這個Win32 API函數中發生的按鍵受到我的鍵盤鉤子的干擾。

我的鍵盤鉤子並沒有做任何事情,也沒有改變執行流程,但我認爲這兩者的使用可能從根本上不兼容。在運行此屏幕後,當我退出調試器時,當程序關閉時,我一次嘗試全部「敲擊」的所有Enter鍵(此設備會產生點擊噪音)。這讓我認爲鉤子沒有正確地將按鍵傳遞給Win32 API函數,而是正確地將它傳遞給.NET應用程序。有什麼想法嗎?

你認爲:
一)鍵盤鉤子和鍵盤,需要P /調用不兼容,或
B)我的實現鍵盤鉤子的是難辭其咎的,或者
C)它取決於在所有在硬件製造商,驅動程序等?

感謝您的幫助!

回答

2

a)不,它們完全兼容。鍵盤鉤子發生在kenel級別,所以任何使用鍵盤消息的東西都會通過它,無論它來自本機代碼還是託管代碼。

B)很難說,因爲我們無法看到您的實現

C)這是可能的(任何事情都是因爲剛纔的一切在CE是OEM更換),但並不十分容易。大多數原始設備製造商(GWES)(這就是它所在的位置)並不多,因爲它可以直接使用。

現在,您正在查看的特定部分我假設是來自TouchCalibrate的調用,對嗎?這裏最好的選擇是專門研究TouchCalibrate源代碼 - 它包含Platform Builder(包括eval版本)。

我的猜測是它「攔截」或至少阻止郵件發送。從那時起我就在那裏,那是在做一個觸摸屏驅動程序的時候,所以我沒有注意到鍵盤處理,但是它在做什麼,它將控制權交給GWES子系統去查看原始觸摸屏點 - 它沒有運行Windows應用程序。所以應用程序消息泵可能處理調度這些按鍵的操作可能沒有任何作用(有點像當你拋出一個模式對話時)。

我真的需要更好的解釋到底發生了什麼。你說「當你運行這個屏幕後退出調試器」,但我不清楚這意味着什麼。你的意思是你在代碼中調用TouchCalibrate,然後停止調試,然後分派消息,或者一旦TouchCalibrate本身屏幕關閉,它們就會被分派嗎?

Remote Spy ++或Kernel Tracker也可能會對發生的事情有所瞭解。

+0

>你的意思是你在代碼中調用TouchCalibrate,然後停止調試,然後發送消息? 這就是我的意思。我知道按鍵到達了我的鉤子,但是就好像掛鉤沒有將它傳遞給TouchCalibrate。 我會查看平臺生成器。另外,非常喜歡OpenNetCF! <3 – 2008-12-04 23:36:06