1. 程式人生 > >c# 呼叫c++dll掛鉤其他程式執行緒或者程序

c# 呼叫c++dll掛鉤其他程式執行緒或者程序

        為msdn 明確的說過c#不能全域性掛鉤,對於我這個學習面向物件的c#來說,無疑是有一定的難度的。鉤子分為全域性鉤子和執行緒鉤子,全域性鉤子掛鉤整個windows作業系統體系內的甄別優先權,而執行緒鉤子則掛鉤某一特定的程式,例如外掛,QQ盜號技術等都是有執行緒來決定的。windows鉤子三個數,SetWindowsHookExSetWindowsHookEx,CallNextHookEx。這些函式都有windows提供,最奇怪的是後掛鉤的竟然先執行,有點類似於棧。

       c++dll編寫,需要注意一以下幾點。標頭檔案中需要又匯出函式,否則載入的時候會不識別: extern "C" __declspec(dllexport) BOOL Start(); extern "C" __declspec(dllexport) void Stop(); #if !defined(AFX_DLL_H__CC961918_48E3_4FDB_AFA5_679670A94349__INCLUDED_) #define AFX_DLL_H__CC961918_48E3_4FDB_AFA5_679670A94349__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class DLL { public: DLL(); virtual ~DLL(); }; #endif // !defined(AFX_DLL_H__CC961918_48E3_4FDB_AFA5_679670A94349__INCLUDED_)

     例如:無參 start,無參stop 都為匯出函式 選單掛鉤和鍵盤按鍵響應都可以用GetMesage鉤子

    1.選單鉤子 if(msg->message==WM_COMMAND) { if (0 == HIWORD(msg->wParam)) { wmId=LOWORD(msg->wParam); if(wmId==IDM_ABOUT) MessageBoxA(0,"攔截到選單訊息","提示",64); else MessageBoxA(0,"沒有攔截到選單訊息","提示",64); } } 注意:此處msg為結構體必須在判斷IDM_ABOUT選單ID號的時候用指標指向,如果按照鉤子回撥函式的wparam來判斷,無疑是總是不正確。

     2. 鍵盤響應鉤子 if (msg->message == WM_CHAR) { if (msg->wParam == '0') { MessageBoxA(0,"已經攔截到關閉訊息","提示",64); return 0; } if (msg->wParam == '5') { MessageBoxA(0,"已經攔截","提示",64); } } 攔截0和5的一個鉤子程,此兩個鉤子通過GETMESSAGE掛鉤,前者無疑是可以WH_CALLWNDPROC掛鉤,後者更是可以通過鍵盤來掛鉤。鉤子安裝原型:mHook=::SetWindowsHookEx (WH_GETMESSAGE,KeyProc,hInstance,progID);

     DLL寫好了之後下面可以載入了,在c# 中提供了最簡單的DLL 訪問,只要剛才所寫的DLL 拷貝到c#原始檔DEBUG目錄下,然後通過地址定址函式來載入DLL和尋訪函式入口地址,以及傳遞引數: bool k = false; try { _amDBRSetThermoModel amf = (_amDBRSetThermoModel)DLLWrapper.GetFunctionAddress(hModule(), "Start", typeof(_amDBRSetThermoModel)); k = amf(kk); } catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); } 這樣基本上掛鉤到你所想要的任何執行緒程式上面。

相關推薦

c# 呼叫c++dll掛鉤其他程式執行或者程序

        為msdn 明確的說過c#不能全域性掛鉤,對於我這個學習面向物件的c#來說,無疑是有一定的難度的。鉤子分為全域性鉤子和執行緒鉤子,全域性鉤子掛鉤整個windows作業系統體系內的甄別優先權,而執行緒鉤子則掛鉤某一特定的程式,例如外掛,QQ盜號技術等都是有執行

獲得執行或者程序的真實控制代碼的方法

上章我們講到偽控制代碼帶來的一系列麻煩,那麼怎麼辦呢 一個方法是使用duplicateHandle把偽控制代碼轉化程實控制代碼 DuplicateHandle原本是程序間複製控制代碼的函式,原理其實

關於 C#呼叫CDll,有回撥函式時,只執行一次回撥函式就直接掛掉 的解決方法

錯誤         直接當機,如下圖:           錯誤原因        回撥函式宣告原因,跟堆疊有關係  

C#呼叫c++封裝的dll檔案提示未能載入正確的程式集XXX或其某一依賴項。。。

IDE:VS2010 語言:C# 異常:System.BadImageFormatException,未能載入正確的程式集XXX或其某一依賴項。。。 一般是由於目標程式的目標平臺與其某一依賴項的目標編譯平臺不一致導致, 把所有的專案都修改到同一目標平臺下(X86、X64或A

