スカイプのテキストボックスに文字列を表示させたいです。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
おならちゃん。

スカイプのテキストボックスに文字列を表示させたいです。

#1

投稿記事 by おならちゃん。 » 12年前

スカイプのテキストボックスに文字列を表示させたいのですが、やり方がいまいちわかりません。
わけもわからず調べていると、結局こうなったのですが、エラーが無いですが、実効もないです。
#include <Windows.h>

int main()
{
HWND hWnd=0;
HWND hEdit = ::GetDlgItem(hWnd, 0x00010B88);
SendMessage(hEdit,WM_SETTEXT,0,(LPARAM)TEXT("ほげほげ"));
}
ハンドルはAutoItX3のinfoで調べました。
まったく訳がわかっていない状態です。
これから僕が調べた方がいいことなどのご指導をいただけたら嬉しいです。
よろしくお願いします。

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: スカイプのテキストボックスに文字列を表示させたいです。

#2

投稿記事 by bitter_fox » 12年前

おならちゃん。 さんが書きました:スカイプのテキストボックスに文字列を表示させたいのですが、やり方がいまいちわかりません。
わけもわからず調べていると、結局こうなったのですが、エラーが無いですが、実効もないです。

コード:

#include <Windows.h>

int main()
{
	HWND hWnd=0;
	HWND hEdit = ::GetDlgItem(hWnd, 0x00010B88);
	SendMessage(hEdit,WM_SETTEXT,0,(LPARAM)TEXT("ほげほげ"));
}
ハンドルはAutoItX3のinfoで調べました。
まったく訳がわかっていない状態です。
これから僕が調べた方がいいことなどのご指導をいただけたら嬉しいです。
よろしくお願いします。
今の状態だと0という値で登録されたウィンドウから0x00010B88という識別子を持つアイテムを検索しています。
スカイプのウィンドウは果たして0で登録されているでしょうか?
一般的に考えたらそうではないでしょう。

FindWindow関数を使ってスカイプのウィンドウがどういう値で登録されているのかを調べてそれをもとにGetDldItem関数を使ってみてください。
http://msdn.microsoft.com/ja-jp/library/cc364634.aspx

それからソースコードを載せる際はcodeタグを使用してください。
詳しくはフォーラムルールをお読みください。

[hr][追記]
こちらも参考にしてください。
http://eternalwindows.jp/winbase/window/window15.html

naohiro19
記事: 256
登録日時: 13年前
住所: 愛知県

Re: スカイプのテキストボックスに文字列を表示させたいです。

#3

投稿記事 by naohiro19 » 12年前

有料ですが Spy++ を使えば Skypeのダイアログの持っているウィンドウIDを調べることができます。

おならちゃん。

Re: スカイプのテキストボックスに文字列を表示させたいです。

#4

投稿記事 by おならちゃん。 » 12年前

bitter foxさん 早速のお返事ありがとう御座いました。
まず、フォーラムルールのことについて教えていただきありがとう御座います!
それと、

コード:

で囲むのですね!すみませんでした。
有力なURLをありがとう御座います。
  1. 自分は今何がしたくて
