none
メッセージをポストするには RRS feed

  • 質問

  • 何時もお世話になっております。

    開発環境:WindowsXP   Visual Studio vc++ 2005 / CLI

     

    ファンクションキー(F1)が押されたときに、KyeDownで処理を実行しているのですが、

    コマンドボタンを押した場合も同様の処理を行いたいので、メッセージをポストしたいのですが。

    以下のコードではコンパイルエラーとなります。

        BOOL bRet;
        bRet = PostMessage(this->Handle,  WM_KEYDOWN,  VK_F1,   0);

    どうも、this->Handleがダメダと起こられます。

    どうかお知恵をお願い致します。


     

    2007年11月8日 5:50

すべての返信

  • なぜ以前にアドバイスしたことをやらないのでしょうか?

     

     

    http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=2360705&SiteID=7

     

    チャイルドウィンドウで

     

    this->Parent->Handle

     

    HWNDにキャストすればMDIウィンドウのハンドルはとれます。

     

    自分自身なら

     

    this->Handle

     

    をHWNDにキャスト。

    2007年11月8日 6:39
  • ご指摘有難う御座います。

    hwnd = (HWND)this->Handle;

    はやってみました。

    でも、コンパイルエラーとなり、うまくいきません。

    hwnd = (HWND)this->Parent->Handle;

    もやってみました。

    でも、コンパイルエラーとなり、うまくいきません。

     

    私の開発環境がいけないのでしょうか?

    宜しくお願い致します。

     

    2007年11月8日 8:08
  • ToPointerメソッドを呼ばないとvoid*に変換できなかったです。

    (operator void*があったのでそのまま代入できるかと思ったわけで)

     

    よって

     

    HWND hWnd = static_cast<HWND>(this->Handle.ToPointer());

    2007年11月8日 9:05
  • 有難う御座います。

    早速試してみます。

     

    立て続けで申し訳ありませんが、また、質問です。

    以下のエラーは何故出るのでしょうか?

     

    ソースコード:

     

    BYTE gDebBuf[256];

    #define CAPTION "WPUC Debug Monitor"


    MessageBox(NULL, (LPCTSTR)cDebStr, (LPCTSTR)CAPTION, MB_OK);

     

     

    エラーメッセージ:

    rcDebug.obj : error LNK2028: 未解決のトークン (0A00004B) "extern "C" int __stdcall MessageBoxW(struct HWND__ *,wchar_t const *,wchar_t const *,unsigned int)" (?MessageBoxW@@$$J216YGHPAUHWND__@@PB_W1I@Z) が関数 "extern "C" int __clrcall MessageBox(struct HWND__ *,wchar_t const *,wchar_t const *,unsigned int)" (?MessageBox@@$$J0YMHPAUHWND__@@PB_W1I@Z) で参照されました。
    SrcDebug.obj : error LNK2019: 未解決の外部シンボル "extern "C" int __stdcall MessageBoxW(struct HWND__ *,wchar_t const *,wchar_t const *,unsigned int)" (?MessageBoxW@@$$J216YGHPAUHWND__@@PB_W1I@Z) が関数 "extern "C" int __clrcall MessageBox(struct HWND__ *,wchar_t const *,wchar_t const *,unsigned int)" (?MessageBox@@$$J0YMHPAUHWND__@@PB_W1I@Z) で参照されました。
    C:\yo1\WPUC_SLC\Debug\WPUC.exe : fatal error LNK1120: 外部参照 2 が未解決です。

     

    普通にただメッセージボックスを出すだけなのですが。。。。

    宜しくご指導をお願い致します。

     

    2007年11月8日 9:26
  • 前に回答して、なるほどっていったんじゃ?

    http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=2362372&SiteID=7

     

    Buf1,Buf2→char*型

     

    MessageBox関数の第2,3引数→LPCTSTR型

     

     

    LPCTSTR型→Unicode文字セットを使用する→const wchar_t*型

                         マルチバイト文字セットを使用する→const char*型

     

     

    ということで、CLRの場合Unicode文字セットを使用するなので、まったく意味不明なキャストをしていることになります。

    ※何でキャストして使えないかはhttp://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200706/07060008.txtの2007/06/04(月) 22:57:17 あたりの発言を参考にしてください。

     

    で、これのケースはエラーにならないはずですが、設定が抜けているとかそういうことはないのでしょうか?

    →リンクエラーなら確実にそう。

    参考:http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200601/06010032.txt

     

    ただ、CLRで MessageBox Windows APIを使う必要性は全くないでしょう。

    System::Windows::Forms::MessageBox:: Showメソッドで十分。


     

    BYTE gDebBuf[256];

    #define CAPTION "WPUC Debug Monitor"


    MessageBox(NULL, (LPCTSTR)cDebStr, (LPCTSTR)CAPTION, MB_OK);

    この無理やりキャストはありえない。(説明済み)

    2007年11月8日 9:59
  • ご指摘ごもっともです。

    いけるかと思ったのですが。

    System::Windows::Forms::MessageBox:: Showメソッドでも、エラーになってしまうのです。。

    ネットに繋がっているPCが社内に1台で、遠くにあるものですから、なかなか、現場と連携が難しく><(言い訳ですね)

    すみません。

    ちなみに、

     

    HWND hWnd = static_cast<HWND>(this->Handle.ToPointer());

    を実装したところ、ToPointerが見つからないとコンパイラが言っています。

    検索で、ToPointerが含まれるファイルを検索して、全部インクルードしてみたのですが、

    やはりエラーになります。

    ソリューションのプロパティが悪いのでしょうか?

    宜しくお願い致します。

    2007年11月8日 10:10
  • 補足です。

     

    コード:

    static char cDebStr[1024];
    #define CAPTION "WPUC Debug Monitor"

    System::Windows::Forms::MessageBox:Tongue Tiedhow(cDebStr,CAPTION,MB_OK + MB_ICONWARNING);

     

    エラーメッセージ;
    .\SrcDebug.cpp(38) : error C2665: 'System::Windows::Forms::MessageBox:Tongue Tiedhow' : 21 オーバーロードのどれも、すべての引数の型を変換できませんでした
            c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll: 'System::Windows::Forms:Big SmileialogResult System::Windows::Forms::MessageBox:Tongue Tiedhow(System:Tongue Tiedtring ^,System:Tongue Tiedtring ^,System::Windows::Forms::MessageBoxButtons)' の可能性があります。
            c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll: または 'System::Windows::Forms:Big SmileialogResult System::Windows::Forms::MessageBox:Tongue Tiedhow(System::Windows::Forms::IWin32Window ^,System:Tongue Tiedtring ^,System:Tongue Tiedtring ^)'
            引数リスト '(char [1024], const char [19], long)' を一致させようとしているとき
    ビルドログは "file://c:\yo1\WPUC_SLC\WPUC\Debug\BuildLog.htm" に保存されました。

     

     

    コード:

    static char cDebStr[1024];
    #define CAPTION "WPUC Debug Monitor"

     

        System:Tongue Tiedtring^ msg1 = gcnew String(cDebStr);
        System:Tongue Tiedtring^ msg2 = gcnew String(CAPTION);

        System::Windows::Forms::MessageBox:Tongue Tiedhow(msg1,msg2,MB_OK + MB_ICONWARNING);

     

    エラーメッセージ;
    .\SrcDebug.cpp(41) : error C2665: 'System::Windows::Forms::MessageBox:Tongue Tiedhow' : 21 オーバーロードのどれも、すべての引数の型を変換できませんでした
            c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll: 'System::Windows::Forms:Big SmileialogResult System::Windows::Forms::MessageBox:Tongue Tiedhow(System:Tongue Tiedtring ^,System:Tongue Tiedtring ^,System::Windows::Forms::MessageBoxButtons)' の可能性があります。
            c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll: または 'System::Windows::Forms:Big SmileialogResult System::Windows::Forms::MessageBox:Tongue Tiedhow(System::Windows::Forms::IWin32Window ^,System:Tongue Tiedtring ^,System:Tongue Tiedtring ^)'
            引数リスト '(System:Tongue Tiedtring ^, System:Tongue Tiedtring ^, long)' を一致させようとしているとき
    ビルドログは "file://c:\yo1\WPUC_SLC\WPUC\Debug\BuildLog.htm" に保存されました。

     

     

    なのです。

    どうか、お知恵をお願い致します。

    2007年11月8日 10:45
  • お怒りごもっともです。申し訳ありません。

    ヘルプは呼んでいます。

    ヘルプのサンプルをコピーしてやってみてもコンパイルが通らないので、スレを立てました。

    私のスキルでは、MFCの方が良いのでしょうか?

    MFCでも同じでしょうか?

    悩みます。

    MFCでも、チャレンジしてみました。

    どうにか、MDI親子関係がうまく作れました。

    ただ、親フォームのリソースがないので、コードで、親フォームにコントロールを作り込まないと

    いけないようで、そこがわかりません。

    また、子フォームのリソースエディタでコントロールを追加しようと(DataGridView)したのですが

    なぜか、選択不可の状態です。.NETでないと使えないのでしょうか?

    どちらで作るか悩みどころです。

     

    何時も、アドバイス頂、非常に感謝申し上げます。

     

    2007年11月9日 0:51
  • コンパイル通りました。

    ヘルプのサンプルの

    MessageBox:Tongue Tiedhow(this,msg1,msg2....

     

    のthisがなんか怪しそうなので削除してみました。

    そしたらコンパイル通りました。

     

    みなさん、有難う御座います。

     

    2007年11月9日 1:10