windows消息淺析.doc_第1頁
windows消息淺析.doc_第2頁
windows消息淺析.doc_第3頁
windows消息淺析.doc_第4頁
免費(fèi)預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

在PB中使用Windows消息(一)Wm_syscommand參數(shù)使用消息,就是指Windows發(fā)出的一個(gè)通知,告訴應(yīng)用程序某個(gè)事情發(fā)生了。例如,單擊鼠標(biāo)、改變窗口尺寸、按下鍵盤上的一個(gè)鍵都會使Windows發(fā)送一個(gè)消息給應(yīng)用程序。消息本身是作為一個(gè)記錄傳遞給應(yīng)用程序的,這個(gè)記錄中包含了消息的類型以及其他信息。例如,對于單擊鼠標(biāo)所產(chǎn)生的消息來說,這個(gè)記錄中包含了單擊鼠標(biāo)時(shí)的坐標(biāo)。這個(gè)記錄類型叫做TMsg。它在Windows單元中是這樣聲明的: hwnd: HWND; / /窗口句柄message: UINT; / /消息常量標(biāo)識符wParam: WPARAM ; / 32位消息的特定附加信息lParam: LPARAM ; / 32位消息的特定附加信息time: DWORD; / /消息創(chuàng)建時(shí)的時(shí)間pt: TPoint; / /消息創(chuàng)建時(shí)的鼠標(biāo)位置hwnd 32位的窗口句柄。窗口可以是任何類型的屏幕對象,因?yàn)閃in32能夠維護(hù)大多數(shù)可視對象的句柄(窗口、對話框、按鈕、編輯框等)。message 用于區(qū)別其他消息的常量值,這些常量可以是Windows單元中預(yù)定義的常量,也可以是自定義的常量。wParam 通常是一個(gè)與消息有關(guān)的常量值,也可能是窗口或控件的句柄。lParam 通常是一個(gè)指向內(nèi)存中數(shù)據(jù)的指針。由于W P a r a m、l P a r a m和P o i n t e r都是3 2位的,因此,它們之間可以相互轉(zhuǎn)換。對于我們使用來說,在眾多的消息當(dāng)中,WM_SYSCOMMAND,使用率是最高的,對於WM_SYSCOMMAND,功能表ID指示系統(tǒng)功能表中的哪一項(xiàng)被選中,所參數(shù)對應(yīng)值如下:MF_BYCOMMAND = &H0&MF_BYPOSITION = &H400&SC_ARRANGE = &HF110SC_CLOSE = &HF060SC_HOTKEY = &HF150SC_HSCROLL = &HF080SC_KEYMENU = &HF100SC_MAXIMIZE = &HF030SC_MINIMIZE = &HF020SC_MOVE = &HF012 或 F010SC_NEXTWINDOW = &HF040SC_PREVWINDOW = &HF050SC_RESTORE = &HF120SC_SIZE = &HF000SC_VSCROLL = &HF070SC_TASKLIST = &HF130SC_SCREENSAVE = &HF140下面,介紹一下SC_COLSE、SC_MAXIMIZE、SC_MINIMIZE、SC_MOVE、SC_RESTORE、SC_SIZE、SC_HOTKEY這幾個(gè)常用參數(shù)在PB中的應(yīng)用:1、SC_CLOSE:61536 執(zhí)行關(guān)閉功能。常用點(diǎn):屏蔽掉關(guān)閉功能,使窗口系統(tǒng)的“X”變成灰色,并且不可用。實(shí)現(xiàn)方法:FUNCTION ulong GetSystemMenu(ulong hwnd,ulong bRevert) LIBRARY user32.dll FUNCTION ulong DeleteMenu(ulong hMenu,ulong nPosition,ulong wFlags) LIBRARY user32.dll FUNCTION ulong GetMenuItemCount(ulong hMenu) LIBRARY user32.dll 窗體Open中/ 按命令Long MF_BYCOMMAND = 0Long ll_hwndMenu ll_hwndMenu = GetSystemMenu(handle(this), 0) /得到系統(tǒng)菜單句柄DeleteMenu(ll_hwndMenu, SC_CLOSE, MF_BYCOMMAND) /屏蔽掉關(guān)閉功能/也可使用按位置屏蔽,即單擊窗口左上腳彈出系統(tǒng)菜單上的位置long MF_BYPOSITION =1024 Long ll_hwndMenu Long value Integer ill_hwndMenu = GetSystemMenu(handle(this), 0) i = GetMenuItemCount(ll_hwndMenu) DeleteMenu (ll_hwndMenu, c - 1, MF_BYPOSITION)有時(shí)候,屏蔽掉關(guān)閉功能一段時(shí)間后,還需要把此功能找回來,那么可以這樣實(shí)現(xiàn):Function Ulong AppendMenu(Ulong hMenu ,Ulong wFlags ,Ulong wIDNewItem ,Ref String lpNewItem ) Library User32 Alias For AppendMenuA Function Ulong GetMenuString(Ulong hMenu ,Ulong wIDItem , Ref String lpString,Ulong nMaxCount,Ulong wFlag ) Library User32 Alias For GetMenuStringA按鈕Cb_back click事件中:Long ll_hwndMenuLong WM_NCLBUTTONDOWN = 161Long HTCAPTION = 2 String ls_closeLl_hwndMenu = GetSystemMenu(handle(Parent), 0) ls_str = 我要關(guān)閉AppendMenu(hwndMenu, 0, 61536, ls_close) /添加關(guān)閉功能/* 此處需注意,上步操作雖然成功的添加了關(guān)閉功能,但加回去之後X仍是暗灰色,要等到我們做了某些固定的動作之後如單擊下狀態(tài)欄,它才會再度變Enable的顏色,所以,模擬一個(gè)單擊狀態(tài)欄的操作,使得X出現(xiàn)Enable的顏色。 Ps:此時(shí),單擊窗口左上腳彈出系統(tǒng)菜單,你會發(fā)現(xiàn),原來的“關(guān)閉”字樣變成了“我要關(guān)閉”*/Send(handle(Parent), WM_NCLBUTTONDOWN, HTCAPTION,0)引申:SC_MAXIMIZE、SC_MINIMIZE、SC_MOVE、SC_RESTORE、SC_SIZE這個(gè)功能參數(shù)也可同樣適用。如:下面的語句能實(shí)現(xiàn)屏蔽掉拖拽窗口移動功能DeleteMenu(ll_hwndMenu, SC_MOVE, MF_BYCOMMAND)下面的語句屏蔽掉size窗口大小的功能,此時(shí)拉動窗口邊框不能改變大小,但仍支持Max 和 MinDeleteMenu(ll_hwndMenu, SC_SIZE, MF_BYCOMMAND)2、SC_MOVE 61456、61458(分為客戶區(qū)和非客戶區(qū),非客戶區(qū)= 客戶區(qū) + HTCAPTION HTCAPTION = 2)窗口移動常用點(diǎn):屏蔽窗口拖動和拖動非狀態(tài)欄移動窗口實(shí)現(xiàn)方法:屏蔽窗口拖動 / 可使用上面禁止關(guān)閉功能的辦法禁止拖動,也可使用下面的辦法:窗口other事件中:/* 注意,要把客戶區(qū)和非客戶區(qū)的兩種移動方法全部屏蔽才能徹底屏蔽,如果單屏蔽掉非客戶區(qū) 61458,那在窗口系統(tǒng)菜單中仍可移動窗口 */If wparam = 61456 or wparam = 61458 Then Message.Processed = TrueMessage.ReturnValue=0End If引申:也可以使用同樣的辦法來屏蔽掉帶有titlebar的dw的拖動拖動非狀態(tài)欄移動窗口比如拖動一圖片拖動所在窗口,圖片控件上自定義事件,ue_drag,ID:pbm_lbuttondownLong WM_SYSCOMMAND = 274 Long SC_MOVE = 61458 / or = 61456Send ( Handle( parent ), WM_SYSCOMMAND, SC_MOVE, 0 )引申:通過更換sc_move可實(shí)現(xiàn)其他系統(tǒng)功能相關(guān)的操作。如下面語句實(shí)現(xiàn)指定數(shù)據(jù)窗口的最大化:Send(Handle(dw_1), WM_SYSCOMMAND, SC_MAXIMIZE, 0)下面語句實(shí)現(xiàn)指定數(shù)據(jù)窗口的最小化:Send(Handle(dw_1), WM_SYSCOMMAND, SC_MINIMIZE, 0)下面語句恢復(fù)指定數(shù)據(jù)窗口的默認(rèn)大小 Send(Handle(dw_1), WM_SYSCOMMAND, SC_RESTORE, 0)3、SC_HOTKEY 61776 系統(tǒng)熱鍵常用點(diǎn):為系統(tǒng)注冊些熱鍵值,方便操作下例中為窗口注冊熱鍵 Ctrl + Alt + X,實(shí)現(xiàn)窗口在最小化時(shí),還原窗口大小實(shí)現(xiàn)方法:function long SendMessageA(long lhWnd,uint uiMsg,long lwMsg,long lwParam) library user32.dllPublic:Constant Long WM_SETHOTKEY = 50 Constant Long HK_MYHOTKEY = 1624 /熱鍵參數(shù)值 Ctrl + Alt + XConstant Long SC_HOTKEY = 61776Constant Long WM_SYSCOMMAND = 274 Constant Long SC_RESTORE = 61728/ Open事件中l(wèi)ong ll_rtnll_rtn = SendMessageA(Handle(this), WM_SETHOTKEY, HK_MYHOTKEY, 0)If ll_rtn 1 Thenmessagebox(注冊失敗,注冊熱鍵失敗,無法使用熱鍵服務(wù))End If/ Other事件中IF wparam = SC-HOTKEY THEN Send(Handle(This), WM_SYSCOMMAND, SC_RESTORE, 0)END IF備注:想注冊熱鍵鍵值的獲得辦法:高8位字節(jié)與低8位字節(jié)組成16位字節(jié),然后將它換算成十進(jìn)制數(shù),即得到所需的HK-MYHOTK

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論