小夥伴們在做revit二次開發的時候,可能會需要在自己做的外掛程式執行時,去監聽某個按鍵然後做出相應的反應。比如在生成乙個很大的模型時,發現不對勁,想停止程式執行,這個時候就可以通過監聽按鍵事件去取消這個正在執行的程式,或者通過監聽按鍵事件去觸發特定事件。
為了實現全域性監聽,這裡使用了hook技術,詳見**中的keyboardhook類
由於hook_keydown的返回型別是void, 如果是系統自帶的函式,可以直接在方法裡面寫,但是如果需要將這裡面的值傳遞給revit中需要的地方,則需要自己在類中定義乙個變數去給他設定乙個值,然後再將這個值傳遞給revit中來(參見over)。
鍵位設定,本文設定s鍵可以取消正在執行的程式,對應keyvalue為83,更多的鍵位大家可以參考這篇文章c#按鍵對應的keyvalue
using
system
;using
autodesk.revit.ui
;using
autodesk.revit.db
;using
autodesk.revit.attributes
;using
autodesk.designscript.geometry
;using
autodesk.revit.db.architecture
;using
system.text
;using
system.runtime.interopservices
;using
system.windows.forms
;using
system.reflection
;namespace
listen
}public
void
startlisten()
public
void
stoplisten()
}public
result
execute
(externalcommanddata commanddata,
refstring
message,
elementset elements)
return result.succeeded;}}
class
keyboardhook
//這部分**來自網友
//使用此功能,安裝了乙個鉤子
[dllimport
("user32.dll"
, charset = charset.auto, callingconvention = callingconvention.stdcall)
]public
static
extern
int setwindowshookex
(int
idhook,
hookproc lpfn,
intptr hinstance,
int threadid)
;//呼叫此函式解除安裝鉤子
[dllimport
("user32.dll"
, charset = charset.auto, callingconvention = callingconvention.stdcall)
]public
static
extern
bool
unhookwindowshookex
(int
idhook)
;//使用此功能,通過資訊鉤子繼續下乙個鉤子
[dllimport
("user32.dll"
, charset = charset.auto, callingconvention = callingconvention.stdcall)
]public
static
extern
int callnexthookex
(int
idhook,
int ncode,
int32 wparam,
intptr lparam)
;// 取得當前執行緒編號(執行緒鉤子需要用到)
[dllimport
("kernel32.dll")]
static
extern
int getcurrentthreadid()
;//使用windows api函式代替獲取當前例項的函式,防止鉤子失效
[dllimport
("kernel32.dll")]
public
static
extern
intptr
getmodulehandle
(string
name)
;public
void
start()
}}public
void
stop()
if(!(retkeyboard)
)throw
newexception
("解除安裝鉤子失敗!");
}//toascii職能的轉換指定的虛擬鍵碼和鍵盤狀態的相應字元或字元
[dllimport
("user32")]
public
static
extern
int toascii
(int
uvirtkey,
int uscancode,
byte
lpbkeystate,
byte
lpwtranskey,
int fustate)
;//獲取按鍵的狀態
[dllimport
("user32")]
public
static
extern
int getkeyboardstate
(byte
pbkeystate);[
dllimport
("user32.dll"
, charset = charset.auto, callingconvention = callingconvention.stdcall)
]private
static
extern
short
getkeystate
(int
vkey)
;private
const
int wm_keydown =
0x100
;//keydown
private
const
int wm_keyup =
0x101
;//keyup
private
const
int wm_syskeydown =
0x104
;//syskeydown
private
const
int wm_syskeyup =
0x105
;//syskeyup
private
int keyboardhookproc
(int
ncode,
int32 wparam,
intptr lparam)
//鍵盤按下
if(keypressevent !=
null
&& wparam == wm_keydown)
}// 鍵盤抬起
if(keyupevent !=
null
&&(wparam == wm_keyup || wparam == wm_syskeyup))}
//如果返回1,則結束訊息,這個訊息到此為止,不再傳遞。
//如果返回0或呼叫callnexthookex函式則訊息出了這個鉤子繼續往下傳遞,也就是傳給訊息真正的接受者
return
callnexthookex
(hkeyboardhook, ncode, wparam, lparam);}
~keyboardhook()
}}
由於是整個專案中監聽,所以需要hook技術;
鍵位在設定時,注意不要與作業系統以及revit軟體自帶的快捷鍵衝突。
如何在Fragment中監聽觸控事件
大家都知道,我們的activity中有ontouchevent方法,可以用來實現觸控事件的監聽。activity的觸控事件 override public boolean ontouchevent motionevent event 但是對於fragment,其中卻沒有這個方法,如果我們在fragm...
Vue中監聽鍵盤事件
一,在vue中,已經為常用的按鍵設定了別名,這樣我們就無需再去匹配keycode,直接使用別名就能監聽按鍵的事件 keyup.enter function 屬性名 鍵值.delete delete 刪除 backspace 退格 tab tab.enter enter 回車 esc esc 退出 s...
Vue如何監聽鍵盤事件中的按鍵
在我們的專案經常需要監聽一些鍵盤事件來觸發程式的執行,而vue中允許在監聽的時候新增關鍵修飾符 submit 對於一些常用鍵,還提供了按鍵別名 submit 縮寫形式 全部的按鍵別名 enter tab delete 捕獲 刪除 和 退格 鍵 esc space up.down left right...