ページ 1 / 1
スカイプのテキストボックスに文字列を表示させたいです。
Posted: 2011年11月24日(木) 18:56
by おならちゃん。
スカイプのテキストボックスに文字列を表示させたいのですが、やり方がいまいちわかりません。
わけもわからず調べていると、結局こうなったのですが、エラーが無いですが、実効もないです。
#include <Windows.h>
int main()
{
HWND hWnd=0;
HWND hEdit = ::GetDlgItem(hWnd, 0x00010B88);
SendMessage(hEdit,WM_SETTEXT,0,(LPARAM)TEXT("ほげほげ"));
}
ハンドルはAutoItX3のinfoで調べました。
まったく訳がわかっていない状態です。
これから僕が調べた方がいいことなどのご指導をいただけたら嬉しいです。
よろしくお願いします。
Re: スカイプのテキストボックスに文字列を表示させたいです。
Posted: 2011年11月24日(木) 19:09
by bitter_fox
おならちゃん。 さんが書きました:スカイプのテキストボックスに文字列を表示させたいのですが、やり方がいまいちわかりません。
わけもわからず調べていると、結局こうなったのですが、エラーが無いですが、実効もないです。
コード:
#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
Re: スカイプのテキストボックスに文字列を表示させたいです。
Posted: 2011年11月24日(木) 19:52
by naohiro19
有料ですが Spy++ を使えば Skypeのダイアログの持っているウィンドウIDを調べることができます。
Re: スカイプのテキストボックスに文字列を表示させたいです。
Posted: 2011年11月24日(木) 20:47
by おならちゃん。
bitter foxさん 早速のお返事ありがとう御座いました。
まず、フォーラムルールのことについて教えていただきありがとう御座います!
それと、
で囲むのですね!すみませんでした。
有力なURLをありがとう御座います。
1. 自分は今何がしたくて
スカイプへ文字列を送るプログラムを作りたいです。
2. どう取り組んで(作ったプログラムはどれで
サイトで調べましたが難しくて出来ませんでした。
3. どのようなエラーやトラブルで困っていて
まだ、出来ていません。
4. 自分は何が解らないのか、知りたいのか
ほとんど全てです。どのように送ればいいのかが全てわかっていません。
(まだ追記で張ってくださったURLはちょこっとしかみていないので、これから見て学ぼうと思っています。)
5. 今のCの知識はどの程度なのか
C言語が書けるくらいですが、APIは無知です。
naohiro19さん
ご回答ありがとう御座いました。初めて知りました!。しかし、スカイプ以外となったときに学んでおかないと応用が利かないとおもいましたので今回は自分で作って行きたいと思います。
Re: スカイプのテキストボックスに文字列を表示させたいです。
Posted: 2011年11月24日(木) 22:31
by beatle
Re: スカイプのテキストボックスに文字列を表示させたいです。
Posted: 2011年11月25日(金) 21:42
by おならちゃん。
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);
}
}
Re: スカイプのテキストボックスに文字列を表示させたいです。
Posted: 2011年11月25日(金) 22:52
by softya(ソフト屋)
「Vector: FinderSystem - 新着ソフトレビュー」
http://www.vector.co.jp/magazine/softne ... 04201.html
ウィンドウ名ならこれが使えるのでは?
Re: スカイプのテキストボックスに文字列を表示させたいです。
Posted: 2011年11月25日(金) 23:08
by おならちゃん。
softyaさん ご回答ありがとうございます。しかし、ダウンロードすることは出来ませんでした。
こちらを勧めてくださるということはAutoItX3infoでは情報が不十分だということでしょうか?
Re: スカイプのテキストボックスに文字列を表示させたいです。
Posted: 2011年11月25日(金) 23:12
by softya(ソフト屋)
こっちが使いやすかなと思っただけです。すいません公開停止してますね。失礼しました。
ともかく他にも方法があるって事を言いたかっただけです。
Re: スカイプのテキストボックスに文字列を表示させたいです。
Posted: 2011年11月25日(金) 23:34
by ISLe
コントロールIDがころころ変わってますけど一定ではないのでしょうか?
一定でないのであればGetDlgItemじゃなくてFindWindowExを使う必要があるのでは。
Re: スカイプのテキストボックスに文字列を表示させたいです。
Posted: 2011年11月26日(土) 16:53
by おならちゃん。
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: スカイプのテキストボックスに文字列を表示させたいです。
Posted: 2011年11月26日(土) 16:53
by おならちゃん。
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: スカイプのテキストボックスに文字列を表示させたいです。
Posted: 2011年11月26日(土) 16:54
by おならちゃん。
同じ質問をしてしまってすみません。
Re: スカイプのテキストボックスに文字列を表示させたいです。
Posted: 2011年11月27日(日) 19:13
by bitter_fox
おならちゃん。 さんが書きました:
しかし、一つ出来るようになったことがあります。それは、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: スカイプのテキストボックスに文字列を表示させたいです。
Posted: 2011年11月27日(日) 23:02
by おならちゃん。
bitter fox さん ご回答ありがとうござます^^!
notepadは比較もしていなければデータを書いてない、しかし、そこに文字は送られているけど上辺だけということですか?
上書き保存をすれば変わるのは、そこまで内部のデータが何も変わっていないということですか。なるほど・・・
確かに元に戻すはできませんでした。
FindWindow(TEXT("tSkMainForm.UnicodeClass"),NULL)は成功していましたが、
FindWindowEx(hwndTarget, 0, "TChatRichEdit.UnicodeClass", 0);
こちらを試したときに全部0でした。
Re: スカイプのテキストボックスに文字列を表示させたいです。
Posted: 2011年11月27日(日) 23:28
by bitter_fox
おならちゃん。 さんが書きました:
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: スカイプのテキストボックスに文字列を表示させたいです。
Posted: 2011年11月28日(月) 01:56
by おならちゃん。
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?
ご回答よろしくお願いします。
Re: スカイプのテキストボックスに文字列を表示させたいです。
Posted: 2011年11月28日(月) 07:07
by beatle
これは配列の基本ですが、tBufと書くと配列tBufの先頭要素へのポインタになりますので、決して0にはなりません。
もっと言うと、tBufは常に同じ値になります。
ですから
というif文は、常に成り立ちません。
Re: スカイプのテキストボックスに文字列を表示させたいです。
Posted: 2012年4月02日(月) 15:55
by TageSP
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)("処理終了です!"));
}