C#呼叫C++編寫的DLL函式引數傳遞

                        &nb

[轉]C#呼叫C++ DLL

在開發過程中經常需要在C#中呼叫C++編寫的DLL,中間碰到過一些問題,這裡做個總結,方便以後參考。 型別對照問題 記憶體釋放問題 版本問題(x86與x64) 編譯問題(靜態與動態) 資源載入問題 異常捕獲與問題定位 型別對照問題   c#呼叫c++方法時,首先要在類中定義

C#呼叫C++的dll傳遞二維陣列

1.C++中標頭檔案.h extern "C" MATHFUNCSDLL_API  int  __stdcall CallTest(int** arr, int rows, int cols); 2.C++中原始檔.cpp int __stdcall CallTest

C#呼叫C++生成的dll,傳字串型別,返回字串型別

1.建立一個C++的動態連結庫   標頭檔案.h #include<string> #include<vector> #include<iostream> #include <cstring> using namespace std;

C#呼叫C++編寫的DLL函式各種引數傳遞問題

[System.Security.SuppressUnmanagedCodeSecurity] // We won't use this maliciously   [DllImport("User32.dll", CharSet=CharSet.Auto)]   public static extern

求助!!!關於C#呼叫C++DLL檔案中二維指標的問題

如何限定textbox的輸入內容c#讀取一個xml中註釋資訊如何限定textbox的輸入內容c#讀取一個xml中註釋資訊 為何程式中沒有看到IComparable的實現,程式也能執行?檔案寫入優化為何程式中沒有看到IComparable的實現,程式也能執行?檔案寫入優化 請問

C#呼叫c++dll出現StackOverflowException

請問二維陣列如何進行統計呢正則表示式匹配URL請問二維陣列如何進行統計呢正則表示式匹配URL 微軟論壇2012上海聚會熱忱邀請您的參與體驗XboxKinect體感遊戲!現場抽獎!6月2日週六微軟上海OfficeC#傳送郵件失敗微軟論壇2012上海聚會熱忱邀請您的參與體驗Xbo

C#呼叫C++DLL方法

最近使用海康的某平臺SDK,但是提供的demo沒有C#版本,只有C++的,在轉換過程中遇到很多問題,簡單記錄一下. 目錄 1.引數為基本型別,例如 int,float,char等。 [C++] void fun(int value); v

C++ 基礎(四)C# 呼叫 C++的DLL: [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]

C# [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]   關於這部分內容,往後我會詳細解釋。   https://docs.microsoft.com/zh-cn/dotnet/api/syste

結構體指標作函式引數(C# 呼叫C++ 的DLL

1、C++結構體定義:   #pragma pack(1)  struct Person  {      #define Count_favoriteNumbers 6        int id;        fl

C++呼叫C#庫(DLL)

一、工作環境 1.平 臺:Windows 10 (64位) 2.軟體環境:VS2013 3.項 目:MFC 二、C++呼叫C#庫(DLL) 1.準備C#庫 (Dll檔案) 1.1 建立C#類庫 1.2 實現C#程式碼 //C#程式碼 using Syste

C#呼叫Delphi Dll返回字串的示例

//----------------------Delphi------------------- procedure GetSqlData(ASource: PChar; ADest: PChar;

C#呼叫VC dll 出現“System.BadImageFormatException”

namespace Hello_seesharp {     class Program     {         [DllImport("Read-WriteString.dll", EntryPoint = "Add",          ExactSpelling

C++ 呼叫C#工程的 dll , 互相呼叫方法

很多時候在專案中需要通過C++呼叫C#的dll,或者反過來條用。 首先明白一個前提:C#是託管型程式碼。C++是非託管型程式碼。 託管型程式碼的物件在託管堆上分配記憶體,建立的物件由虛擬機器託管。(C# )        非託管型程式碼物件有實際的記憶體地址,建立的物件必

c#呼叫C/C++ DLL,傳入指標陣列(指標指向自定的結構體)

來源:http://bbs.csdn.net/topics/380165851 依靠以下文章:解決問題。 、、、、、、、、、、、、、、、、、、、、 可以用Marshal.StruectToPtr哦。 、、、、、、、、、、、、、、 [StructLayout(Layo

(c# 呼叫c++dll)an unhandled exception of type 'system.runtime.interopservices.comexception'

問題發生場景:     win10 64bit作業系統,vs2008     c++開發的dll檔案,c#建立WindowsFormsApplication或者ConsoleApplication     託管方式呼叫c++dll檔案