掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
他アプリのツリーのノードタイトルを得るには? (ID:73172)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
他のアプリケーションのツリーのノードのタイトルを取得したいのですが、SendMessageでエラーになります。同様の処理をするVB6で記述したコードではうまくいきます。WindowsAPIを多用たいのでできればC++で開発したいと考えております。 仮想メモリでやり取りを行っているのですが、アドレスの指定の仕方等がおかしいでしょうか。ご意見をお聞かせいただけますと幸いです。 //treewindowおよびpidはspy++で指定ウィンドウのハンドルとプロセスIDを見てプログラム内で直接指定しています。 //選択されたツリーNodeを取得 HTREEITEM SelNode; SelNode = (HTREEITEM)SendMessage(treewindow, TVM_GETNEXTITEM, TVGN_CARET, 0); //プロセスを開く HANDLE hProcess; hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ |PROCESS_VM_WRITE,false, (DWORD)pid); if(hProcess == (HANDLE)NULL){ return 0; } //バッファの下準備 TCHAR szBuffer[MAXTEXTLEN]; //TVITEM構造体の宣言 TVITEM item; long dwSize = sizeof(item) + MAXTEXTLEN; //相手プロセスにメモリを確保 LPVOID pSysShared; pSysShared = VirtualAllocEx(hProcess,NULL,dwSize,MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE); //自プロセスに結果をコピーするバッファを作成 LPVOID pLocalShared; pLocalShared = VirtualAlloc(0, dwSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); //TVITEM構造体の初期化 item.hItem = SelNode; item.mask = TVIF_TEXT; item.pszText =((LPTSTR)&pLocalShared)+sizeof(item); item.cchTextMax = MAXTEXTLEN; //自プロセス内の仮想メモリにitemを移動 MoveMemory(pLocalShared,&item,sizeof(item)); //仮想メモリにitemを書き込む DWORD dwNumberOfBytesWrite; WriteProcessMemory(hProcess,pSysShared,&pLocalShared,dwSize,&dwNumberOfBytesWrite); //メッセージを送信(返り値は失敗の0となってしまいます) long ret; ret = SendMessage(treewindow, TVM_GETITEM, 0, (LPARAM)pSysShared); //仮想メモリからitemの内容を読み込む DWORD dwNumberOfBytesRead; ReadProcessMemory(hProcess,&pSysShared,&pLocalShared,MAXTEXTLEN,&dwNumberOfBytesRead); //自プロセス内の仮想メモリでitem分移動して、それ以降のテキスト分(取得したノードのタイトル名)をszBufferに代入する MoveMemory(szBuffer,(&pLocalShared + sizeof(item)),MAXTEXTLEN); VirtualFree(pLocalShared,0,MEM_RELEASE); // ローカルバッファを解放する VirtualFreeEx(hProcess,pSysShared,0,MEM_RELEASE); // 「共有メモリ」を解放する CloseHandle(hProcess); // プロセスハンドルを閉じる
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.