我們在做專案的時候,可能會碰到需要監視非我們開發的程式的訊息,比如監視個記事本,幫助檔案等等
其實做到這個很簡單,主要應用如下幾個api
getwindowlong (
setwindowlong (
callwindowproc (
還可能會用到findwindow ( 等
下面我們舉個簡單的例子來說明下
假定要求如下:
程式沒有主窗體,開啟乙個幫助檔案,關閉幫助檔案的時候程式退出
開啟幫助檔案,我們使用htmlhelp (這個api
首先我們宣告乙個delagate,供setwindowlong 使用
public
delegate
int callwindowprocdelegate(int wnd, int msg, int wparam, int lparam);
public
static callwindowprocdelegate mycallwindowproc;
然後我們宣告幾個需要用到的訊息
public
const
int hh_display_index = 0x0002; //顯示幫助檔案的時候,顯示index的tab
public
const
int gwl_wndproc = -4; //供getwindowlong 和setwindowlong 使用
然後定義乙個私有變數,儲存getwindowlong 獲得的值
public
static
int oldwindow = 0;
接下來宣告需要用到的api
[dllimport("user32.dll")]
protected
static
extern
int getwindowlong(int hwindow, int unindex);
[dllimport("user32.dll")]
protected
static
extern
int callwindowproc(int lpprevwndfunc, int hwnd, int msg, int wparam, int lparam);
[dllimport("user32.dll")]
protected
static
extern
int setwindowlong(int hwindow, int unindex, callwindowprocdelegate lnewvalue);//這個是關鍵
[dllimport("hhctrl.ocx", charset = charset.unicode, entrypoint = "htmlhelpw")]
protected
static
extern
int htmlhelp(int caller,string file,uint command,string str);
在main方法中:
wndproc方法
完整**如下:
我這裡沒有用到findwindow是因為我用htmlhelp可以得到我外部程式的handle,如果你是監視其他的程式可以先用這個api得到handle。
監視程式中的死鎖及其他
每天回家路上總有一段比較長的路一片漆黑無法看書。這種時候,如果我有興致則會用手機上上網,但是大部分情況下還是用來想問題的。剛才在路上想起今天的工作之一是讓乙個型別中的所有方法對多執行緒 完全互斥 我不知道如何為它命名,我的意思是乙個類中任意兩個方法a或b,在a沒有退出前,另乙個執行緒是無法訪問b的 ...
在應用程式中啟動其他程式的方法
1 uint winexec lpcstr lpcmdline,uint ucmdshow eg if winexec cdplayer.exe sw maximize 31 afxmessagebox 執行cd eg winexec winmine.exe sw shownormal winexe...
在linux中如何除錯C語言程式
在linux下面可以使用下面幾種形式對c語言進行除錯 1 gdb gdb program這是最原始的除錯方法,若非熟悉命令列,這種方式其實是比較麿人的。有興趣的可以參考一些我之前的博文。這裡再附一圖 gdbtui program比gdb的方式更加友好一些,但也不大好用。安裝ddd之後執行 安裝了ne...