C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: ウィンドウタイトルについて


(過去ログ 78 を表示中)

[トピック内 14 記事 (1 - 14 表示)]  << 0 >>

■46229 / inTopicNo.1)  ウィンドウタイトルについて
  
□投稿者/ アトム (1回)-(2010/01/28(Thu) 18:02:35)

分類:[.NET 全般] 

2010/01/28(Thu) 18:03:23 編集(投稿者)

初めまして!アトムといいます。
いつも参考にさせてもらってます。

今回、GetWindowTextを使用して、ウィンドウタイトルを取得しようとしているのですが、どうしても分からなく(〜_〜)
質問させてもらいます!!

次に、作成したコードを書きます。
予想だとクリックした位置にあるウィンドウタイトルがぽんぽん表示されるはずなのですが・・・
どこが間違いか分かりませんか?!
回答よろしくお願いします。

Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Integer, ByVal lpString As String, ByVal cch As Integer) As Integer

Dim w As String
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Timer1.Interval = 10
Timer1.Start()
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

TextBox1.Text =GetWindowText(GetForegroundWindow, w, Len(w))
End Sub
引用返信 編集キー/
■46233 / inTopicNo.2)  Re[1]: ウィンドウタイトルについて
□投稿者/ Hongliang (550回)-(2010/01/28(Thu) 18:58:25)
> TextBox1.Text =GetWindowText(GetForegroundWindow, w, Len(w))
GetWindowText の返値は
> Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Integer, ByVal lpString As String, ByVal cch As Integer) As Integer
Integer なのに、それを Text に設定しても仕方ないと思います。
それから w は、GetWindowText を呼び出すたびに毎回初期化してやるべきです(ローカル変数で十分)。

あと GetWindowText"A" って限定しちゃうと、一部文字(日本語版 Windows だと Shift_JIS に入っていない文字)が化けることになります。
Declare のあとに Auto キーワードを付け、Alias 句を削除することで、NT 系の OS の場合 Unicode 版の関数を呼び出してくれます。

// VB だと StringBuilder は使わなくてもいいんだっけ。
引用返信 編集キー/
■46234 / inTopicNo.3)  Re[2]: ウィンドウタイトルについて
□投稿者/ アトム (2回)-(2010/01/28(Thu) 19:11:24)
No46233 (Hongliang さん) に返信

回答ありがとうございます!!

> Integer なのに、それを Text に設定しても仕方ないと思います。

すみません!!!写し間違いでした。
ここの点は大丈夫でした@

> あと GetWindowText"A" って限定しちゃうと、一部文字(日本語版 Windows だと Shift_JIS に入っていない文字)が化けることになります。
> Declare のあとに Auto キーワードを付け、Alias 句を削除することで、NT 系の OS の場合 Unicode 版の関数を呼び出してくれます。
>
> // VB だと StringBuilder は使わなくてもいいんだっけ。

この部分はよく理解できなかったのですが、実際にどのようにすればいいのでしょうか?m(-_-)m
引用返信 編集キー/
■46235 / inTopicNo.4)  Re[3]: ウィンドウタイトルについて
□投稿者/ 囚人 (465回)-(2010/01/28(Thu) 19:21:11)
>すみません!!!写し間違いでした。
>ここの点は大丈夫でした@

実際どう書いてるんです?
引用返信 編集キー/
■46236 / inTopicNo.5)  Re[4]: ウィンドウタイトルについて
□投稿者/ アトム (3回)-(2010/01/28(Thu) 19:27:35)
No46235 (囚人 さん) に返信

> 実際どう書いてるんです?

このようになっていますm(-_-)m


Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Integer, ByVal lpString As String, ByVal cch As Integer) As Integer
dim w as string
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Timer1.Interval = 100
Timer1.Start()
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim a As Integer = GetForegroundWindow
TextBox1.Text = ""
GetWindowText(a, w, 255)
TextBox1.Text = w
End Sub
引用返信 編集キー/
■46237 / inTopicNo.6)  Re[5]: ウィンドウタイトルについて
□投稿者/ alvin (46回)-(2010/01/28(Thu) 19:31:03)
No46236 (アトム さん) に返信
> ■No46235 (囚人 さん) に返信
>
>>実際どう書いてるんです?
>
> このようになっていますm(-_-)m
>
>
> Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Integer, ByVal lpString As String, ByVal cch As Integer) As Integer
> dim w as string
> Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
> Timer1.Interval = 100
> Timer1.Start()
> End Sub
>
> Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
> Dim a As Integer = GetForegroundWindow
> TextBox1.Text = ""
> GetWindowText(a, w, 255)
> TextBox1.Text = w
> End Sub

