C#調用SendMessage 用法

来源:http://www.cnblogs.com/sosoft/archive/2016/03/01/5232132.html
-Advertisement-
Play Games

函數功能:該函數將指定的消息發送到一個或多個視窗。此函數為指定的視窗調用視窗程式,直到視窗程式處理完消息再返回。該函數是應用程式和應用程式之間進行消息傳遞的主要手段之一。 函數原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM


函數功能:該函數將指定的消息發送到一個或多個視窗。此函數為指定的視窗調用視窗程式,直到視窗程式處理完消息再返回。該函數是應用程式和應用程式之間進行消息傳遞的主要手段之一。
    函數原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);

    參數:

    hWnd:其視窗程式將接收消息的視窗的句柄。如果此參數為HWND_BROADCAST,則消息將被髮送到系統中所有頂層視窗,包括無效或不可見的非自身擁有的視窗、被覆蓋的視窗和彈出式視窗,但消息不被髮送到子視窗。

    Msg:指定被髮送的消息。

    wParam:指定附加的消息指定信息。

    IParam:指定附加的消息指定信息。

    返回值:返回值指定消息處理的結果,依賴於所發送的消息。

    備註:需要用HWND_BROADCAST通信的應用程式應當使用函數RegisterWindowMessage來為應用程式間的通信取得一個唯一的消息。

    如果指定的視窗是由調用線程創建的,則視窗程式立即作為子程式調用。如果指定的視窗是由不同線程創建的,則系統切換到該線程並調用恰當的視窗程式。線程間的消息只有線上程執行消息檢索代碼時才被處理。發送線程被阻塞直到接收線程處理完消息為止。

C#中使用該函數首先導入命名空間:
using System.Runtime.InteropServices;

然後寫API引用部分的代碼,放入 class 內部
[DllImport("user32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);

這個函數有四個參數,第一個是視窗句柄,視窗可以是任何類型的屏幕對象;第二個是用於區別其他消息的常量值;第三個通常是一個與消息有關的常量值,也可能是視窗或控制項的句柄,第三個參數是可選參數,有的消息要,有的不需要,比如單擊就不需要這個參數,
別的消息,比如滑鼠移動的可能需要在這裡加上一些滑鼠的參數;第四個通常是一個指向記憶體中數據的指針。在C#中消息需要定義成windows系統中的原始的16進位數字,比如 const int WM_Lbutton = 0x201; //定義了滑鼠的左鍵點擊消息。詳細值在最後。

例如:

const int BM_CLICK = 0xF5;
IntPtr maindHwnd = FindWindow(null, "QQ用戶登錄"); //獲得QQ登陸框的句柄 hovertree.com
if (maindHwnd != IntPtr.Zero)
{
    IntPtr childHwnd = FindWindowEx(maindHwnd, IntPtr.Zero, null, "登錄");   //獲得按鈕的句柄
    if (childHwnd != IntPtr.Zero)
    {
        SendMessage(childHwnd, BM_CLICK, 0, 0);     //發送點擊按鈕的消息
    }
    else
    {
        MessageBox.Show("沒有找到子視窗");
    }
}
else
{
    MessageBox.Show("沒有找到視窗");
}

wMsg參數常量值:

 //創建一個視窗   
const int WM_CREATE = 0x01;   
//當一個視窗被破壞時發送   
const int WM_DESTROY = 0x02;   
//移動一個視窗   
const int WM_MOVE = 0x03;   
//改變一個視窗的大小   
const int WM_SIZE = 0x05;   
//一個視窗被激活或失去激活狀態   
const int WM_ACTIVATE = 0x06;   
//一個視窗獲得焦點   
const int WM_SETFOCUS = 0x07;   
//一個視窗失去焦點   
const int WM_KILLFOCUS = 0x08;   
//一個視窗改變成Enable狀態   
const int WM_ENABLE = 0x0A;   
//設置視窗是否能重畫   
const int WM_SETREDRAW = 0x0B;   
//應用程式發送此消息來設置一個視窗的文本   
const int WM_SETTEXT = 0x0C;   
//應用程式發送此消息來複制對應視窗的文本到緩衝區   
const int WM_GETTEXT = 0x0D;   
//得到與一個視窗有關的文本的長度(不包含空字元)   
const int WM_GETTEXTLENGTH = 0x0E;   
//要求一個視窗重畫自己   
const int WM_PAINT = 0x0F;   
//當一個視窗或應用程式要關閉時發送一個信號   
const int WM_CLOSE = 0x10;   
//當用戶選擇結束對話框或程式自己調用ExitWindows函數   
const int WM_QUERYENDSESSION = 0x11;   
//用來結束程式運行   
const int WM_QUIT = 0x12;   
//當用戶視窗恢復以前的大小位置時,把此消息發送給某個圖標   
const int WM_QUERYOPEN = 0x13;   
//當視窗背景必須被擦除時(例在視窗改變大小時)   
const int WM_ERASEBKGND = 0x14;   
//當系統顏色改變時,發送此消息給所有頂級視窗   
const int WM_SYSCOLORCHANGE = 0x15;   
//當系統進程發出WM_QUERYENDSESSION消息後,此消息發送給應用程式,通知它對話是否結束   
const int WM_ENDSESSION = 0x16;   
//當隱藏或顯示視窗是發送此消息給這個視窗   
const int WM_SHOWWINDOW = 0x18;   
//發此消息給應用程式哪個視窗是激活的,哪個是非激活的   
const int WM_ACTIVATEAPP = 0x1C;   
//當系統的字體資源庫變化時發送此消息給所有頂級視窗   
const int WM_FONTCHANGE = 0x1D;   
//當系統的時間變化時發送此消息給所有頂級視窗   
const int WM_TIMECHANGE = 0x1E;   
//發送此消息來取消某種正在進行的摸態(操作)   
const int WM_CANCELMODE = 0x1F;   
//如果滑鼠引起游標在某個視窗中移動且滑鼠輸入沒有被捕獲時,就發消息給某個視窗   
const int WM_SETCURSOR = 0x20;   
//當游標在某個非激活的視窗中而用戶正按著滑鼠的某個鍵發送此消息給//當前視窗   
const int WM_MOUSEACTIVATE = 0x21;   
//發送此消息給MDI子視窗//當用戶點擊此視窗的標題欄,或//當視窗被激活,移動,改變大小   
const int WM_CHILDACTIVATE = 0x22;   
//此消息由基於電腦的訓練程式發送,通過WH_JOURNALPALYBACK的hook程式分離出用戶輸入消息   
const int WM_QUEUESYNC = 0x23;   
//此消息發送給視窗當它將要改變大小或位置   
const int WM_GETMINMAXINFO = 0x24;   
//發送給最小化視窗當它圖標將要被重畫   
const int WM_PAINTICON = 0x26;   
//此消息發送給某個最小化視窗,僅//當它在畫圖標前它的背景必須被重畫   
const int WM_ICONERASEBKGND = 0x27;   
//發送此消息給一個對話框程式去更改焦點位置   
const int WM_NEXTDLGCTL = 0x28;   
//每當列印管理列隊增加或減少一條作業時發出此消息    
const int WM_SPOOLERSTATUS = 0x2A;   
//當button,combobox,listbox,menu的可視外觀改變時發送   
const int WM_DRAWITEM = 0x2B;   
//當button, combo box, list box, list view control, or menu item 被創建時   
const int WM_MEASUREITEM = 0x2C;   
//此消息有一個LBS_WANTKEYBOARDINPUT風格的發出給它的所有者來響應WM_KEYDOWN消息    
const int WM_VKEYTOITEM = 0x2E;   
//此消息由一個LBS_WANTKEYBOARDINPUT風格的列表框發送給他的所有者來響應WM_CHAR消息    
const int WM_CHARTOITEM = 0x2F;   
//當繪製文本時程式發送此消息得到控制項要用的顏色   
const int WM_SETFONT = 0x30;   
//應用程式發送此消息得到當前控制項繪製文本的字體   
const int WM_GETFONT = 0x31;   
//應用程式發送此消息讓一個視窗與一個熱鍵相關連    
const int WM_SETHOTKEY = 0x32;   
//應用程式發送此消息來判斷熱鍵與某個視窗是否有關聯   
const int WM_GETHOTKEY = 0x33;   
//此消息發送給最小化視窗,當此視窗將要被拖放而它的類中沒有定義圖標,應用程式能返回一個圖標或游標的句柄,當用戶拖放圖標時系統顯示這個圖標或游標   
const int WM_QUERYDRAGICON = 0x37;   
//發送此消息來判定combobox或listbox新增加的項的相對位置   
const int WM_COMPAREITEM = 0x39;   
//顯示記憶體已經很少了   
const int WM_COMPACTING = 0x41;   
//發送此消息給那個視窗的大小和位置將要被改變時,來調用setwindowpos函數或其它視窗管理函數   
const int WM_WINDOWPOSCHANGING = 0x46;   
//發送此消息給那個視窗的大小和位置已經被改變時,來調用setwindowpos函數或其它視窗管理函數   
const int WM_WINDOWPOSCHANGED = 0x47;   
//當系統將要進入暫停狀態時發送此消息   
const int WM_POWER = 0x48;   
//當一個應用程式傳遞數據給另一個應用程式時發送此消息   
const int WM_COPYDATA = 0x4A;   
//當某個用戶取消程式日誌激活狀態,提交此消息給程式   
const int WM_CANCELJOURNA = 0x4B;   
//當某個控制項的某個事件已經發生或這個控制項需要得到一些信息時,發送此消息給它的父視窗    
const int WM_NOTIFY = 0x4E;   
//當用戶選擇某種輸入語言,或輸入語言的熱鍵改變   
const int WM_INPUTLANGCHANGEREQUEST = 0x50;   
//當平臺現場已經被改變後發送此消息給受影響的最頂級視窗   
const int WM_INPUTLANGCHANGE = 0x51;   
//當程式已經初始化windows幫助常式時發送此消息給應用程式   
const int WM_TCARD = 0x52;   
//此消息顯示用戶按下了F1,如果某個菜單是激活的,就發送此消息個此視窗關聯的菜單,否則就發送給有焦點的視窗,如果//當前都沒有焦點,就把此消息發送給//當前激活的視窗   
const int WM_HELP = 0x53;   
//當用戶已經登入或退出後發送此消息給所有的視窗,//當用戶登入或退出時系統更新用戶的具體設置信息,在用戶更新設置時系統馬上發送此消息   
const int WM_USERCHANGED = 0x54;   
//公用控制項,自定義控制項和他們的父視窗通過此消息來判斷控制項是使用ANSI還是UNICODE結構   
const int WM_NOTIFYFORMAT = 0x55;   
//當用戶某個視窗中點擊了一下右鍵就發送此消息給這個視窗   
//const int WM_CONTEXTMENU = ??;   
//當調用SETWINDOWLONG函數將要改變一個或多個 視窗的風格時發送此消息給那個視窗   
const int WM_STYLECHANGING = 0x7C;   
//當調用SETWINDOWLONG函數一個或多個 視窗的風格後發送此消息給那個視窗   
const int WM_STYLECHANGED = 0x7D;   
//當顯示器的解析度改變後發送此消息給所有的視窗   
const int WM_DISPLAYCHANGE = 0x7E;   
//此消息發送給某個視窗來返回與某個視窗有關連的大圖標或小圖標的句柄   
const int WM_GETICON = 0x7F;   
//程式發送此消息讓一個新的大圖標或小圖標與某個視窗關聯   
const int WM_SETICON = 0x80;   
//當某個視窗第一次被創建時,此消息在WM_CREATE消息發送前發送   
const int WM_NCCREATE = 0x81;   
//此消息通知某個視窗,非客戶區正在銷毀    
const int WM_NCDESTROY = 0x82;   
//當某個視窗的客戶區域必須被核算時發送此消息   
const int WM_NCCALCSIZE = 0x83;   
//移動滑鼠,按住或釋放滑鼠時發生   
const int WM_NCHITTEST = 0x84;   
//程式發送此消息給某個視窗當它(視窗)的框架必須被繪製時   
const int WM_NCPAINT = 0x85;   
//此消息發送給某個視窗僅當它的非客戶區需要被改變來顯示是激活還是非激活狀態   
const int WM_NCACTIVATE = 0x86;   
//發送此消息給某個與對話框程式關聯的控制項,widdows控制方位鍵和TAB鍵使輸入進入此控制項通過應   
const int WM_GETDLGCODE = 0x87;   
//當游標在一個視窗的非客戶區內移動時發送此消息給這個視窗 非客戶區為:窗體的標題欄及窗 的邊框體   
const int WM_NCMOUSEMOVE = 0xA0;   
//當游標在一個視窗的非客戶區同時按下滑鼠左鍵時提交此消息   
const int WM_NCLBUTTONDOWN = 0xA1;   
//當用戶釋放滑鼠左鍵同時游標某個視窗在非客戶區十發送此消息    
const int WM_NCLBUTTONUP = 0xA2;   
//當用戶雙擊滑鼠左鍵同時游標某個視窗在非客戶區十發送此消息   
const int WM_NCLBUTTONDBLCLK = 0xA3;   
//當用戶按下滑鼠右鍵同時游標又在視窗的非客戶區時發送此消息   
const int WM_NCRBUTTONDOWN = 0xA4;   
//當用戶釋放滑鼠右鍵同時游標又在視窗的非客戶區時發送此消息   
const int WM_NCRBUTTONUP = 0xA5;   
//當用戶雙擊滑鼠右鍵同時游標某個視窗在非客戶區十發送此消息   
const int WM_NCRBUTTONDBLCLK = 0xA6;   
//當用戶按下滑鼠中鍵同時游標又在視窗的非客戶區時發送此消息   
const int WM_NCMBUTTONDOWN = 0xA7;   
//當用戶釋放滑鼠中鍵同時游標又在視窗的非客戶區時發送此消息   
const int WM_NCMBUTTONUP = 0xA8;   
//當用戶雙擊滑鼠中鍵同時游標又在視窗的非客戶區時發送此消息   
const int WM_NCMBUTTONDBLCLK = 0xA9;   
//WM_KEYDOWN 按下一個鍵   
const int WM_KEYDOWN = 0x0100;   
//釋放一個鍵   
const int WM_KEYUP = 0x0101;   
//按下某鍵,並已發出WM_KEYDOWN, WM_KEYUP消息   
const int WM_CHAR = 0x102;   
//當用translatemessage函數翻譯WM_KEYUP消息時發送此消息給擁有焦點的視窗   
const int WM_DEADCHAR = 0x103;   
//當用戶按住ALT鍵同時按下其它鍵時提交此消息給擁有焦點的視窗   
const int WM_SYSKEYDOWN = 0x104;   
//當用戶釋放一個鍵同時ALT 鍵還按著時提交此消息給擁有焦點的視窗   
const int WM_SYSKEYUP = 0x105;   
//當WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函數翻譯後提交此消息給擁有焦點的視窗   
const int WM_SYSCHAR = 0x106;   
//當WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函數翻譯後發送此消息給擁有焦點的視窗   
const int WM_SYSDEADCHAR = 0x107;   
//在一個對話框程式被顯示前發送此消息給它,通常用此消息初始化控制項和執行其它任務   
const int WM_INITDIALOG = 0x110;   
//當用戶選擇一條菜單命令項或當某個控制項發送一條消息給它的父視窗,一個快捷鍵被翻譯   
const int WM_COMMAND = 0x111;   
//當用戶選擇視窗菜單的一條命令或//當用戶選擇最大化或最小化時那個視窗會收到此消息   
const int WM_SYSCOMMAND = 0x112;   
//發生了定時器事件   
const int WM_TIMER = 0x113;   
//當一個視窗標準水平滾動條產生一個滾動事件時發送此消息給那個視窗,也發送給擁有它的控制項   
const int WM_HSCROLL = 0x114;   
//當一個視窗標準垂直滾動條產生一個滾動事件時發送此消息給那個視窗也,發送給擁有它的控制項   
const int WM_VSCROLL = 0x115;   
//當一個菜單將要被激活時發送此消息,它發生在用戶菜單條中的某項或按下某個菜單鍵,它允許程式在顯示前更改菜單   
const int WM_INITMENU = 0x116;   
//當一個下拉菜單或子菜單將要被激活時發送此消息,它允許程式在它顯示前更改菜單,而不要改變全部   
const int WM_INITMENUPOPUP = 0x117;   
//當用戶選擇一條菜單項時發送此消息給菜單的所有者(一般是視窗)   
const int WM_MENUSELECT = 0x11F;   
//當菜單已被激活用戶按下了某個鍵(不同於加速鍵),發送此消息給菜單的所有者   
const int WM_MENUCHAR = 0x120;   
//當一個模態對話框或菜單進入空載狀態時發送此消息給它的所有者,一個模態對話框或菜單進入空載狀態就是在處理完一條或幾條先前的消息後沒有消息它的列隊中等待   
const int WM_ENTERIDLE = 0x121;   
//在windows繪製消息框前發送此消息給消息框的所有者視窗,通過響應這條消息,所有者視窗可以通過使用給定的相關顯示設備的句柄來設置消息框的文本和背景顏色   
const int WM_CTLCOLORMSGBOX = 0x132;   
//當一個編輯型控制項將要被繪製時發送此消息給它的父視窗通過響應這條消息,所有者視窗可以通過使用給定的相關顯示設備的句柄來設置編輯框的文本和背景顏色   
const int WM_CTLCOLOREDIT = 0x133;   
  
//當一個列表框控制項將要被繪製前發送此消息給它的父視窗通過響應這條消息,所有者視窗可以通過使用給定的相關顯示設備的句柄來設置列表框的文本和背景顏色   
const int WM_CTLCOLORLISTBOX = 0x134;   
//當一個按鈕控制項將要被繪製時發送此消息給它的父視窗通過響應這條消息,所有者視窗可以通過使用給定的相關顯示設備的句柄來設置按紐的文本和背景顏色   
const int WM_CTLCOLORBTN = 0x135;   
//當一個對話框控制項將要被繪製前發送此消息給它的父視窗通過響應這條消息,所有者視窗可以通過使用給定的相關顯示設備的句柄來設置對話框的文本背景顏色   
const int WM_CTLCOLORDLG = 0x136;   
//當一個滾動條控制項將要被繪製時發送此消息給它的父視窗通過響應這條消息,所有者視窗可以通過使用給定的相關顯示設備的句柄來設置滾動條的背景顏色   
const int WM_CTLCOLORSCROLLBAR = 0x137;   
//當一個靜態控制項將要被繪製時發送此消息給它的父視窗通過響應這條消息,所有者視窗可以 通過使用給定的相關顯示設備的句柄來設置靜態控制項的文本和背景顏色   
const int WM_CTLCOLORSTATIC = 0x138;   
//當滑鼠輪子轉動時發送此消息個當前有焦點的控制項   
const int WM_MOUSEWHEEL = 0x20A;   
//雙擊滑鼠中鍵   
const int WM_MBUTTONDBLCLK = 0x209;   
//釋放滑鼠中鍵   
const int WM_MBUTTONUP = 0x208;   
//移動滑鼠時發生,同WM_MOUSEFIRST   
const int WM_MOUSEMOVE = 0x200;   
//按下滑鼠左鍵   
const int WM_LBUTTONDOWN = 0x201;   
//釋放滑鼠左鍵   
const int WM_LBUTTONUP = 0x202;   
//雙擊滑鼠左鍵   
const int WM_LBUTTONDBLCLK = 0x203;   
//按下滑鼠右鍵   
const int WM_RBUTTONDOWN = 0x204;   
//釋放滑鼠右鍵   
const int WM_RBUTTONUP = 0x205;   
//雙擊滑鼠右鍵   
const int WM_RBUTTONDBLCLK = 0x206;   
//按下滑鼠中鍵   
const int WM_MBUTTONDOWN = 0x207;   
  
const int WM_USER = 0x0400;   
const int MK_LBUTTON = 0x0001;   
const int MK_RBUTTON = 0x0002;   
const int MK_SHIFT = 0x0004;   
const int MK_CONTROL = 0x0008;   
const int MK_MBUTTON = 0x0010;   
const int MK_XBUTTON1 = 0x0020;   
const int MK_XBUTTON2 = 0x0040;

http://www.cnblogs.com/sosoft/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.網路下載文件 1 URL url = new URL(strUrl); 2 3 HttpURLConnection httpconn = (HttpURLConnection)url.openConnection(); 4 5 httpconn.getContentLength(); 2.本地文
  • Web How to do distributed locking Writing Next Generation Reusable JavaScript Modules in ECMAScript 6 Essential Tools for Building SPAs with AngularJS...
  • dataGrid 其實就是一個HTML TABLE 想清楚這個以後,要設置多維表頭就好辦了 HTML代碼 <asp:DataGrid ID="DataGrid1" runat="server" onitemdatabound="DataGrid1_ItemDataBound"> </asp:Data
  • 1、為服務創建安裝程式 1)、返回到 Service1 的“設計”視圖。 2)、單擊設計器的背景以選擇服務本身,而不是它的任何內容。 3)、在“屬性”視窗中,單擊屬性列表下麵灰色區域中的“添加安裝程式”鏈接。 預設情況下,向您的項目添加包含兩個安裝程式的組件類。將該組件命名為ProjectInsta
  • 先來點與標題不相關的: CLR支持兩種程式集:弱命名程式集和強命名程式集。 兩者的區別在於強命名程式集使用發佈者的公鑰和私鑰進行簽名。由於程式集被唯一性地標識,所以當應用程式綁定到強命名程式集時,CLR可以應用一些已知安全的策略。 程式集可以採用兩種方式部署:私有或者全局。弱命名程式集只能以私有方式
  • 錯誤狀況: 下麵內容來自網路,自己也另有補充 原因:在安裝Framework v4.0之後,再啟用IIS,導致Framework沒有完全安裝 解決辦法:開始->所有程式->附件->滑鼠右鍵點擊“命令提示符”->以管理員身份運行-> 32位的win7:%windir%\Microsoft.NET\Fr
  • ------------------------------------------------ 重點提示: 1、程式的註釋:單行註釋、多行註釋; ------------------------------------------------ 第1節 .Net學習路線及幾個容易混淆的概念 C#過程
  • 在我們的程式中,經常會有一些耗時較長的運算,為了保證用戶體驗,不引起界面不響應,我們一般會採用多線程操作,讓耗時操作在後臺完成,完成後再進行處理或給出提示,在運行中,也會時時去刷新界面上的進度條等顯示,必要時還要控制後臺線程中斷當前操作。 以前,類似的應用會比較麻煩,需要寫的代碼較多,也很容易出現異
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...