Win32 Console Applicationではグローバルフックが出来ない
って話を聞いたのですが、実際のところどうなんんでしょうか?
ご存知の方よろしくお願いします。

A 回答 (1件)

回答がないようなので・・・



やってやれないことはないと思いますが、基本的に
ウィンドウメッセージをフックすることなので、
DOSアプリケーションではそれなりの処理を考慮する
必要があると思いますよ。

ではでは☆
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QWin32 Console Applicationで作った実行ファイルのアイコン変更

前に同じような質問をしましたがMFC AppWizardの変更の仕方ではなくWin32 Console Applicationで作成した実行ファイルのアイコンを変更したいのですがどうしたらいいでしょうか?
プロジェクトごとに違うということを知らなかったので、記述することができませんでした。
どうか教えてください。

Aベストアンサー

1.リソーススクリプト(.rc)をプロジェクトに新規追加
2.リソースにアイコンを追加。

IDは何でもかまいませんが、アイコンを複数作成した場合は一番小さいIDのものがexeのアイコンになります。

#ウィンドウの左上や、タスクバーに表示されるアイコンとは別物です。

QConsole Applicationをタスクトレイに常駐できますか?

タイトル通りの質問です。
あんまりそういうソフト見たこと無いので、もしかしたら
出来ないんじゃないかと思ったりもしています。
Console Applicationをタスクトレイに常駐できるのでしょうか?
以上よろしくお願いします。

Aベストアンサー

>ところで裏で常駐するコンソールアプリは、出来ればスタートアップで
>起動させたいのですが、起動後、タスクバーに表示させないように出来るでしょうか?

参考URLにはWindowsNT系では という限定付きで出来るような事が書いてあります。
この場合は、コンソールアプリケーションを制御するアプリケーション経由で
CreateProcess()を使って起動する必要がありますね。

参考URL:http://www.microsoft.com/japan/developer/winds/faq/faq.htm

QSetWindowsHookEx(グローバルフック)の質問

SetWindowsHookExでグローバルフックして
メッセージをすりかえる事って可能でしょうか?
例えばWM_KEYDOWNが送られてきたら、それを無視して
WM_CLOSEとかえるといった具合に。

試しにWH_CALLWNDPROCで受け取ったメッセージを
書き換えるだけでは無理でした(WindowsXp SP2)

MSDNのWH_CALLWNDPROCRETの関数CallWndRetProcの説明で
「このフックプロシージャは、メッセージを調べることはできますが、変更することはできません。」
となっていました。
ということはWH_CALLWNDPROCのCallWndProcでは変更できるのかな?と思った次第です。

何か情報があれば宜しくお願いします。
(2000では不可だけど98だとできるとか?)

Aベストアンサー

>WH_GETMESSAGEがP「ポストしたメッセージ」
>WH_CALLWNDPROCがS「送出するメッセージ」
>WH_CALLWNDPROCRETがR「送出したメッセージの戻り値」

というか、対象のウィンドウプロシージャにおいて、
P:PostMessageで受け取ったメッセージ
S:SendMessageで受け取ったメッセージ
R:SendMessageの受け取ったときのプロシージャの戻り値

と考えたほうがわかりやすいかと。

#RがSendMessageのみなのは、呼び出し元がPostMessageのときは終了を待たないため。



>>Sendで送られるメッセージもすり替えはたい場合はウィンドウのサブクラス化でしょう。
>>ただし、DLLを対象のプロセスに突っ込む荒業が必要ですが。
>サブクラス化はdllも同じプロセスに属す必要があるんですね。
>この方法についてどこか参考になるサイト、あるいは書籍ってありますか?

ここらへんかな?

http://www.microsoft.com/japan/info/press/JPN_ViewMsPress.asp?Book_id=39&list_id=2

http://ruffnex.oc.to/kenji/text/api_hook/

>WH_GETMESSAGEがP「ポストしたメッセージ」
>WH_CALLWNDPROCがS「送出するメッセージ」
>WH_CALLWNDPROCRETがR「送出したメッセージの戻り値」

