2012-11-19 53 views
0

我想改變觸摸屏返回的鼠標座標。例如,如果我有一個始終全屏的應用程序,並且用戶觸摸座標(1023,767),那麼我希望鼠標光標位於(799,479)處。它應該是一個簡單的縮放公式,但我似乎無法實現。我試過改變座標PreTranslateMessage,但它似乎沒有任何效果,不管我設置的值是什麼。MFC:從觸摸屏輸入重新轉換鼠標座標

我需要在應用程序級別執行此操作,因爲我無法訪問驅動程序/控制器級別。

這裏是我的實驗樣品:

BOOL CMyDialog::PreTranslateMessage(MSG* pMsg) 
{ 
    if (pMsg->message == WM_LBUTTONDOWN || 
     pMsg->message == WM_LBUTTONUP || 
     pMsg->message == WM_MOUSEMOVE) 
    { 
     // In this example, I'm simply reducing the "screen" by half. 
     // I am expecting that the mouse cursor would always be between 
     // my touch point and the upper-left corner, with a distance of half. 
     // But nothing seems to be happening. Is pMsg->pt just "read-only"? 

     pMsg->pt.x = pMsg->pt.x/2; 
     pMsg->pt.y = pMsg->pt.y/2; 
    } 

    return CDialog::PreTranslateMessage(pMsg); 
} 

回答

1

我敢肯定你的OnLButtonDown處理確實讓你的座標的修正值。鼠標消息與鼠標的「物理」位置無關。這只是一個消息,告訴你的窗口鼠標事件發生在某個位置。

要設置鼠標的實際位置,您需要撥打SetCursorPos。另外,我相信你應該處理WM_TOUCH消息。

編輯:如果要在應用程序中全局捕獲鼠標座標,請考慮使用掛鉤。 SetWindowsHookEx + WH_MOUSE。這可以從另一個進程完成,但在這種情況下,您需要將掛鉤的東西放入DLL中,操作系統將爲全部進程注入DLL(請參見this)。有一點要記住;總是讓你的鉤子儘可能輕巧!

+0

我測試了它,'OnLButtonDown'得到了未改變的座標,所以我在'PreTranslateMessage'中做了什麼沒有效果。不幸的是我沒有太多的Windows編程經驗。我假設這隻能在駕駛員級完成? – Ryuu

+0

您可以隨時在處理程序中執行計算。例如。 OnLButtonDown中(...)。爲什麼不這樣做? – l33t

+0

它不會在應用程序中的多個對話框中工作,因爲會調用錯誤的對話框的OnLButtonDown。翻譯需要更早或更低的水平完成。我想知道是否有可能創建另一個總是「竊取」鼠標輸入並重新傳輸它的應用程序,然後我的原始應用程序纔會收到消息。 – Ryuu