web-dev-qa-db-ja.com

C ++で隠しウィンドウを作成する方法

隠しウィンドウを作成する方法は?

このウィンドウの目的は、いくつかのメッセージを受信することです。

38
anand

ウィンドウを作成するときは、WS_VISIBLEフラグを省略し、ShowWindowを呼び出さないでください。

25
Nathan Osman

Win32/mfc環境では、次のようにクラスを作成してCWndから継承する必要があります。

class HiddenMsgWindow : public CWnd
{
...
}

そのクラスのコンストラクターでは、次のようにウィンドウをインスタンス化します。

HiddenMsgWindow::HiddenMsgWindow()
{
   CString wcn = ::AfxRegisterWndClass(NULL);
   BOOL created = this->CreateEx(0, wcn, _T("YourExcellentWindowClass"), 0, 0, 0, 0, 0, HWND_MESSAGE, 0);
}

これにより、メッセージポンプを備えた隠しウィンドウがロックされ、回転する準備がほぼ整います。

ストーリーの残りの部分は、ウィンドウメッセージとそれらのメッセージのハンドラー間のリンクを提供することです。

これは、次のように、いくつかのマクロとメッセージハンドラーを実装ファイル(.cpp)に追加することで行われます。

BEGIN_MESSAGE_MAP(HiddenMsgWindow, CWnd)
   ON_MESSAGE(WM_USER + 1, DoNOOP)
END_MESSAGE_MAP()

LRESULT HiddenMsgWindow::DoNOOP(WPARAM wParam, LPARAM lParam)
{
   AfxMessageBox(_T("Get Reaaady for a Ruuummmmmmmbllllle!"));
   return LRESULT(true);
}

次に、次のようにヘッダーファイルに残りの接着剤を入力する必要があります。

class HiddenMsgWindow : public CWnd
{
public:
   HiddenMsgWindow();
protected:
   afx_msg LRESULT DoNOOP(WPARAM wParam, LPARAM lParam);

   DECLARE_MESSAGE_MAP()

}

まるで魔法のように、メッセージを送り出す準備ができている隠しウィンドウがあります。

このメッセージウィンドウを使用するには、クラスをインスタンス化してハンドルを取得し、必要に応じてメッセージを送信または送信します。ちょうどこのような:

HiddenMsgWindow *hmw = new HiddenMsgWindow();
SendMessage(hmw->m_hWnd, WM_USER + 1, 0, 0);
14
Slaftos
10
ta.speot.is

通常どおりCreateWindow()またはCreateWindowEx()を呼び出しますが、_WS_VISIBLE_ウィンドウスタイルは指定しません。もちろん、ShowWindow()も呼び出すべきではありません。

3
Georg Fritzsche

ウィンドウを表示する必要がない場合は、ウィンドウの作成を提案する人もいますが、WS_VISIBLEフラグを省略し、ShowWindowを呼び出さないでください。

showWindow()を呼び出すときにそうでない場合は、SW_HIDEパラメータを追加します。

ShowWindow(hWnd, SW_HIDE);
2
Deadlock

ああ、ちょうど問題が発生しました。 HWND_MESSAGEの指定に失敗すると、予期しない動作が発生する可能性があります。正しくないNULLを使用しました。私の場合、MS Excelがxlsファイルをロードするのに10秒以上かかっていましたが、アプリが実行されていないときは通常1秒未満で完了しました。

MSDNは前に誰かが述べたようにこれを言います。

0
user1228651