というか、対象のウィンドウプロシージャにおいて、
P:PostMessageで受け取ったメッセージ
S:SendMessageで受け取ったメッセージ
R:SendMessageの受け取ったときのプロシージャの戻り値

と考えたほうがわかりやすいかと。

#RがSendMessageのみなのは、呼び出し元がPostMessageのときは終了を待たないため。



>>Sendで送られるメッセージもすり...続きを読む

Qグローバルフック(SetWindowsHookEx)でのEM_REPLACESELの取得について

はじめまして。

グローバルフック(SetWindowsHookEx)を使って別アプリ(exe)がEDITボックスに出力している
文字列を取得しようとしています。
SPY++で確認すると別アプリではEM_REPLACESELを用いていることがわかりました。

フックするDLLを以下のように作成しメッセージをフックすることはできました。

1. フックのセット
  SetWindowsHookEx(WH_CALLWNDPROC, MyHookProc, hInst, dwThreadId);
     // hInst はDllMainでアタッチ時に保存したもの
     // dwThreadIdは別アプリのスレッドID(以下の方法で取得)
     // HWND pWnd = ::FindWindow(NULL, 別アプリのフォームのキャプション) ;
     // HWND pEdt = ::FindWindowEx(pWnd,0,"Edit",0);
     // DWORD dwThreadId= ::GetWindowThreadProcessId(pEdt, NULL);

2. コールバック
  LRESULT CALLBACK MyHookProc(int nCode, WPARAM wp, LPARAM lp)
  {
   if( EM_REPLACESELの判定 ){
     メッセージの保存処理
    }
    return CallNextHookEx(hMyHook, nCode, wp, lp);
  }

上記のコールバックの中で”EM_REPLACESELの判定”をどのようにしたら良いかわからずに困っています。
if分をはずしてファイルにダンプすると何かメッセージが取得できているのは確認できています。
他のサイトを見て、
MSG* pMSG = (MSG*)lp;
として、pMSG->lParam を参照してもEM_REPLACESELになっているメッセージがありませんでした。

何か思いつくことがある方、根本的な間違いがあるという方、
アドバイアスをお願いします。

はじめまして。

グローバルフック(SetWindowsHookEx)を使って別アプリ(exe)がEDITボックスに出力している
文字列を取得しようとしています。
SPY++で確認すると別アプリではEM_REPLACESELを用いていることがわかりました。

フックするDLLを以下のように作成しメッセージをフックすることはできました。

1. フックのセット
  SetWindowsHookEx(WH_CALLWNDPROC, MyHookProc, hInst, dwThreadId);
     // hInst はDllMainでアタッチ時に保存したもの
     // dwThreadIdは別アプリのス...続きを読む

Aベストアンサー

EM_REPLASESELかどうかの判断は pMSG->message だと思いますよ
pMSG->lParamは置換後の文字列のように思います

コールバックのlParamキャストはCWPSTRUCT* または PCWPSTRUCTで行わないといけない気がします
MSG構造体とでは メンバーの並び方も違いますから …

QWin16からWin32へのデータコンバート

Win16時代に_lwriteで書き出したファイルをWin32のWriteFileで書き出したデータと同じになるようにコンバートしたいと思います。
残念なことに、Win16の開発環境が紛失していてデータ型のサイズなどを確認することが出来ません。
Win16のintは2バイトだったことはわかったのですが、他にも変わっているものがありそうです……
Win16,Win32での各データ型のサイズを教えてください。or一覧になっているようなサイトがあれば紹介してください。

使っている型は
int, char, long, float, double, time_t
と、これらを組み合わせた構造体です。

お願いします。

Aベストアンサー

こんにちは。自信はありませせんが
Win16と32の型サイズの違いは
int型だけかもしれません。

構造体メンバにint型が存在する場合は
アラインメントにも注意する必要がありそうです。

あと、ポインタのサイズも16ビットかも。
私もWin16の環境が無いのでよくわかりません^^;


人気Q&Aランキング

おすすめ情報