スカイプへ文字列を送るプログラムを作りたいです。

  2. どう取り組んで(作ったプログラムはどれで
サイトで調べましたが難しくて出来ませんでした。

  3. どのようなエラーやトラブルで困っていて
まだ、出来ていません。

  4. 自分は何が解らないのか、知りたいのか
ほとんど全てです。どのように送ればいいのかが全てわかっていません。
(まだ追記で張ってくださったURLはちょこっとしかみていないので、これから見て学ぼうと思っています。)
  5. 今のCの知識はどの程度なのか
C言語が書けるくらいですが、APIは無知です。


naohiro19さん 
ご回答ありがとう御座いました。初めて知りました!。しかし、スカイプ以外となったときに学んでおかないと応用が利かないとおもいましたので今回は自分で作って行きたいと思います。

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: スカイプのテキストボックスに文字列を表示させたいです。

#5

投稿記事 by beatle » 12年前

Spy++はスカイプ以外のウインドウの情報なども調べられます。
参考:http://www.atmarkit.co.jp/fdotnet/dotne ... edspy.html

おならちゃん。

Re: スカイプのテキストボックスに文字列を表示させたいです。

#6

投稿記事 by おならちゃん。 » 12年前

beatle さん ご回答ありがとうございます!便利そうですね@w@ですが、AutoItX3Infoでやらせてください。 
それとも、Spy++じゃないと出来ないのでしょうか?

<質問です。よろしくお願いします。>
プログラムを実行させるとそのwindowがあるかを探してあったらタスクバーの中のスカイプが消えてくれるサンプルプログラムを改造して、windowの中のテキストボックスがあったらスカイプが消えてくれるプログラムをまず作ろうと思いました。しかし、
このプログラムを実行させてもタスクバーの中のスカイプが消えてくれません。サンプルプログラムではskypeが消えました。
ということは、GetDlgItemが間違っているということなのでしょうが、
http://msdn.microsoft.com/ja-jp/library/cc364621.aspx
ハンドルを取得したいコントロールの識別子を指定します。の部分が間違っているきがするのですが、何を入れればいいのでしょうか?
AutoItinfoで調べるとwindow handleとcontrol handleがでてくるので、両方hwndTarget,の後ろに書きましたができませんでした。AutoItinfoではこれだけの情報が出てくるのですが、足りていないのでしょうか?
ご回答宜しくお願い致します。
<AutoItX3infoででてくる情報>
>>>> Window <<<<
Title: Skype™ - ********
Class: tSkMainForm.UnicodeClass
Position: 480, 0
Size: 800, 570
Style: 0x160F0000
ExStyle: 0x00050100
Handle: 0x0001076E

>>>> Control <<<<
Class: TChatRichEdit.UnicodeClass
Instance: 7
ClassnameNN: TChatRichEdit.UnicodeClass7
Name:
Advanced (Class): [CLASS:TChatRichEdit.UnicodeClass; INSTANCE:7]
ID: 461932
Text:
Position: 282, 497
Size: 401, 32
ControlClick Coords: 22, 22
Style: 0x54010044
ExStyle: 0x00000000
Handle: 0x00070C6C

>>>> Mouse <<<<
Position: 785, 545
Cursor ID: 0
Color: 0xFFFFFF

>>>> StatusBar <<<<
>>>> ToolsBar <<<<
>>>> Visible Text <<<<
>>>> Hidden Text <<<<
<実行に失敗したプログラム>

コード:

#include <Windows.h>

int main()
{
	HWND hwndTarget;
	hwndTarget=FindWindow(TEXT("tSkMainForm.UnicodeClass"),NULL);
	HWND hEdit = ::GetDlgItem(hwndTarget, 0x0001076E);
    SendMessage(hEdit,WM_SETTEXT,0,(LPARAM)TEXT("ほげほげ"));
	
	if(hEdit!=NULL)
	{
		SendMessage(hwndTarget,WM_CLOSE,0,0);
	}

}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: スカイプのテキストボックスに文字列を表示させたいです。

#7

投稿記事 by softya(ソフト屋) » 12年前

「Vector: FinderSystem - 新着ソフトレビュー」
http://www.vector.co.jp/magazine/softne ... 04201.html

ウィンドウ名ならこれが使えるのでは?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

おならちゃん。

Re: スカイプのテキストボックスに文字列を表示させたいです。

#8

投稿記事 by おならちゃん。 » 12年前

softyaさん ご回答ありがとうございます。しかし、ダウンロードすることは出来ませんでした。
こちらを勧めてくださるということはAutoItX3infoでは情報が不十分だということでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: スカイプのテキストボックスに文字列を表示させたいです。

#9

投稿記事 by softya(ソフト屋) » 12年前

こっちが使いやすかなと思っただけです。すいません公開停止してますね。失礼しました。
ともかく他にも方法があるって事を言いたかっただけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: スカイプのテキストボックスに文字列を表示させたいです。

#10

投稿記事 by ISLe » 12年前

コントロールIDがころころ変わってますけど一定ではないのでしょうか?
一定でないのであればGetDlgItemじゃなくてFindWindowExを使う必要があるのでは。

おならちゃん。

Re: スカイプのテキストボックスに文字列を表示させたいです。

#11

投稿記事 by おならちゃん。 » 12年前

softyaさん ありがとう御座いました。いろんな見るやつがあるということですね!

ISLeさん ご回答ありがとう御座いました。
言われてみて、「おっ?」っと思い調べてみたところ換わっていました。
なので教えてくださった関数を使い書き換えてみました。が、どうしてもうまくいきません。
しかし、一つ出来るようになったことがあります。それは、notepadになら出力が可能になりました。
しかし不思議なことがありました。それは最初に.txtの中に文字があると上書きされています。ですが.txtを閉じると、
「内容が変更されています保存しますか?」が出ることも無く消えていて、もう一度.txtを開いてみると、プログラムで出力した文字が消えていて、もともとあった文字列が表示されます。
文字はその場所に送られているが、書かれているわけがないということでしょうか?
しかし、上書き保存を押してみると保存されていました。
<skypeに文字列を出力できない>

コード:

#include <Windows.h>

int main()
{   
	HWND hwndTarget;
    hwndTarget=FindWindow(TEXT("tSkMainForm.UnicodeClass"),NULL);

    hwndTarget = FindWindowEx(hwndTarget, 0, "TChatRichEdit.UnicodeClass", 0);

    SendMessage(hwndTarget, WM_SETTEXT, 0, (LPARAM)("処理終了です!"));
}
<notepadに文字列を出力できる>

コード:

#include <Windows.h>

int main()
{   
	HWND hwndTarget;
    hwndTarget=FindWindow(TEXT("notepad"),NULL);

    hwndTarget = FindWindowEx(hwndTarget, 0, "Edit", 0);

    SendMessage(hwndTarget, WM_SETTEXT, 0, (LPARAM)("処理終了です!"));
}
なぜスカイプには文字列を出力することが出来ないのでしょうか?そして、どのようにすれば文字列を出力することが出来るようになるのでしょうか?ご回答よろしくお願いします。

おならちゃん。

Re: スカイプのテキストボックスに文字列を表示させたいです。

#12

投稿記事 by おならちゃん。 » 12年前

softyaさん ありがとう御座いました。いろんな見るやつがあるということですね!

ISLeさん ご回答ありがとう御座いました。
言われてみて、「おっ?」っと思い調べてみたところ換わっていました。
なので教えてくださった関数を使い書き換えてみました。が、どうしてもうまくいきません。
しかし、一つ出来るようになったことがあります。それは、notepadになら出力が可能になりました。
しかし不思議なことがありました。それは最初に.txtの中に文字があると上書きされています。ですが.txtを閉じると、
「内容が変更されています保存しますか?」が出ることも無く消えていて、もう一度.txtを開いてみると、プログラムで出力した文字が消えていて、もともとあった文字列が表示されます。
文字はその場所に送られているが、書かれているわけがないということでしょうか?
しかし、上書き保存を押してみると保存されていました。
<skypeに文字列を出力できない>

コード:

#include <Windows.h>

int main()
{   
	HWND hwndTarget;
    hwndTarget=FindWindow(TEXT("tSkMainForm.UnicodeClass"),NULL);

    hwndTarget = FindWindowEx(hwndTarget, 0, "TChatRichEdit.UnicodeClass", 0);

    SendMessage(hwndTarget, WM_SETTEXT, 0, (LPARAM)("処理終了です!"));
}
<notepadに文字列を出力できる>

コード:

#include <Windows.h>

int main()
{   
	HWND hwndTarget;
    hwndTarget=FindWindow(TEXT("notepad"),NULL);

    hwndTarget = FindWindowEx(hwndTarget, 0, "Edit", 0);

    SendMessage(hwndTarget, WM_SETTEXT, 0, (LPARAM)("処理終了です!"));
}
なぜスカイプには文字列を出力することが出来ないのでしょうか?そして、どのようにすれば文字列を出力することが出来るようになるのでしょうか?ご回答よろしくお願いします。

おならちゃん。

Re: スカイプのテキストボックスに文字列を表示させたいです。

#13

投稿記事 by おならちゃん。 » 12年前

同じ質問をしてしまってすみません。

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: スカイプのテキストボックスに文字列を表示させたいです。

#14

投稿記事 by bitter_fox » 12年前

おならちゃん。 さんが書きました: しかし、一つ出来るようになったことがあります。それは、notepadになら出力が可能になりました。
しかし不思議なことがありました。それは最初に.txtの中に文字があると上書きされています。ですが.txtを閉じると、
「内容が変更されています保存しますか?」が出ることも無く消えていて、もう一度.txtを開いてみると、プログラムで出力した文字が消えていて、もともとあった文字列が表示されます。
文字はその場所に送られているが、書かれているわけがないということでしょうか?
しかし、上書き保存を押してみると保存されていました。
内容が変更されているかの判断をテキストボックス内のデータとファイルのデータの比較で行っていないのでしょう。
恐らくですが、「元に戻す」も有効になってないのではないかと思います。
つまりこれはノートパッド内部のデータは何ら変わってないということになります。
おならちゃん。 さんが書きました: <skypeに文字列を出力できない>

コード:

#include <Windows.h>

int main()
{   
	HWND hwndTarget;
    hwndTarget=FindWindow(TEXT("tSkMainForm.UnicodeClass"),NULL);

    hwndTarget = FindWindowEx(hwndTarget, 0, "TChatRichEdit.UnicodeClass", 0);

    SendMessage(hwndTarget, WM_SETTEXT, 0, (LPARAM)("処理終了です!"));
}
なぜスカイプには文字列を出力することが出来ないのでしょうか?そして、どのようにすれば文字列を出力することが出来るようになるのでしょうか?ご回答よろしくお願いします。
まず確認するのはFindWindow(TEXT("tSkMainForm.UnicodeClass"),NULL)が成功しているかを確認してください。
確認するのはprintf("%p\n", hwndTarget)をFindWindowのあとに行ってください。
これで0を意味する値が出力されるならそもそものスカイプのウィンドウハンドルを取得できていません。

ちなみに手元のスカイプで実行すると00000000と出力されてしまい、正常に取得できていませんでした。

おならちゃん。

Re: スカイプのテキストボックスに文字列を表示させたいです。

#15

投稿記事 by おならちゃん。 » 12年前

bitter fox さん ご回答ありがとうござます^^!

notepadは比較もしていなければデータを書いてない、しかし、そこに文字は送られているけど上辺だけということですか?
上書き保存をすれば変わるのは、そこまで内部のデータが何も変わっていないということですか。なるほど・・・
確かに元に戻すはできませんでした。

FindWindow(TEXT("tSkMainForm.UnicodeClass"),NULL)は成功していましたが、
FindWindowEx(hwndTarget, 0, "TChatRichEdit.UnicodeClass", 0);
こちらを試したときに全部0でした。

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: スカイプのテキストボックスに文字列を表示させたいです。

#16

投稿記事 by bitter_fox » 12年前

おならちゃん。 さんが書きました: notepadは比較もしていなければデータを書いてない、しかし、そこに文字は送られているけど上辺だけということですか?
上書き保存をすれば変わるのは、そこまで内部のデータが何も変わっていないということですか。なるほど・・・
確かに元に戻すはできませんでした。
そういう事ですね。目に見えてるところだけが変わったという事です。
内部でどう書かれてるのかわからないですが、テキストボックスをサブクラス化したときにキー入力を受け付けるメッセージだけしか処理してないんでしょうね。
おならちゃん。 さんが書きました: FindWindow(TEXT("tSkMainForm.UnicodeClass"),NULL)は成功していましたが、
FindWindowEx(hwndTarget, 0, "TChatRichEdit.UnicodeClass", 0);
こちらを試したときに全部0でした。
ということは取得できてないですね。
TChatRichEdit.UnicodeClassが誤ってないかどうかを確認してください。

EnumWindowとGetClassNameあたりを使って総当たりで調べるというのも一つの手です。
http://msdn.microsoft.com/ja-jp/library/cc364600.aspx

おならちゃん。

Re: スカイプのテキストボックスに文字列を表示させたいです。

#17

投稿記事 by おならちゃん。 » 12年前

bitter fox さん ご回答ありがとう御座います。
EnumChildWindowsとGetClassNameを使ってみました。

コード:

#include <Windows.h>
#include <tchar.h>
#include <stdio.h>

static BOOL CALLBACK FindSaveButton(
									HWND hwnd,
									LPARAM lParam
									)
{
	TCHAR tbuf[1024];
	::GetClassName(hwnd,tbuf,sizeof(tbuf));
	if(tbuf == 0){
		printf("0になるかどうかを調べるためにつけました。\n");
		return FALSE;
	}
	printf("%p\n",tbuf);
	return TRUE;
}
int main()
{   
	HWND hwndTarget,hbtn=NULL;
    hwndTarget=FindWindow(TEXT("tSkMainForm.UnicodeClass"),NULL);
	printf("%p\n\n",hwndTarget);
	EnumChildWindows(hwndTarget,FindSaveButton,(LPARAM) &hbtn);

    SendMessage(hbtn, WM_SETTEXT, 0, (LPARAM)("処理終了です!"));
}
そしたら結果はこうなりました。

コード:

0021075C

0012FA28
0012FA28
0012FA28
0012FA28
0012FA28
 ・
 ・
 ・
といった感じになりました。配列のようにどこかを+1しなくても他のクラスを探してくれるのでしょうか?
見た感じ同じところを何回も調べてるように見えました。
僕の書いたプログラムが間違っているのでしょうかTT?
ご回答よろしくお願いします。

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: スカイプのテキストボックスに文字列を表示させたいです。

#18

投稿記事 by beatle » 12年前

これは配列の基本ですが、tBufと書くと配列tBufの先頭要素へのポインタになりますので、決して0にはなりません。
もっと言うと、tBufは常に同じ値になります。
ですから

コード:

if(tbuf == 0){
というif文は、常に成り立ちません。

TageSP

Re: スカイプのテキストボックスに文字列を表示させたいです。

#19

投稿記事 by TageSP » 12年前

http://stackoverflow.com/questions/5714 ... the-winapi
↑こちらのページを参考にして、

以下のコードのように、
階層をたどれば、取得できると思います。

コード:

#include <Windows.h>
 
int main()
{   
    HWND hwndTarget;
    hwndTarget=FindWindow(TEXT("tSkMainForm.UnicodeClass"),NULL);
    hwndTarget = FindWindowEx(hwndTarget, 0, "TConversationForm.UnicodeClass", 0);
    hwndTarget = FindWindowEx(hwndTarget, 0, "TChatEntryControl.UnicodeClass", 0);
    hwndTarget = FindWindowEx(hwndTarget, 0, "TChatRichEdit.UnicodeClass", 0);
 
    SendMessage(hwndTarget, WM_SETTEXT, 0, (LPARAM)("処理終了です!"));
}

閉鎖

“C言語何でも質問掲示板” へ戻る