台灣最大程式設計社群網站
線上人數
1370
 
會員總數:240687
討論主題:186544
歡迎您免費加入會員
討論區列表 >> C# >> Mouse Message的lParam轉成Point 的x y
[ 變換順序 ]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
Mouse Message的lParam轉成Point 的x y
價值 : 50 QP  點閱數:343 回應數:10

樓主

喵喵
初學者
30 108
1828 299
發送站內信

各位大大好:
int x = lParam.ToInt32() & 0xFFFF;
int y = (lParam.ToInt32() >> 16) & 0xFFFF;
查過很多網站,都是這個答案,
我實作時,滑鼠移動後的答案x和y的數字都是固定的,也太奇怪了。
但每次重開程式後,xy的答案都會變(仍然還是固定的)。
Point mousePos = (Point)Marshal.PtrToStructure(lParam, typeof(Point));
這樣作的話答案是正確的。
int x = Marshal.ToInt16()
這個x的答案也是正確的。
所以想請問最上面的2行程式碼是哪裡有問題呢?
謝謝各位大大佛心的回應,感恩。

搜尋相關Tags的文章: [ lParam ] , [ mouse ] ,
本篇文章發表於2017-04-21 18:06
== 簽名檔 ==
日文N1檢定合格。
朝英文前進~
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

Daimom
捐贈 VP 給 Daimom 檢舉此回應
你是在哪個事件抓xy的值阿?
本篇文章回覆於2017-04-26 11:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

喵喵
檢舉此回應
Daimom 大大您好:
我是在這個網站上看到的,
https://blogs.msdn.microsoft.com/toub/2006/05/03/low-level-mouse-hook-in-c/
我在這裡抓取lParam的

本篇文章回覆於2017-05-12 01:36
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

Daimom
捐贈 VP 給 Daimom 檢舉此回應
你的 HookCallback 在哪觸發的呢?
本篇文章回覆於2017-05-12 11:43
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

喵喵
檢舉此回應
Daimom 大大您好:
我將該網站的程式碼全部貼上來好了。
只要滑鼠點擊後,就會觸發進到HookCallback這個函式。
然後我再對lParam做運算,像是
int x = lParam.ToInt32() & 0xFFFF;
int y = (lParam.ToInt32() >> 16) & 0xFFFF;


本篇文章回覆於2017-05-13 17:50
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

Daimom
捐贈 VP 給 Daimom 檢舉此回應
我想確認一下,你說 網站?
本篇文章回覆於2017-05-14 20:01
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

喵喵
檢舉此回應
Daimom 大大您好:
我說的網站是指,我在這個網頁上看到的滑鼠抓取lParam事件的程式碼。
https://blogs.msdn.microsoft.com/toub/2006/05/03/low-level-mouse-hook-in-c/
本篇文章回覆於2017-05-16 12:33
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

陳泓諺
檢舉此回應
你不應該對lParam做計算,因為你拿到的是一個pointer
https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms644986(v=vs.85).aspx

如果你要用另一種作法,你需要在WndProc裡接收WM_MOUSEMOVE事件
https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms645616(v=vs.85).aspx
本篇文章回覆於2017-05-17 10:32
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
作者回應

喵喵
檢舉此回應
陳泓諺 大大您好:
感謝回應。
我將mouse抓取事件修改如下:
其中MSLLHOOKSTRUCT mousePos = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));
這行一樣是解出lParam。
而另外用
int x2 = lParam.ToInt32() & 0xFFFF;
int y2 = (lParam.ToInt32() >> 16) & 0xFFFF;
解新lParam結果卻是錯的。
明明是同一個lParam,但結果卻不一樣,而且x2 y2 的值也不會隨滑鼠移動而變。
原因是什麼?
本篇文章回覆於2017-05-19 11:22
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
最有價值解答

Daimom
捐贈 VP 給 Daimom 檢舉此回應
最近比較忙沒時間測你的code,
剛把你的code直接跑一次才大概瞭解你的問題所在(應該拉)

你好像有點搞混了,


這是把lParam轉成 MSLLHOOKSTRUCT 這個結構,再透過這個結構去取得x,y的值。
所以你單純去取lParam轉成數字,轉出來沒這個東西?
IntPtr的結構是 https://msdn.microsoft.com/zh-tw/library/system.intptr(v=vs.110).aspx
MSLLHOOKSTRUCT的結構是 http://www.cnblogs.com/DuanLaoYe/p/5501783.html
兩個代表的東西差很多,
至於為什麼不能用IntPtr來取得值,我想應該是可以,只是要去找看看要從哪去取。
本篇文章回覆於2017-05-31 15:05
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
作者回應

喵喵
檢舉此回應
感謝Daimom大大的回應。
本篇文章回覆於2017-06-04 21:12
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
[ 變換順序 ]   
1

回覆
如要回應,請先登入.