1

Skype ウィンドウからの情報を必要とするアプリケーションを作成しています。メイン ウィンドウと子ウィンドウが見つかりました。WM_GETTEXT を使用し、メッセージ ボックスにバッファを表示します。何度か連絡先を変えても動かないようです。数秒後にこれが壊れる理由を誰か推測できますか?

case 2000:
  //Make options window here
  int len;
  char* buffer;
  HWND hWnd; //Main Window
  HWND chat; //Tconversation form, Caption is the contact's name.
  hWnd = FindWindow(L"tSkMainForm", NULL); //tSkMainForm is SKYPE
  chat = FindWindowEx(hWnd, NULL, L"TConversationForm", NULL); //GetWindow(hWnd,GW_CHILD);
  if (IsWindowVisible(chat)) {
    len = SendMessage(chat, WM_GETTEXTLENGTH, 0, 0);
    buffer = new char[len];
    SendMessageW(chat, WM_GETTEXT, (WPARAM) len + 1, (LPARAM) buffer);
    MessageBox(HWND_DESKTOP, (LPCWSTR) buffer, L"Testing", MB_OK);
  } else MessageBox(HWND_DESKTOP, L"We cannot find the window.", L"About Testing", MB_OK);
break;

イベントのタイムラインを提供するために、ここで何が起こるかを示します。

DLL を Skype に挿入すると、メニューが作成され、すべてが機能します。新しく作成したボタン (ID 2000) を押すと、連絡先の名前を取得したいと考えています。Spy++ は、「TConversationForm」のキャプションが連絡先の名前であることを教えてくれます。これは最初の数回の連絡先では機能しますが、その後 Skype がクラッシュします。

私は Skype API を使用できることを知っていますが、実用的なツールを作成するというよりも、学習目的としてこれを使用しています。

4

1 に答える 1

3

バッファの長さについて嘘をついているようです。len 文字を割り当てますが、バッファーのサイズは len+1 であるとします。len+1 文字を割り当てる必要があります。

Windows 上の Skype は、VCL コントロールで構築された Delphi アプリケーションです。VCL は、フォームの有効期間中にウィンドウが再作成される場合がある設計を使用しています。つまり、ウィンドウ ハンドルが変更される可能性があり、古いハンドルが残る可能性があります。これは、もう 1 つのもっともらしい失敗モードです。

もう 1 つの考えられる障害モードは、アプリケーションが認識しない方法で非 GUI スレッドから GUI をいじっているという事実です。VCL の背後にメニューを追加すると、失敗する可能性が高くなります。

ウィンドウの所有者として HWND_DESKTOP を使用しないでください。そのテキスト バッファーがリークしているようです。

あなたがこの道で成功する確率は低いと思います。とても低い。サポートされている自動化インターフェースを使用することをお勧めします。

于 2013-04-15T00:24:01.337 に答える