- - PR -
タスクバーのタスクボタンの情報を取得したい
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-10-07 15:47
<つづき>フォームでの処理
[ メッセージ編集済み 編集者: uni 編集日時 2005-10-07 15:51 ] [ メッセージ編集済み 編集者: uni 編集日時 2005-10-07 15:52 ] | ||||||||
|
投稿日時: 2005-10-07 16:01
すいません、文字列取得の部分を、
に変更しました。 しかし strGetText="" になってしまいます。。。 見ている場所(アドレス)がおかしいのでしょうか? そもそもそれ以前の問題でしょうか・・・ | ||||||||
|
投稿日時: 2005-10-07 17:34
ん〜と、いくつか。
何故Marshal.PtrToStringAnsiが失敗するか。SendMessageによって書き込まれる文字列先のアドレスは、VirtualAllocExで確保された、別プロセスのメモリ上の位置を指します。Marshal.PtrToStringAnsiは自分のプロセスのメモリ上の位置を捜しますから、当然そこに期待したバイト列は存在しません。必ずReadProcessMemoryで自分のプロセスのメモリ上にコピーする必要があります。uniさんのコードでは、構造体部分しかReadProcessMemoryされておらず、肝心の文字列が入った部分をReadProcessMemoryしていません。 上記コードのように文字列部分だけReadProcessMemoryするのが楽でしょうが、勿論他のフラグなども必要で構造体もまとめて取得したい場合もあるでしょう。 その際は、ReadProcessMemoryで構造体と文字列両方のサイズ合計分を読み取り、Marshal.PtrToStructureとMarshal.PtrToStringAnsi(こちらはポインタを構造体サイズ分進める必要がありますね)を行えばいいわけです。 [ メッセージ編集済み 編集者: Hongliang 編集日時 2005-10-07 17:37 ] | ||||||||
|
投稿日時: 2005-10-07 18:34
Hongliangさん、お返事ありがとうございます。
そうなのですか・・・。 実はVirutualAllocも使ったのが初めてで、まだ良く理解できていません・・・。 AllocCoTaskMemについては、勉強します。 (そもそもメモリ確保について勉強しなくてはなりませんが) 提示していただいたコードに書き換えて試したのですが、なぜか取得できません・・・。 また、おっしゃられたように、文字列部分だけを読もうと思って、
のようにしてみたのですがだめでした。 もう一度最初からよくよく見直して、また試してみます。 (AllocTaskMemを使うようにするとともに) せっかくいろいろと提示していただいたので、出来るまでとことんやりたいのですが、 残念ながら自宅に開発環境が無いため(ネットは見れるのですが)、この三連休はやることができません。 火曜日まで脳内でプロミングしながら考えてみようと思います。 またよろしくお願いいたします。 | ||||||||
|
投稿日時: 2005-10-07 23:39
えーと、つい勢いで書いてしまったので載せてしまいます。
他プロセスへのTCM_GETITEM、解説とサンプル | ||||||||
|
投稿日時: 2005-10-11 11:35
お世話になっております。uniです。
Hongliangさん、”解説とサンプル”、拝見させていただきました。ありがとうございます。 しかし、相変わらずテキストが取得できません・・・。 Byte配列でReadProcessMemoryを受け取る方法も試してみたのですが、中身は全部空でした。 私の環境では取得できないんじゃ、と思いたくなるのですが、そんなはず無いですよね。 どこか間違ってるのだと思うのですが、どこが違うか分かりません・・・。 (プロセスIDはSpyで確認した限り、合っています。) 毎度長々と申し訳ないのですが、よろしくお願いします。
| ||||||||
|
投稿日時: 2005-10-11 13:20
取りあえず、この部分のコードには間違いはなさそうです。
同じウィンドウハンドルでTCM_GETITEMCOUNTは成功するんですよね? まず、どの関数が失敗しているのか返値で確認してください。 そして、GetLastError関数またはMarshal.GetLastWin32Errorメソッド(これを使用する場合、DllImport属性を使ったときは属性のSetLastErrorフィールドをTrueに設定する必要があります。VB.NETのDeclare構文なら自動的にTrueになります)を使用してエラーを特定してください。 また、FormにTabControl(とTabPage)を一つ載せただけのアプリケーションを作ってみて、そちらでも試してみてください。 .NETのTabControlは所詮コモンコントロールに薄いラップをしただけのものですので問題なくTCM_系のメッセージを使用できます。クラス名が特殊ですからFindWindowExするのにSpy++必須ですが。 //しかし私は理論は分かるけどタブバーで実験はできないので(NT4/2000もってないから)的確な助言はできないんですよねー。 | ||||||||
|
投稿日時: 2005-10-11 18:39
Hongliangさん、ありがとうございます。
TCM_GETITEMCOUNTやTCM_GETCURSELは成功しています。 関数は、VirtualFreeExが失敗していました(正しい第3引数は0でした。すみません)。 しかしそれ以外の関数は失敗していないもようです(戻値はTrueになっています)。 また、タブコントロールにタブページを付けただけの別アプリケーションでは、 正しくテキストが取得できました(複数ページでも成功)。 同じことをしているのになぜ取得できないのでしょう。。。 |