標準タスクマネージャにタブページを追加し、それに配置したコントロールを操作した
いと考えております。
作成したDLLをアプリ側からCreateRemoteThreadとLoadLibraryを用いてインジェクショ
ンし、アタッチされたら
ページをダイアログボックスで作成して追加し、タスクマネージャのプロシージャをサ
ブクラス化
してタブページの制御というようにしたいと思っています。
しかし、以下のソースを実行すると、ページは追加されるのですが作成したタブに切り
替えようとすると
ハンドルされていないWin32の例外が発生しましたとエラーが出てしてしまいます。
いろいろ見てみるとg_hAddTab値がNULLで、タブページの元となるダイアログが作成され
ていないようです。
ダイアログはこちらを参考に作成いたしました
http://home.a03.itscom.net/tsuzu/programing/tips28.htm
ダイアログリソースはDLL内にあります
なお、タスクマネージャのインスタンスハンドルやウィンドウハンドルはきちんと取れ
ております
なぜダイアログが作られないのか、わかりません
よろしければアドバイスいただけないでしょうか?
VS.NET2003 VC++ 非MFCです
-----DLL-----
<DllMain>
case DLL_PROCESS_ATTACH:
g_hDll = hInstance;
Initialize();
<Initialize>
//タスクマネージャのインスタンスハンドルを取得
g_hTaskManagerInst = (HINSTANCE)GetWindowLong(g_hTaskManager,
GWL_HINSTANCE);
//タスクマネージャプロシージャのサブクラス化
g_OriginalTaskManagerWndProc = (WNDPROC)SetWindowLong(g_hTaskManager,
GWL_WNDPROC, (LONG)NewTaskManagerWndProc);
//タブコントロールへのページの追加
TabCount = TabCtrl_GetItemCount(g_hTaskTab);
TabCtrl_InsertItem(g_hWndTaskTab, TabCount+1, &tc);
//ページの作成
g_hAddTab = CreateDialog(g_hTaskManagerInst, (LPCTSTR)IDD_ADDTAB_1,
g_hTaskManager, (DLGPROC)AddTabProc);
ShowWindow(g_hAddTab, SW_HIDE);
//ページの配置
<サブクラスプロシージャ>
LRESULT CALLBACK NewTaskManagerWndProc(HWND hWnd, UINT msg, WPARAM wParam,
LPARAM lParam)
{
NMHDR *nm = (NMHDR*) lParam;
switch(msg)
{
case WM_NOTIFY:
switch(nm->code)
{
case TCN_SELCHANGE:
if(nm->hwndFrom == g_hWndTaskTab)
{
switch (TabCtrl_GetCurSel(g_hWndTaskTab))
{
case 1:
case 2:
case 3:
case 4:
ShowWindow(g_hAddTab, SW_HIDE);
break;
case 5://追加したタブページが選択されたとき
MessageBox(hWnd, aaa, ",
MB_OK);
ShowWindow(g_hAddTab, SW_SHOW);
ShowWindow(g_hOriginalTabPage[0],
SW_HIDE);
ShowWindow(g_hOriginalTabPage[1],
SW_HIDE);
ShowWindow(g_hOriginalTabPage[2],
SW_HIDE);
ShowWindow(g_hOriginalTabPage[3],
SW_HIDE);
ShowWindow(g_hOriginalTabPage[4],
SW_HIDE);
break;
}
}
break;
}
break;
}
return CallWindowProc(g_OriginalTaskManagerWndProc , hWnd , msg ,
wParam , lParam);
}
CreateDialogの第1引数はタスクマネージャではなくDLLリソースのある
DLLのハンドルを指定しなければいけなかったのですね。。。
ただ、ここを修正しても、追加されたタブを選択すると相変わらず強制終了
してしまいます。
なぜかお分かりになる方いらっしゃいましたらよろしくお願いします
DLLでやることに無理はないですか?
普通に標準タスクマネージャにタブページを追加できるのですか?
WindowsNTサービスアプリケーションのようなもので作らないといけないの
ではないですか。
タスクマネージャの本来のウィンドウプロシージャ
(g_OriginalTaskManagerWndProc)
は、追加タブページがあることを知りません。
処理しないメッセージだけを本来のウィンドウプロシージャに
渡すようにしないと...
ITOさん曰く、
>DLLでやることに無理はないですか?
無理がないとは言い切れないですね。
タスクマネージャをどうにかしようなんて危ういことは避けたほうが無難。
(何とかなりそうな気はするけど...)
>>DLLでやることに無理はないですか?
>無理がないとは言い切れないですね。
普通のダイアログ作成なら無理はないと思いますが、
相手が「タスクマネージャ」なので「HWND」が確立していないと
難しいのではないかと思いました。
しかも、タブページの追加となるとなおさら.....
レスありがとうございます
>タスクマネージャの本来のウィンドウプロシージャ
>(g_OriginalTaskManagerWndProc)
>は、追加タブページがあることを知りません。
>処理しないメッセージだけを本来のウィンドウプロシージャに
>渡すようにしないと...
これは重々承知しておりまして、
サブクラス化したNewTaskManagerWndProcのcase 5(追加ページが選択されたとき) で
追加したタブページの表示をしてあとはg_OriginalTaskManagerWndProcに渡したのです
がいけないのでしょうか?
追加ページ内のコントロール類の処理は追加したダイアログプロシージャでやります
し・・・
>タスクマネージャをどうにかしようなんて危ういことは避けたほうが無難。
これも承知してはいるのですが、せざるを得ない状況でして。。。
>相手が「タスクマネージャ」なので「HWND」が確立していないと
>難しいのではないかと思いました。
タスクマネージャのウィンドウハンドルは正しいものが取れていることをSpy++で
確認しているのですが、それでも難しいものなのでしょうか?
>これは重々承知しておりまして、
>サブクラス化したNewTaskManagerWndProcのcase 5(追加ページが選択されたとき) で
>追加したタブページの表示をしてあとはg_OriginalTaskManagerWndProcに渡したのです
>がいけないのでしょうか?
承知してるなら、何故渡すのですか?
追加タブページを知らない人に追加タブページが選択されたことを
知らせたら、何が起きても不思議ではないでしょう?
勘違いしていたら申し訳ありません。
追加タブページが選択されたことは自作したプロシージャNewTaskManagerWndProcに知ら
せてそこで処理を行い、それ以外は元のプロシージャg_OriginalTaskManagerWndProcに
渡しているつもりだったのですが、間違っているのでしょうか?
これでも追加タブページを知らないプロシージャに知らせていることになるのでしょう
か?
>タスクマネージャのウィンドウハンドルは正しいものが取れていることをSpy++で
>確認しているのですが、それでも難しいものなのでしょうか?
確認できているから、それをDLLで使えるとは思えないのですが.....
DLLでなくメインウインドウのHWNDが確立しているところでそのサブウインドウとして
操作することは難しいとけれども可能だと思います。
追加です、
DLLは、あくまでもライブラリーという扱いで、
ウインドウ作成等は、アプリケーションで行うのなら話は、別ですが.........
>case 5://追加したタブページが選択されたとき
のときも break で抜けて CallWindowProc をコールしてるから、
g_OriginalTaskManagerWndProc に渡してることになります。
まぁ、ここだけ直せばすべてうまくいくなんて保証なんてどこにも
ありませんけどね...
あぁ、あとCreateDialog()の第一引数はg_hDllでないと
いけないんじゃなくて?
>これでも追加タブページを知らないプロシージャに知らせていることになるのでしょう
>か?
「元のプロシージャ」は、そのメッセージを受取れる状態になっていますか?
メッセージを送っても相手が待ち受けてる状態にならなければ、うまくいきません。
「タスクマネージャ」は、ウインドウズのシステム管理で動いている
アプリケーションです。
待ち受けてる状態にはなっているとは思えないのですが......
>あぁ、あとCreateDialog()の第一引数はg_hDllでないと
>いけないんじゃなくて?
あ、これはもう [だくだく 2006/07/18(火) 09:16:50] で修正済みなのね。