トップページ⇒tech
1001コメント308KB

C♯, C#相談室 Part35

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/11/03(金) 03:07:45
(#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。

前スレ
C♯, C#相談室 Part34
http://pc8.2ch.net/test/read.cgi/tech/1157549657/

過去スレは>>2-5あたり。
※スレタイに「#」を入れても消えちゃうので新スレ立てる人は要注意だ。
0322デフォルトの名無しさん2006/11/12(日) 22:41:44
ムカデか
0323ぼるじょあ ◆yBEncckFOU 2006/11/12(日) 23:26:50
┐(´・3・`)┌ エェー
0324デフォルトの名無しさん2006/11/13(月) 00:17:08
初歩的な質問なのですがushortをbyte配列にコピーするにはどうすれば
いいのでしょうか?
Cでいうmemcpyみたいなことをしたいのです。
0325デフォルトの名無しさん2006/11/13(月) 00:31:24
Buffer

クラス名な
0326デフォルトの名無しさん2006/11/13(月) 00:44:59
Buffer.BlockCopyでできそうですね。
ありがとうございました
0327デフォルトの名無しさん2006/11/13(月) 13:25:55
C#を勉強中なんですが、3項演算子というのは、積極的に使っていくものなんでしょうか。
普通にif文を書いた方が見やすいようなきもするんですけど、どうなんでしょう。
0328デフォルトの名無しさん2006/11/13(月) 13:40:16
>>327
見やすく書いたほうが、読む方は読みやすい。自分が書いたコードでも時間が経つと
意外と悩んだりするもの。C言語でもできれば使わないほうがよいとされている。
C#でもそれは同じだろうと、俺は思っている。三項演算子の方が分かりやすいと判断
したところには使ってもいいんじゃないか?そういう意味ではgotoみたいなもの。
0329デフォルトの名無しさん2006/11/13(月) 13:46:45
複数あるWindowからIEのWindowを絞り出し、そのHTMLDocumentを抜き出すという
事をしたいのですが、その方法で煮詰まっています。

public static bool IECallBack(IntPtr hwnd, IntPtr lParam)
{
StringBuilder sbClassName = new StringBuilder(256);
GetClassName(hwnd, sbClassName, sbClassName.Capacity);
if( sbClassName.ToString().StartsWith("IEFrame"))
{
Form1.al.Add(hwnd);
}
return true;
}

// EnumWindows でIECallBack へさせる。
EnumWindows(new EnumWindowCallBack(Form1.IECallBack), IntPtr.Zero);

こんな感じでWindowのハンドルは取得できるのですが、Window内のオブジェクトを取得する
方法が分からなくて困っています。
どなたかご教授していただけませんでしょうか?よろしくお願い致します。
0330デフォルトの名無しさん2006/11/13(月) 13:50:52
3項演算子で書いて意味不明なのは、ifで書いても意味不明だと思う。
ようするに読みにくいのは3項演算子のせいじゃない。
03313272006/11/13(月) 15:53:16
単純な分岐で〜だったら1、そうでなければ2みたいな短い時に
if文で何行も使うのはどうかなと思ってました。

if (〜) { 〜 } else { 〜 }

かっこの中が1行で済むときはこんな感じで書いていたのですが、
一般的に3項演算子のほうを使うのかなと思って質問しました。
あまり参考書などで使ってるのを見かけないので
一般的に使われていないのかなと思って質問しました。
少し使ってみようと思います。
0332デフォルトの名無しさん2006/11/13(月) 17:22:36
>>329
COMのMicrosoft Internet ControlsとMicrosoft HTML Object Libraryを参照

using SHDocVw;
using mshtml;

ShellWindows sw = new ShellWindows();
foreach (InternetExplorer ie in sw)
{
  if (System.IO.Path.GetFileName(ie.FullName) == "IEXPLORE.EXE")
  {
    IHTMLDocument2 htmlDoc = (IHTMLDocument2)ie.Document;
    Console.WriteLine(htmlDoc.url);
  }
}
0333デフォルトの名無しさん2006/11/13(月) 18:03:11
>>332
正にこれです。COMオブジェクト関連の操作に関してはVBの資料は多いのですが
C#に関する資料があまりなくて苦労していました。
本当に有難う御座います。

追加で質問なのですが、IEのウィンドウでさらにアクティブになっているウィンドウを取得したいのですが、
Shellwindowからhwndを抜き出すことは簡単に出来るものなのでしょうか?
03343322006/11/13(月) 18:19:38
>>333
InternetExplorerクラスにHWNDプロパティがあるからそれが使えるんじゃない?
試してないから分からないけど。
0335デフォルトの名無しさん2006/11/13(月) 21:07:20
ボリュームコントロールをいじりたい(音を大きくしたり小さくしたりとかしたい)のですが、どうやればいいでしょうか?
03363352006/11/13(月) 21:11:54
ちなみに
↓みたいなページもあったのですが、ページが古くて、重要なウプデータがなかったりで・・・(´・ω・`)
ttp://thespoke.net/forums/950208/ShowPost.aspx
0337デフォルトの名無しさん2006/11/13(月) 21:14:50
>>336
こんなんじゃだめなん?
ttp://support.microsoft.com/kb/139098/ja
0338デフォルトの名無しさん2006/11/13(月) 21:47:17
>>337
おおお、ありがとうございます!!
0339デフォルトの名無しさん2006/11/14(火) 14:44:05
モジュールが1.1でコンパイルされたものか2.0でされたものかってどこでわかるの?
0340デフォルトの名無しさん2006/11/14(火) 18:21:51
他のアプリケーションのウィンドウがアクティブになったときに処理をさせたいのだが、
C#ではどうすりゃいいの?

他のアプリケーションのウィンドウに送られるWM_ACTIVATEメッセージを
キャッチしたいんだけど…。これをやりたい場合はグローバルフックする
必要があるからC#じゃ無理…だよね?

やはりTimerイベントを1秒間隔くらいで発生させて、その中で
GetForegroundWindowなどを呼び出してチェックする方法しかないのかな。
0341デフォルトの名無しさん2006/11/14(火) 18:35:30
コールバックは作れるみたいだけど
ttp://msdn2.microsoft.com/ja-jp/library/843s5s5x(VS.80).aspx
03423402006/11/14(火) 22:19:36
グローバルフックの部分をC言語などで書いて、WM_ACTIVATEをキャッチした時に
.NETアプリにコマンドライン引数などで通知するなんてこともできるかな。
スマートじゃないけど。

うーん。いい方法が思いつかない。素直に全部C言語で作ったほうが早いかな…。
0343デフォルトの名無しさん2006/11/14(火) 22:23:09
うん、多分その方が良いと思う。
GUI を C# で作りたいのならその部分だけ別プロセスで。
0344デフォルトの名無しさん2006/11/14(火) 22:49:46
オブジェクトを自分で破棄するにはどうすればいいんでしょうか?
0345デフォルトの名無しさん2006/11/14(火) 23:02:56
破棄というのが何を指すのかが問題だ
0346デフォルトの名無しさん2006/11/15(水) 00:26:36
オブジェクトが使用するリソースを解放したいのならそのように明示的にコーディングすればいいだけ。
オブジェクトそのものが占めるメモリを解放するなら参照を切ってからSystem.GC.Collect()する。
特定のオブジェクトのメモリ領域を解放するのは不可能だしそもそも意味がない。
0347デフォルトの名無しさん2006/11/15(水) 00:41:39
質問です。IntPtrに加減演算が定義されてないのはなぜでしょうか。
IntPtr ptr = ...;
ptr = (IntPtr)(ptr.ToIntXX() + 3);
などと書くとアーキテクチャに依存して効率が落ちたりしそうな気がするのですが
どうなんでしょう。
0348デフォルトの名無しさん2006/11/15(水) 00:44:30
加減算がしたいのならunsafeで通常のポインタ使ってください
0349デフォルトの名無しさん2006/11/15(水) 00:52:40
>>343
そんなことするくらいなら全部ネイティブで書いたほうが早い
Cだと面倒なんでC++/MFCならC#を使うより工数は少ないはず
0350デフォルトの名無しさん2006/11/15(水) 00:57:27
>>347
その質問に答えられるのは MS の中の人だけだろう。
MSDN フォーラムででも聞いてくれ。
03513472006/11/15(水) 01:27:28
>>348
なるほど、そういうポリシーなのですか。
わかりました。
0352デフォルトの名無しさん2006/11/15(水) 01:36:58
プロパティグリッドに表示させたときに
Listメンバを編集させないようにできないですか?
ReadOnly をつけても編集できてしまいます

class MyClass{
 private List<string> myList;
 [ReadOnly(true)]
 public List<string> MyList{
  get{return myList;}
  set{list = myList;}
 }
}
0353デフォルトの名無しさん2006/11/15(水) 10:02:58
>>352
プロパティとしては、setterを用意したいけど、
デザイナー上からは、編集できないようにしたいってこと?
0354デフォルトの名無しさん2006/11/15(水) 10:22:50
C# で作成したアプリケーションを、特定の拡張子と関連付けようとして
「関連付けたい拡張子のファイルを右クリック」
→「プログラムから開く」
→「プログラムの選択」
で作成したアプリケーションを選択したら、アプリケーション名が空になってしまいました。
これって何が悪いのでしょうか?
0355デフォルトの名無しさん2006/11/15(水) 11:58:28
レジストリ確認しろ
0356デフォルトの名無しさん2006/11/15(水) 13:42:04
引数のアプリケーション名が空ってことを言いたいんじゃないの?
Argじゃなくてプロパティにあった気がする
0357デフォルトの名無しさん2006/11/15(水) 19:04:48
char型の変数から値取り出したら変な数値だったんだけど
文字型の1が0x31のはずなのになんかばかでかい変な値だった
どうやればいいか教えてくれ
0358デフォルトの名無しさん2006/11/15(水) 19:05:40
>>357への回答至急お願いする
0359デフォルトの名無しさん2006/11/15(水) 19:21:17
全角の1だったんじゃね
0360デフォルトの名無しさん2006/11/15(水) 19:21:27
じょうだんじゃない
0361デフォルトの名無しさん2006/11/15(水) 19:44:08
わかる奴はいなさそうだな
それじゃ
0362デフォルトの名無しさん2006/11/15(水) 20:15:22
Console.WriteLine("{0:x}", (int)'1');
0363デフォルトの名無しさん2006/11/15(水) 21:39:37
これからは>>357みたいな奴ばかりになるのかと思うと引退考えるな
0364デフォルトの名無しさん2006/11/15(水) 21:41:41
どうぞどうぞ。
0365デフォルトの名無しさん2006/11/15(水) 21:54:49
>>357
すまん。


もう、君が何を言ってるのかわからないよ。
0366デフォルトの名無しさん2006/11/15(水) 22:11:15
>>354
多分 AssemblyTitle 属性の値が使われると想う。
AssemblyInfo.cs 見てみ。

あとキャッシュされてる可能性がある。
前にそう言うやり取り見たな。あれは XP のタスクバーのグループ化の話だったか。
0367デフォルトの名無しさん2006/11/15(水) 22:25:32
>>365
何となく理解はできた。
それすらもわからないなら君も早く引退した方がいいよ^^
0368デフォルトの名無しさん2006/11/15(水) 22:37:27
C#でchar型って文字型だから、単純に値を取り出して
intみたいな数字型に変換するのは無理…というかしちゃダメじゃないの?

Encoder使って、byteに変換すれば可能だけど
0369デフォルトの名無しさん2006/11/15(水) 22:42:36
(゚д゚)ハァ?してもよろしいですか?





(゚д゚)ハァ?(゚д゚)ハァ?(゚д゚)ハァ?(゚д゚)ハァ?
0370デフォルトの名無しさん2006/11/15(水) 22:58:19
>>368
CharもInt32もただの構造体だがその辺は適当にConvertibleになってる。

つーか、君はちょっとくらい調べてから発言しようとは思わんのかね。
0371デフォルトの名無しさん2006/11/15(水) 22:59:22
よろしいです!
0372デフォルトの名無しさん2006/11/15(水) 23:13:23
>>368
char->intなら暗黙的にキャストできるだろ。
0373デフォルトの名無しさん2006/11/15(水) 23:21:47
C#でC++の特性クラスみたいなことは出来ますか?
0374デフォルトの名無しさん2006/11/15(水) 23:25:34
traitsはさすがにtemplateがないと無理だろ
0375デフォルトの名無しさん2006/11/15(水) 23:26:06
でも代わりにリフレクションがあるか。
0376デフォルトの名無しさん2006/11/17(金) 17:55:33
DataGridコントロールで、Enterキー押下時にカーソルを
左に移動する処理を行いたいのですが、下記のイベント
にブレークポイントをおいても、イベントがコールされません。
EnableはTrueになっています。

何か設定に不備があるのでしょうか?

dataGrid1_KeyPress
dataGrid1_KeyUp
dataGrid1_KeyDown

環境 VS2003 Win2003
0377デフォルトの名無しさん2006/11/17(金) 18:59:14
>>376
仕様です。
0378デフォルトの名無しさん2006/11/17(金) 19:19:55
一度StartさせたThreadを再び使用するにはどうしたらよいのでしょうか?
一度終了したThreadに対して普通に再びStart()メソッドを呼ぶとThreadStateExceptionが飛んできます…。
0379デフォルトの名無しさん2006/11/17(金) 19:31:48
終了させなければ良い
0380デフォルトの名無しさん2006/11/17(金) 19:44:50
そもそもなんで再利用したいの?
0381デフォルトの名無しさん2006/11/17(金) 19:46:37
もし可能なら毎度毎度Threadをnewするオーバーヘッド(どの程度かわかりませんが)を避けられるかな、と思った次第です。
0382デフォルトの名無しさん2006/11/17(金) 19:49:53
>>381
用途にもよるがBackgroundWorkerやその他のThreadPoolを使いなされ。
0383デフォルトの名無しさん2006/11/17(金) 19:50:07
スレッドでこんな風にすれ

while ( ! 死に時?) {
 合図があるまで待つ;
 お仕事;
}
0384デフォルトの名無しさん2006/11/17(金) 19:52:49
>>382,383
いろいろ試してみます。
ありがとうございました。

>>379
しね
0385デフォルトの名無しさん2006/11/17(金) 19:54:13
>>379=>>383なわけだが・・・しねってか
0386デフォルトの名無しさん2006/11/17(金) 20:00:05
ワラタ
0387デフォルトの名無しさん2006/11/17(金) 20:01:38
C#マネージコードでスクリーンセーバーのような
CGを描写するプログラムを書いていて、
その画面を動画ファイルとして出力する機能をつけたいと考えています。
動画を作るライブラリはVideo For Windowsなど色々あるようですが、
何を使うのが一番最適でしょうか?
0388デフォルトの名無しさん2006/11/17(金) 20:43:23
>>385
おい、死に時らしいぜ
0389デフォルトの名無しさん2006/11/17(金) 23:48:07
>>385
GCが後ろで待ってるおw
0390デフォルトの名無しさん2006/11/17(金) 23:57:22
res385 = null;
System.GC.Collect();

こうですか!!わかりません><
0391デフォルトの名無しさん2006/11/18(土) 00:30:24
便乗っぽいですけど、オブジェクト参照値をクラス変数として
持たせた場合にも参照地にnullをセットすれば勝手にGCが効くんですか?
0392デフォルトの名無しさん2006/11/18(土) 00:34:52
>>391
他から参照されてなければ刈ってくれるでしょ。

尤も実際に目で確かめる術はないけど。
0393デフォルトの名無しさん2006/11/18(土) 00:43:04
>>392
> 尤も実際に目で確かめる術はないけど。

つ WeakReference
0394デフォルトの名無しさん2006/11/18(土) 03:48:05
>>391
意味無いから、やめとけw
消えるべき時に、勝手に消える。
0395デフォルトの名無しさん2006/11/18(土) 22:40:53
質問です。

BitmapのLockbitsメソッドでゲットしたイメージメモリに対して
Cで記述したネイティブコードからイメージ操作することは可能でしょうか?

0396デフォルトの名無しさん2006/11/18(土) 22:49:18
やったことないけどunsafeコードでポインタ使って操作できるくらいだから、できるんじゃね?
0397デフォルトの名無しさん2006/11/18(土) 23:36:10
もちろんそうよ
03983952006/11/18(土) 23:36:59
395です。
今試したらできました!
0399デフォルトの名無しさん2006/11/19(日) 10:12:40
フォームクラス内にリストを作って、そこをべつのフォームから参照しようと
しているのですができません。
public List<string>でできると思ったのですが。
どうすればいいのでしょうか。どなたかご教示ください。
0400デフォルトの名無しさん2006/11/19(日) 10:37:53
非staticメンバなら
フォームクラスForm1のインスタンスをform1とすると
 form1.list
staticなら
 Form1.list
04013952006/11/19(日) 12:54:48
あ〜あ。

私のやりたかったことは、画像のエフェクト処理をCで書いたDLLに任せることだったんだけど、
試しに、Cで作ったエフェクトルーチンをC#に移植しても、スピードが変わらなかった。

C#って遅いと思ってたけど、ほぼネイティブ並のスピード出るのね・・・。
JITコンパイラはきちんとSSE/SSE2命令使ってくれるし。

すみません、チラ裏でした。
0402デフォルトの名無しさん2006/11/19(日) 13:04:23
>>401氏は頭が悪いと見た
04033952006/11/19(日) 13:12:49
頭、悪いですよー。
MSX時代から思考が止まってます。
0404デフォルトの名無しさん2006/11/19(日) 13:50:15
Z80世代はホント頭悪いからね
0405デフォルトの名無しさん2006/11/19(日) 14:23:19
>>401
まあ、遅いのは初回起動のみだし。

そういや、今、自宅で新しく買った PC に Vista RC2 入れてるんだけど、
.NET アプリの起動がむちゃくちゃ早い(ほんとに一瞬)んだけど。
これは、PC のスペックいいからなのか、
Vista では CLR の最適化かかってるからなのか、どっちなんだろう?
0406デフォルトの名無しさん2006/11/19(日) 14:26:00
OS起動時にロードされてる
0407デフォルトの名無しさん2006/11/19(日) 14:36:18
うむ、知らないで遅い遅い言ってる馬鹿もいるんだよなあ
0408デフォルトの名無しさん2006/11/19(日) 14:58:53
>>405
うちでは大差ないよ。
たぶんスペックのせいかと
0409デフォルトの名無しさん2006/11/19(日) 15:24:10
XPとVista両方に.Net製のシェルエクステンションを仕込んでるけど、
XPはログオンに時間がかかるがVistaは確かにかなり速い。
0410デフォルトの名無しさん2006/11/19(日) 15:38:06
Vistaはリソース食い過ぎ('A`)


そういえば、Vista対応のために、XPからの変更点のまとめってありませんか?
システムフォルダがお引っ越しor内部で勝手にリンクするというのは聞いたんですが。
0411デフォルトの名無しさん2006/11/19(日) 15:38:58
Vista1/31リリースだっけか・・・
3年後位には主流になるのかねぇ・・・

0412デフォルトの名無しさん2006/11/19(日) 16:26:05
馬鹿発見>>408
0413デフォルトの名無しさん2006/11/19(日) 21:04:14
>>405
SuperFetchが効いてるんじゃね?重量級のアプリにはかなり
効くようだ。VSとか。
メモリたくさんつまないと駄目だけど。
04144052006/11/19(日) 21:23:29
>>413
メモリ2GB積んでる。
無駄にオーバースペックなもの買ってみた。

要するに、JIT が早いのは単にプロセッサ性能、
動作が速いのは .NET Framework のコンポーネントが
SuperFetch であらかじめメモリ上にロードされてるから
ってことでいいのかな?
0415デフォルトの名無しさん2006/11/19(日) 21:48:04
意外と知らないで遅い遅いと.NET使ってる奴が多いってことか
なんだかね
0416デフォルトの名無しさん2006/11/19(日) 23:28:29
>>415
パソコンを使っている人の大半はあなたみたいなヲタクではありません。
大半の人に使っていただくためには屁理屈こねて遅くないんだよなんていってて・・・
0417デフォルトの名無しさん2006/11/19(日) 23:33:11
>>416
415じゃないけど、開発者する人間なら…
04184172006/11/19(日) 23:33:49
× 開発者する人間
○ 開発する人間
0419デフォルトの名無しさん2006/11/19(日) 23:36:37
C#で開発?
0420デフォルトの名無しさん2006/11/19(日) 23:57:28
初心者と勘違いPGが紛れ込んでますねw
0421デフォルトの名無しさん2006/11/20(月) 00:13:35
ヲタクばっかですねw
■ このスレッドは過去ログ倉庫に格納されています