如何在Revit中監聽鍵盤事件

2021-09-11 22:13:44 字數 4138 閱讀 2520

小夥伴們在做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...