上記のコードで正しく動作しますか?
引用返信 編集キー/
■46238 / inTopicNo.7)  Re[5]: ウィンドウタイトルについて
□投稿者/ 囚人 (466回)-(2010/01/28(Thu) 19:32:11)
w の型が何か分からんですなー。
Hongliang さんが書いてますが、w を StringBuilder にしてみたら?
引用返信 編集キー/
■46239 / inTopicNo.8)  Re[6]: ウィンドウタイトルについて
□投稿者/ 囚人 (467回)-(2010/01/28(Thu) 19:33:06)
>w の型が何か分からんですなー。

あ、失敬。string になってますね。
引用返信 編集キー/
■46240 / inTopicNo.9)  Re[7]: ウィンドウタイトルについて
□投稿者/ alvin (48回)-(2010/01/28(Thu) 19:38:59)
2010/01/28(Thu) 19:42:02 編集(投稿者)

ストリング宣言の部分を
Dim w = New String("", 100)
にしないと、できないような・・・
引用返信 編集キー/
■46241 / inTopicNo.10)  Re[8]: ウィンドウタイトルについて
□投稿者/ 囚人 (469回)-(2010/01/28(Thu) 19:43:09)
No46240 (alvin さん) に返信
> ストリング宣言の部分を
> Dim t = New String("", 100)
> にしないと、できないような・・・

string でできるなら今のままでもできるでしょうし、できないなら、
Dim t = New String("", 100)
でもできません。
引用返信 編集キー/
■46242 / inTopicNo.11)  Re[9]: ウィンドウタイトルについて
□投稿者/ alvin (50回)-(2010/01/28(Thu) 19:48:48)
2010/01/28(Thu) 19:49:42 編集(投稿者)

No46241 (囚人 さん) に返信
> ■No46240 (alvin さん) に返信
>>ストリング宣言の部分を
>>Dim t = New String("", 100)
>>にしないと、できないような・・・
>
> string でできるなら今のままでもできるでしょうし、できないなら、
> Dim t = New String("", 100)
> でもできません。

いやあ・・・
こちの端末でテストしてみたら、文字列宣言するときに
Dim t = New String("", 100)
にしないと、NULLインスタンス参照エラーが発生しましてね。

Dim w As String
ですと、実際タイトル文字列格納バッファが生成されてない状態かと。


引用返信 編集キー/
■46243 / inTopicNo.12)  Re[8]: ウィンドウタイトルについて
□投稿者/ アトム (4回)-(2010/01/28(Thu) 19:51:15)
No46240 (alvin さん) に返信

> ストリング宣言の部分を
> Dim w = New String("", 100)
> にしないと、できないような・・・

できましたーーーーーーー(^^)
なんでかは分かりませんが、関数成功です!!
ありがとうございます。
回答して下さった、皆さんもありがとうございました!!!!
引用返信 編集キー/
■46244 / inTopicNo.13)  Re[9]: ウィンドウタイトルについて
□投稿者/ アトム (5回)-(2010/01/28(Thu) 19:52:52)
文字列格納バッファの生成で引っかかってました!
こういう事だったんですね、ありがとうございます。
解決済み
引用返信 編集キー/
■46245 / inTopicNo.14)  Re[10]: ウィンドウタイトルについて
□投稿者/ 囚人 (470回)-(2010/01/28(Thu) 20:00:07)
>こちの端末でテストしてみたら、文字列宣言するときに
>Dim t = New String("", 100)
>にしないと、NULLインスタンス参照エラーが発生しましてね。


本当にそんなエラーになりますか?試しましたけどなりませんよ。

VB なら
Dim t = New String("", 100)
で、バッファ確保できるんですね。知りませんでした。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -