タスクマネージャへのタブページ追加 – プログラミング – Home

タスクマネージャへのタブページ追加
 
通知
すべてクリア

タスクマネージャへのタブページ追加

固定ページ 1 / 2

だくだく
 だくだく
(@だくだく)
ゲスト
結合: 18年前
投稿: 5
Topic starter  

標準タスクマネージャにタブページを追加し、それに配置したコントロールを操作した
いと考えております。
作成した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);
}


引用解決済
トピックタグ
だくだく
 だくだく
(@だくだく)
ゲスト
結合: 18年前
投稿: 5
Topic starter  

CreateDialogの第1引数はタスクマネージャではなくDLLリソースのある
DLLのハンドルを指定しなければいけなかったのですね。。。
ただ、ここを修正しても、追加されたタブを選択すると相変わらず強制終了
してしまいます。
なぜかお分かりになる方いらっしゃいましたらよろしくお願いします


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

DLLでやることに無理はないですか?
普通に標準タスクマネージャにタブページを追加できるのですか?
WindowsNTサービスアプリケーションのようなもので作らないといけないの
ではないですか。


返信引用
r
 r
(@r)
ゲスト
結合: 22年前
投稿: 48
 

タスクマネージャの本来のウィンドウプロシージャ
(g_OriginalTaskManagerWndProc)
は、追加タブページがあることを知りません。
処理しないメッセージだけを本来のウィンドウプロシージャに
渡すようにしないと...


返信引用
r
 r
(@r)
ゲスト
結合: 22年前
投稿: 48
 

ITOさん曰く、
>DLLでやることに無理はないですか?
無理がないとは言い切れないですね。
タスクマネージャをどうにかしようなんて危ういことは避けたほうが無難。
(何とかなりそうな気はするけど...)


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

>>DLLでやることに無理はないですか?
>無理がないとは言い切れないですね。
普通のダイアログ作成なら無理はないと思いますが、
相手が「タスクマネージャ」なので「HWND」が確立していないと
難しいのではないかと思いました。
しかも、タブページの追加となるとなおさら.....


返信引用
だくだく
 だくだく
(@だくだく)
ゲスト
結合: 18年前
投稿: 5
Topic starter  

レスありがとうございます

>タスクマネージャの本来のウィンドウプロシージャ
>(g_OriginalTaskManagerWndProc)
>は、追加タブページがあることを知りません。
>処理しないメッセージだけを本来のウィンドウプロシージャに
>渡すようにしないと...

これは重々承知しておりまして、
サブクラス化したNewTaskManagerWndProcのcase 5(追加ページが選択されたとき) で
追加したタブページの表示をしてあとはg_OriginalTaskManagerWndProcに渡したのです
がいけないのでしょうか?
追加ページ内のコントロール類の処理は追加したダイアログプロシージャでやります
し・・・

>タスクマネージャをどうにかしようなんて危ういことは避けたほうが無難。
これも承知してはいるのですが、せざるを得ない状況でして。。。

>相手が「タスクマネージャ」なので「HWND」が確立していないと
>難しいのではないかと思いました。
タスクマネージャのウィンドウハンドルは正しいものが取れていることをSpy++で
確認しているのですが、それでも難しいものなのでしょうか?


返信引用
r
 r
(@r)
ゲスト
結合: 22年前
投稿: 48
 

>これは重々承知しておりまして、
>サブクラス化したNewTaskManagerWndProcのcase 5(追加ページが選択されたとき) で
>追加したタブページの表示をしてあとはg_OriginalTaskManagerWndProcに渡したのです
>がいけないのでしょうか?

承知してるなら、何故渡すのですか?
追加タブページを知らない人に追加タブページが選択されたことを
知らせたら、何が起きても不思議ではないでしょう?


返信引用
だくだく
 だくだく
(@だくだく)
ゲスト
結合: 18年前
投稿: 5
Topic starter  

勘違いしていたら申し訳ありません。
追加タブページが選択されたことは自作したプロシージャNewTaskManagerWndProcに知ら
せてそこで処理を行い、それ以外は元のプロシージャg_OriginalTaskManagerWndProcに
渡しているつもりだったのですが、間違っているのでしょうか?
これでも追加タブページを知らないプロシージャに知らせていることになるのでしょう
か?


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

>タスクマネージャのウィンドウハンドルは正しいものが取れていることをSpy++で
>確認しているのですが、それでも難しいものなのでしょうか?
確認できているから、それをDLLで使えるとは思えないのですが.....
DLLでなくメインウインドウのHWNDが確立しているところでそのサブウインドウとして
操作することは難しいとけれども可能だと思います。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

追加です、
DLLは、あくまでもライブラリーという扱いで、
ウインドウ作成等は、アプリケーションで行うのなら話は、別ですが.........


返信引用
r
 r
(@r)
ゲスト
結合: 22年前
投稿: 48
 

>case 5://追加したタブページが選択されたとき
のときも break で抜けて CallWindowProc をコールしてるから、
g_OriginalTaskManagerWndProc に渡してることになります。
まぁ、ここだけ直せばすべてうまくいくなんて保証なんてどこにも
ありませんけどね...


返信引用
r
 r
(@r)
ゲスト
結合: 22年前
投稿: 48
 

あぁ、あとCreateDialog()の第一引数はg_hDllでないと
いけないんじゃなくて?


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

>これでも追加タブページを知らないプロシージャに知らせていることになるのでしょう
>か?
「元のプロシージャ」は、そのメッセージを受取れる状態になっていますか?
メッセージを送っても相手が待ち受けてる状態にならなければ、うまくいきません。

「タスクマネージャ」は、ウインドウズのシステム管理で動いている
アプリケーションです。
待ち受けてる状態にはなっているとは思えないのですが......


返信引用
r
 r
(@r)
ゲスト
結合: 22年前
投稿: 48
 

>あぁ、あとCreateDialog()の第一引数はg_hDllでないと
>いけないんじゃなくて?

あ、これはもう [だくだく 2006/07/18(火) 09:16:50] で修正済みなのね。


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました