3
4
乙
8 :
デフォルトの名無しさん :05/02/13 12:16:07
なるほど!デスクトップとの対話をサービスに許可するのは、 ネットワークサービスのためだったのか!!勉強になりました!!!
前スレ
>>
http://pc5.2ch.net/test/read.cgi/tech/1106103119/989 ------------------------------------------------------
アンインストール情報は、
HKLM \ Software \ Microsoft \ Windows \ CurrentVersion \ UnInstall \
以下に保存します。
ここに DisplayString、UninstallString をはじめとするいくつかの値を適切に書き込んでおくと、
コンパネの「プログラムの追加と削除」からアンインストールできるようになります。
------------------------------------------------------
自分のメモのあるものです、確認していないので
>>9 見つかりました。こんなところに保存されていたんですね…。
どうもありがとうございました。
サブクラス化したエディットコントロールでマウスの左クリックした 場所の位置を特定することはできるでしょうか?教えてください
WM_LBUTTONDOWN
よく読めボケ
今ゲームを作っていて、ウィンドウのサイズをフルスクリーン表示は分からないので起動時に最大化で変更できないようにして作ってます。 文字などを表示する際、1024*768として表示させているのですが、この大きさはみんな同じなのでしょうか? 他の人にやって貰うとき小さいディスプレイの人だったら表示とかおかしくなってしまうのですか? 説明が下手ですいません^^; 分かる方教えて下さい。
日本語の勉強先にした方がいいぞ
ファイルからメモリに読み込んだ16×16ピクセルのBMPを並べて 640×480ピクセルのBMPイメージをメモリ上に作成し それをウインドウに表示させたいんですがうまくいきません、どうしたらいいでしょうか? 以下ソース #define FIELD_X 40 #define FIELD_Y 30 //変数 static HDC hMemDC_BG; //作成する640×480イメージ用のDCハンドル static HDC hMemDC_BG_BLOCK; //メモリに読み込む16×16のBMPのDCハンドル static HBITMAP hBitmap; //メモリに読み込んだ16×16のBMPのBMPハンドル static HBITMAP hBitmap_BG; //作成する640×480イメージ用のBMPハンドル static BITMAP bitmap; static BITMAP bitmap_BG; void MakeBG(void) { int i; int j; for(i=0;i < FIELD_Y;i+=16) { for(j=0;j < FIELD_X;j+=16) { BitBlt(hMemDC_BG,j,i,bitmap_BG.bmWidth,bitmap_BG.bmHeight,hMemDC_BG_BLOCK,0,0,SRCCOPY); } } }
//プロシージャ- case WM_CREATE: hMemDC_BG = CreateCompatibleDC(NULL); hMemDC_BG_BLOCK = CreateCompatibleDC(NULL); hBitmap = LoadImage((HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),BMPFILE,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); SelectObject(hMemDC_BG_BLOCK,hBitmap); GetObject(hBitmap,sizeof(BITMAP),&bitmap); hdc = GetDC(hWnd); hBitmap_BG = CreateCompatibleBitmap(hdc,640,480); ReleaseDC(hWnd,hdc); SelectObject(hMemDC_BG,hBitmap_BG); GetObject(hBitmap_BG,sizeof(BITMAP),&bitmap_BG); return 0; case WM_PAINT: hdc = BeginPaint(hWnd,&ps); MakeBG(); //16×16のイメージを並べる関数 BitBlt(hdc,0,0,bitmap.bmWidth,bitmap.bmHeight,hMemDC_BG,0,0,SRCCOPY); EndPaint(hWnd,&ps); return 0; }
誰も実際に実行してみようとは思わないから、上手くいきません とだけ書いても上手くいかないよ
っていうかMakeBGのループが何回まわるか数えてみろ
パターンブラシで塗りつぶせばいいんでないか? Win9xだと制限があるからアレだけど。
そうでした、実行結果も書かないと; 実行すると16×16のBMPが一個しか表示されません。 メモリ上に仮想イメージを上記のMake関数みたいなもので作成する方法がわかれば解決すると思うんですが・・・
WM_PAINTも変だよ。
確かにMake関数イカレてますね; 出直してきます、ありがとうございました
>>18 ディスプレイの大きさなどにもよるし、たとえ同じディスプレイでも画面のプロパティから自由に大きさを変えられる。
GetDeviceCapsのHORZRESとVERTRES
GetDesktopWindow()して、GetClientRect()とか。
画像を半透明にして表示させたいのですが、どうすればいんですか?
>>31 APIスレ的にはWS_EX_LAYERED属性付き枠無しウィンドウに画像を表示させてSetLayeredWindowAttribute()。で、そのウィンドウを別のウィンドウに重ねる。
マジレスするとCreateDIBSectionでビットマップ作成して自前で合成
GDI+も忘れないでね・・・
おもいっきり猫でもわかるって書いてるがな
今、RPGの戦闘で時間が溜まると行動できるというシステムを作ってます。 その時間は、SetTimerで時間をためているのですが、それを実行するとCPU使用率が100%になり重くなってしまいます。 他に時間をためれる関数は無いのでしょうか?
次に誰かが行動できるまでの時間を計算してそれをタイマーの引数にすれば隠者ねーの
タイマー用のスレッドをつくって、一定時間ごとのループをさせる。
>>41 タイマーの間隔がおなじなら別スレッドだろうが負荷100%になるんじゃねーの
>36 ありがとうございます
44 :
デフォルトの名無しさん :05/02/13 23:19:34
>38 タイマー無限増殖病か? いずれにしても愚か者
>>42 セットタイマーってことは、メッセージ投げまくってるってことでは?
メッセージが投げられない分スレッドのほうが軽いと思うが
Editボックス内でのカーソルの位置を取得するAPIは ありますでしょうか?
あります。
ありました。ありがとん
一つ質問があるのですが、 RichEditCtrlは、任意の場所に文字列を挿入するということはできないのでしょうか? もしできるなら、その際に使用する関数(方法)を教えていただきたいのですが。 宜しくお願いいたします。
漢字変換のポップアップウィンドウを出したい(漢字変換をこちら側で指定したい)んだけど、 そうゆうライブラリある? たとえば、 functionA(”とうきょう"); と漢字変換させたいひらがなを引数として渡せば、漢字変換される漢字のリストがわかるみたいなもの。 自作のテキストエディタを作りたいんです。
ImmGetConversionList()
LPCTSTRって LONG ポインタ なんか なんか 文字列の略だと思ったんですが CとTはなんですか?
typedef const TCHAR FAR *LPCTSTR;
>>54 Cはconst
TはUnicodeビルドだとLPCWSTRになる。
>56 すみません、unicodeビルドというのがよくわからないんですが TもしくはWは文字コードによって変わるということでしょうか?
>>57 #ifdef UNICODE
typedef CHAR TCHAR;
#define TEXT(s) s
#else
typedef WCHAR TCHAR;
#define TEXT(s) L ## s
#endif
typedef CONST TCHAR FAR *LPCTSTR;
こういう風になっていて、UNICODEを定義してビルドするのがUnicodeビルド。
プログラムで使用する文字列をUnicodeにするかどうか選べる。
さらにAPIも~Aと~Wを切り替えるようにできている。(というよりこれのためにTCHARがあるような)
59 :
デフォルトの名無しさん :05/02/14 21:19:44
test
60 :
デフォルトの名無しさん :05/02/14 21:20:39
test
61 :
デフォルトの名無しさん :05/02/14 21:24:16
62 :
デフォルトの名無しさん :05/02/14 21:30:01
たとえそれが真実だとしても、代替手段はない。
>>61 その話の本質は、「ふたりはプリキュア~」でそ。
64 :
デフォルトの名無しさん :05/02/14 21:37:37
メモリモデルの設計はwin登場の当時は画期的だったが…。 でも、古いスタイルのメモリ割り当てより優れているし、winアプリ設計には必要な知識だ。全てを知る必要はないが。
十数年前から互換性を保っているのだけが取り柄。 MacやLinuxなんて悲惨だぞ。
From 赤坂玲音 >また、僕が時代遅れであると言うのは Win32 API の設計です。 >Win32 で作られたプログラムや、その開発者が時代遅れと言うわけではないので、この点は誤解しないでください。 >最後に、開発スタイルについて少し。 >個人に対して言えば、どうぞあなたの好きな言語とAPIを使ってくださいという程度です。 >しかし、組織でどの言語と API を使うかを決断するには、好き嫌いの次元ではいけません。 >プロジェクト管理者であれば、好みではなく純粋に生産性、移植性、安全性、目的、チームのレベル、 >教育のし易さなど、様々な観点から採用するプラットフォームを決断する必要があります。 From 齎禍 >確かに、Win32APIは時代遅れ感が滲み出てますね。 >フラグは使い過ぎ、キャストは乱用する、エラー処理は統一されていない・・・ >正直、これを現代風に上手くラップするには、相当な知識と技量が必要だと感じますね。
便利で操作性のよいアプリが作れるなら何でもいい
WinAPIを勉強したからといって、 次世代の何かがでたときに、足かせになるとは思えんのだがな。
BASIC使いがCで躓いたり、C使いがJAVA(C++?)で躓いたりってのはあるっぽいけど 個人的にはWinAPIは覚えた方が良いと思われ(少なくとも、今勉強するなら)
MessengerPlusのポップアップ通知みたいな動きってどうやればいい? タイマー使ってMoveWindowか?
>>69 それは単に順応能力がない人間の責任であって開発環境の問題ではないと思う。
仕事であろうと趣味であろうとひとつのパラダイムに縛られるのはすごくもったいないとは感じる。
そういう俺はWinAPI派なんだけどな。だってWindowsの標準的なクラスライブラリって無いじゃん。
有っても高価だったりするし。
フリーなライブラリはわりと特定の機能に特化されてたりして今ひとつなんだよな。
強力なクラスライブラリはUnix由来のポータビリティ優先でWindowsっぽさが無くて重かったりとか。
言語などに縛られる必要はない 目的を達成できればいい。
とりあえず、WinFSとかまではWIN32APIはありだと思う WinFSってちょっとしか調べてないけど、どんなんだろ
74 :
デフォルトの名無しさん :05/02/15 00:39:53
SHBrowseForFolder() でフォルダ選択ダイアログを表示できますが このダイアログの表示位置を指定(例えばデスクトップのセンターに) する方法はありますか?
75 :
デフォルトの名無しさん :05/02/15 01:00:52
>>73 WinFXだよ。
WinFSはファイルシステム。
77 :
デフォルトの名無しさん :05/02/15 01:07:18
WinFSは未実装
WinFSが一番期待してたんだけど 次期Winに魅力が無くなってしもたよ(´・ω・`)
次世代ネタは次世代スレで
80 :
デフォルトの名無しさん :05/02/15 07:14:23
OSは2K、VB6+SP6で指定時間内の間、 インターネットを閲覧出来ないようなプログラムを作ろうと思っています。 ですが、どういう風にすれば「ネットが出来なくなる」かが、分かりません。 VBでは不可能でしょうか?
>>81 ExitWindowsEx(EWX_POWEROFF, 0)
>>81 モデム側で何とかすべきじゃね?
モデムを家電用のタイマーと連動させておくとか。
ケーブルを抜き差しするロボットアームを
やっぱしムリですかね? 子供のネットの時間規制かけたいと頼まれたもんで。 家電タイマーとかがついてると「あからさまに怪しい」って疑われるので、 それはパスしたいんですよ。 「夜はトラフィック込んでてつながりにくい~」と錯覚させるように、 こっそり忍ばせたいので。。。 ルータ越しに繋いでるんでLANボードの動作を停止させるとかでもいいんだけど、 実行中のプロセスだろうから止めれるのかな~とか。
そんなせこいことせずにきっぱりと親が子供に言い聞かせるべきだな
87 :
デフォルトの名無しさん :05/02/15 12:13:49
ポリシー(実体は多分レジストリ)の設定で インターネット接続の可否って決定できるような気はする。 再起動が必要な可能性はある。 また、めっせーじが「この操作は管理者によって禁止」 とか出ると思う。 あと、ネットワークデバイスを無効にするとか、 ぱっと思いついただけだが、やりようはナンボでもありそう。
pDevMode->dmCopies=100; hPrinterDC.CreateDC(~,pDevMode); StartDoc(hPrintedDC,~); hfont=CreateFont(1000,0,~); SelectObject(hPrinterDC, hfont); SetTextColor(hPrinterDC, RGB(255,0,0)); TextOut(hPrinterDC, 0, 0, "インターネットはX時からX時まで"); EndDoc(hPrinterDC);
>>85 >ルータ越しに繋いでるんでLANボードの動作を停止させるとかでもいいんだけど、
なら、デフォルトゲートウェイ消すとか
というか、その手のフィルタリングソフトって探せばいくらでもありそうな希ガス
90 :
デフォルトの名無しさん :05/02/15 12:21:26
インターネット設定で、ありえないプロキシを指定するとか。 IEだけ殺せればいいなら、コンパネのインターネット設定で 制御できる項目をいじるのが良い。 全部まとめてならTCP/IPの設定あたりがいいかな。
つーか、そう言うせこいことをやっててばれたら子供に嫌われる悪寒。 寧ろ、きちんと言い聞かせるなりして露骨にモデムの電源落とす方が躾にはなる。 勿論、頭ごなしに禁止するのが一番いかんのだが。
そう言う障害を乗り越えようと色々いじり倒して、将来の技術者が育つんだよ。
93 :
デフォルトの名無しさん :05/02/15 12:32:44
WinSock(orIPHelper)での話です。 自分のローカルIPはすぐに調べられたのですが、 グローバルIPはどのようにすれば調べられるのでしょうか? また、調べられた結果、火壁との兼ね合いはどうなるのでしょう? 宜しくお願いします。
意味不明
95 :
デフォルトの名無しさん :05/02/15 12:42:57
>>93 UPnP対応ルータからならとれる、はず。
自室にPCやTV、ゲーム機を与えないほうがいいよ。 引き篭もる動機を与えることになる。 ネットやPCが無かったら、引き篭もりなんか出来ないんだから。
ローカルIPアドレスは char ac[80]; gethostname(ac, sizeof(ac)); gethostbyname(ac); で調べられるのですが、グローバルIPアドレス(*1) (ルータのWAN側IPアドレス≠MACアドレス) はどうやって知ればいいのかが分かりません。 また知ることができたとしてもクライアントが*1でLAN外部から繋げた時 火壁が問答無用でメッセージを排除してしまうものなのでしょうか?
そういう形の接続でのWAN側アドレスは、一般的にはルータの設定画面から知るしかない HTTPなりtelnetなりでその画面を呼び出して解析汁 最後の文は相変わらず意味不明
サブクラス化したエディットコントロールにn個の要素を持つ配列aを 表示してるのですが、配列aのx番目の要素にフォーカスかキャレットが 来たのことを判別する方法はありますか?教えてください
100 :
デフォルトの名無しさん :05/02/15 13:05:14
>>97 だーかーらー、UPnP使わないと取得できないんだってば。
UPnP詳しいことは知らんけど。
それ以外の方法だと、グローバルにそういうサービス立てるか
ルータのWEB設定画面から返された文字列を解析とか
そういう汚い汎用性に欠ける方法しか思いつかん。
グローバルIPアドレスを入力してください というウィンドウを出す
>>97 OSが管理してない情報はAPIを使っても取得できません
tracertでたどる
104 :
81 :05/02/15 15:20:15
>>84 当初、NICを無効にするのもアリかなーって思ったんだけど、
それらしきやり方見つからなかったので。。。
>>90 インターネットの設定をレジストリで換えるってのはやってみたんですが、
IEを開いてる状態で、レジストリのほうのプロキシ換えても、
その最初に開いてるIEには反映されないんですよ。
>104 予言しよう そういう育て方するとガキは引きこもる うちの弟同じ事やられて切れて引きこもり中
>>104 >インターネットの設定をレジストリで換えるってのはやってみたんですが、
直接レジストリじゃなくて InternetSetOption 関数とか使うべきだろうね。
開いてるIEにまで適用されるかどうかは知らない。
うちの弟 = 自分 だけどな。
>>104 NICを無効にするなら、
INetConnectionのDisconnectとか
↓のAPIでゴソゴソやるとか
SetupDiGetClassDevs
SetupDiEnumDeviceInfo
SetupDiSetClassInstallParams
SetupDiCallClassInstaller
>>104 >IEを開いてる状態で、レジストリのほうのプロキシ換えても、
>その最初に開いてるIEには反映されないんですよ。
設定を変更するスクリプトをSYSTEM権限の
スタートアップサービスとかにすればいいじゃん
というかスレ違い
class thrbase{ protected: virtual unsigned WINAPI ThreadProc(void); public: static unsigned WINAPI ThreadCall(void* p); }; unsigned WINAPI thrbase::ThreadCall(void* p){ return reinterpret_cast<thrbase*>(p)->ThreadProc(); } unsigned WINAPI thrbase::ThreadProc(void){ return 0; } スレッド関数をメンバ化するために作った静的関数ThreadCallと、その処理内容ThreadProcが↑ そこでこのThreadProcをオーバーライドして使いまわしたいのです。 ThreadProcにvirtualをつけて継承しようとすると、ビルドは問題無く通るものの 実行してみるとUnhandled exceptionが出てうまく動きません。 どうか知恵を授けてぐたさい。
そこだけではわからん
FATAL ERROR: このスレの住人はC++が出来ません。
↓継承先のクラスです。 #include "stdafx.h" #include "thrbase.h" class potato : public thrbase{ unsigned WINAPI ThreadProc(void); }; unsigned WINAPI potato::ThreadProc(void){ MessageBox(0,TEXT("test"),0,MB_OK); return 0; } スレッドはWinMainから_beginthreadexで呼び出しています。 _beginthreadex(0, 0, &potato::ThreadCall, &dwID, 0, &dwID);
4番目の引数はそのスレッドオブジェクトのアドレスを渡すんじゃないの?
potatoのインスタンスをどこで渡しているのやら
beginthreadexの。
>>114-116 beginthreadexの方かっ。。。
…と言われてもすぐにわからないへたれなので今からマニュアルと格闘してきます。
ありがとうございます。
リソースファイルってどうやって埋め込むの?
リソースファイルは埋め込まない リソースファイルに基づいてリソースを埋め込む 何が知りたいかよく分からんが、 HELP hHelp; hHelp=Google( TEXT("リソーススクリプト") );
埋め込むのは梨花のお仕事
>>113 >beginthreadex(0, 0, &potato::ThreadCall, &dwID, 0, &dwID);
potato::ThreadCallに&がついとる。
(staticな)メンバ関数のアドレスは通常のC関数と同じく&いらんよ
beginthreadex(0, 0, potato::ThreadCall, &dwID, 0, &dwID);
でおk
WinAPIっつーよりC++の基本的問題というか
って全然おkじゃないや。
>>115 で指摘されてるけどインスタンス渡してないし。
C++の基本がわかってない予感が。
VC8からは&が必須になっている希ガス
Outlookのデータ(メールやアドレス帳)に外部アプリケーションからアクセスしようとすると
アクセス確認ダイアログが出てくるため、これを自動で「はい」ボタンを押してくれる
プログラムを作成しているのですが、下記のようなプログラムでうまくいきません。
ボタンを連打するとたまに反応する程度で、ループさせても閉じてくれません。
ほかにもWM_LBUTTONDOWN、WM_LBUTTONUPを使用したりALT+Yを送る等
しましたが、こちらの環境ではうまくいきませんでした。
なお、「いいえ(&N)」、「ヘルプ(&H)」に対しては正常に効きます。
ネットで調べてみたものの、ClickYesというアプリ(?)使用することで解決している人が多いようですが
自分で作成したいと思っているので、どなたか力を貸してもらえないでしょうか?
よろしくお願いします。
Express ClickYes
http://www.contextmagic.com/express-clickyes/
ソースです。 Private Sub Click_Yes() Dim wnd As Long Dim wndYes As Long wnd = FindWindow(vbNullString, "Microsoft Outlook") If wnd <> 0 Then wndYes = FindWindowEx(wnd, 0, "Button", "はい(&Y)") End If SendMessage ByVal wnd, ByVal WM_COMMAND, ByVal (BN_CLICKED * &H10000 + GetDlgCtrlID(wndYes)), wndYes End sub Private Sub Command_Click Call Click_Yes() End Sub 環境 OS :WinXP Pro 言語:VB6.0 その他:Outlook2000
127 :
デフォルトの名無しさん :05/02/15 21:51:39
CreateProcessで作成されるプロセスのメインスレッドに メモリマップトファイルで共有メモリをつくり、そこにアセンブラのコードを書き込んで、 それを実行させることはできますか? つまり ・メインスレッドの開始のアドレスを取得し、 ・そのアドレスのコードを書き換え、共有メモリのコードにジャンプさせ、 ・自分の関数を処理させた後、 ・再び開始アドレスに元のコードを戻し、 ・そこにジャンプさせる 開始アドレスの取り方とか、そのためのAPIとか、そういうことをやっているページとか、 ヒントをいただけないでしょうか。 よろしくお願いします。
出来ません
それはいやです。
MSDNに堂々と書いてあるけど?
132 :
デフォルトの名無しさん :05/02/16 00:03:20
>>81 俺ならネット関連のAPIをフックして常に失敗したことにする。
タスクトレイとかから見えなくするのに一工夫いるかもしれない。
結果報告です。 他プロセスのウィンドウへのSendMessage(パラメータでアドレスlpIntを渡す) について以下の2パターンを試したところ、1はNG、2はOKでした。 1.プロセス毎メモリ空間(0x04000000~0x41ffffff)の利用 lpIntLocal = (int *)API.HeapAlloc(ph1, API.HEAP_ZERO_MEMORY, 80);//メモリのアロケート hMyWnd = API.FindWindow (null, "Test"); //自ウィンドウハンドルの取得 ReturnValue = API.GetWindowThreadProcessId (hMyWnd, &hProc); //自プロセスハンドルの取得 lpInt = (int*)API.MapPtrToProcess(lpIntLocal, hProc); //他プロセス受け渡し可能なアドレスの取得 ※自プロセス以外を指定してMapPtrToProcessを実行するとエラー発生。 2.メモリマップファイル領域(0x42000000~0x7fffffff)の利用 hFileMap = API.CreateFileMapping (0xffffffff, 0, API.PAGE_READWRITE, 0, 80, 0); lpInt = (int*)API.MapViewOfFile (hFileMap, API.FILE_MAP_WRITE, 0, 0, 0);
目的のハンドルからWM_GETTEXTで文字は取得できるのですが EM_GETSELTEXTだと取得できません。なぜでしょうか?
解決しました
リッチエディットってエディットコントロールに比べて激烈に読み込み動作遅いんだけどなんで?
テキスト以外の情報も入ってるから
シャットダウンまであと何秒っていうダイアログあるじゃない あれってどうやってだすの?
ダイアログ
変数x←テキストデータ 変数xの中身をいじらないでエディットコントロールに転送したときに 等間隔(1文字おきとか)に空白入れる方法ありますか?教えてください
エディットコントロールに転送するときに 変数xの中身をいじらないで等間隔(1文字おきとか)に空白入れる方法ありますか? ってことかな? 変数yを作ってxをコピーしていじれば?
空白入れ・転送用の関数でも作ってローカルな変数で処理するとか?
やってることは
>>144 と同じようなもんだが。
>>143 なんかフラグをたてれば勝手にやってくれるといいなー
なーんて甘いことは考えてないよな
一文字ごとといっても、半角・全角は気をつけるように。
文字間の間隔をフォントの設定で変えれませんか?
強いて言うならSetTextCharacterExtraだろうか。
>>147 GDIを直接呼べばそういうこともできるが、ただのエディトコントロールにはそういう機能はない。
リッチエディットコントロールでならできるかもしれない。IEコンポーネントなら間違いなくできる。
どんどん敷居が上がっていく罠。
もうね、エディットコントロール作っちゃいなさいよ
継承
でもなんだかんだ言ったってスマートなやり方ではないけど、 1番最初に144が言っていた1文字おきに空白を入れる方法が1番楽。 Unicodeを使えば全角・半角を気にする必要も無い。 std::vector<WCHAR>やstd::wostringstreamも便利。
Unicodeでも2文字で一文字表すのなかったっけ?
>>153 どんなエンコーディングルールでも、「2文字で1文字表す」ってのはまず無いと思う。
2バイトで1文字とか、2ワードで1文字とかならともかく。
156 :
デフォルトの名無しさん :05/02/16 22:09:58
サロゲートペアがあるだろ。
>>153 サロゲートのこと?
現在のところ、日本語にサロゲートを使う文字は
存在しなかったと思う・・・。
将来的にはわからんが。
×エディットコントロール ○エジットコントロール
それを突き詰めていくとこうなるわけで ×エディットコントロール ×エジットコントロール ○EditControl
サロゲートではなくて寧ろ結合文字では? 実装がどうなってるのかはしらんが。
>>156 「吉」の上が「土」になってるやつは、UTF-16だとサロゲートペアになるようだけど、
これはD840+DFB7の2ワードで1文字を表しているわけで、別に2文字なわけではない。
WH_GETMESSAGEのフックで取得したメッセージを ウィンドウプロシージャに渡す前に破棄したいのですが どうすればいいんでしょうか? 今はメッセージをWM_NULLに書き換えることで対処しています。
その場でreturnしたらまずい理由でもあるのか?
>>162 CallNextHookEx呼ばすにreturnしとけば?
WH_GETMESSAGEの場合は、その場でreturnしても メッセージは流れてしまいます。 後ろのフックには処理が渡らないので、Spy++からは 見えなくなりますが。
フックで対象ウィンドウのプロセスにDLL突っ込んでそこからサブクラス化、とか。
既に別の目的でサブクラス化はしているのですが、そのアプリケーションでは 目的のメッセージ(WM_SYSKEYDOWN)は元々ウィンドウプロシージャには 渡さずにメッセージループ内で処理しているようです。 なので、PeekMessageの段階でキューからそのメッセージだけを直接的に 削除する手段はないかと探していたのですが、どうもWM_NULLに置き換える という方法が一般的なようです。 以下、CodoGuruのWM_NULLの説明より WM_NULL also is used to filter messages in the WH_GETMESSAGE hook. Returning 0 from a hook does not prevent you from processing a message. Replacing a message with WM_NULL will filter the message properly.
教えてください。 msecのウエイトってどうやってやればいいんですか? 該当するAPIってあるんですか?
>>169 元スレに断らずに移動するような香具師には教える気はありません。
つーか、MSDN位読めや。
>>170 それはスイマセンでした。
MSDN読んでも分からないので教えて下さい。
読んでも分からないやつに教えても無駄だと思われ どこを読んでいいか分からないなら別だろうけどな
SetTimerを使えばいいんですかねぇ~? マイコン関連だとウエイト関数が用意されているんで、使い方が 良く分からないんです。
わりと最近同じような質問見たけどな。 とりあえずウェイトしたい時間と要求する精度をはっきりさせれ。
それほど精度を問わないなら既に>170に答えがある罠。
>>174 目的は、_outp()を使ってパラレルポートから通信用のパルス信号を出力したいんですが、
パルス幅を作る為にウエイトしたいんです。パルスは"L"が4.7us、"H"が4.0usです。
パルスの出力方法として、具体的に他の方法があるのでしたら教えて下さい。
Windowsアプリからそんなに正確に出せるか甚だ疑問だな。 ミリ秒だって不安なのに・・・
Sleep(0)でぶん回してパフォーマンスカウンタで経過時間確認するしか思いつかん
パフォーマンスカウンタがずれる場合があるからなぁ。
パフォーマンスカウンタがずれたのではなく、 ユーザの計時関数呼び出しの間隔がずれただけではないか? そもそもどうやってCPUのカウンタがずれたと確認するのかと小一時間
・・・アホ過ぎる。文系臭漂いまくりだな。 己自身に絶対価値を付与するあたりが、まるで朝日新聞のようだ。
98年頃のMSJにus単位の正確なウェイトを実現する方法が載ってたな。 あの雑誌は凄く面白かったから、今でも全巻欲しいと思ってる。 英語版ならWebでも読めるが。 っていうか、その精度のウェイトを求めるなら、間にPICとかを挟んで そっちに制御させるべき。
<vector>インクルードしたらエラーでるんだけど何で?
>>188 スレ違い。
VCスレででも聞け。
まぁ恐らくはCでコンパイルしようとしているか警告が出ただけじゃないかとは思うのだが。
GetGlyphOutlineで文字"列"を描画しようとしているのですが、 GetGlyphOutlineW(Unicode)をGGO_GRAY8_BITMAPでコールしたとき、ホワイトスペース系の 文字はGLYPHMETRICSのgmBlackBoxXおよびgmBlackBoxYに実際の幅が入りません。 ですからスペースだけは別にGetTextExtentPoint32で幅を取りにゆく方法もありますが、 本当にそうやって幅を取得すべき文字は半角/全角スペースだけでよいのか、わかりません。 すばらしい解決策がありましたら、ご享受願います。 あ、gmCellIncXでいいのか、事故解決しました。スマソ。
>>190 自己解決してるようだが補足しておくと、gmBlackBoxXとgmBlackBoxYは
文字の大きさじゃないぞ。
文字を表すピクセルを囲む最小限の矩形の大きさだ。
だからスペースのようにピクセルが存在しないものは0になる。
文字送りはスペースに限らずgmCellIncXとgmCellIncYで行う。
BlackBoxで文字進めてたら、「---」が直線になっちゃうわな。
194 :
74 :05/02/18 01:24:31
>>80 いろいろ悩んでみたんですが、どうも自己解決できません。
小細工するのでしょうか?厨でスマソ
>>194 80じゃないし想像ですまんが
コールバック関数使ってBFFM_INITIALIZEDのときにMoveWindowで動かしてやればいいと思う
196 :
sage :05/02/18 11:17:02
WindowsXPで、 SystemParametersInfo(SPI_SETNonClientMetrics 0, &NonClientMetrics, SPIF_UPDATEINIFILE or SPIF_SENDWININICHANGE ); とすると、タイトルバーの縦サイズがWindows2000等よりも大きい為に、 タスクトレイのアイコンが勝手に大きくなってしまいます。 WindowsXPのタイトルバー縦サイズ・・・25 Windows2000のタイトルバー縦サイズ・・・18 SystemParametersInfoを設定しても、アイコンが大きくならないようにする方法を ご存知でしたら教えて頂けないでしょうか。 よろしくお願いいたします。
win32APIをつかったプログラムに自作のクラスを使いたいんですが どうしたらいいでしょうか? 構造体とかC++だと使えないからPOINTとか使えないと思うんですが WinMainとかプロシージャ-とかはそのまま使えますか?
??わけわかめ
>>197 C++でも構造体は使える。
それどころかstructとclassの違いはデフォルトでpublicかprivateか、それだけ。
structって、継承できたっけ?
MFCとか、class CPoint : public tagPOINT{...}; なんてことを平気でやってるな。
どうも何か勘違いしていたようなんで出直してきます;
203 :
デフォルトの名無しさん :05/02/18 19:06:58
206 :
デフォルトの名無しさん :05/02/18 20:49:09
207 :
デフォルトの名無しさん :05/02/18 20:54:14
いくらまで出せるんだ?
>>206 どもです。
リソースファイルにでも書き込んでおきます。
>>205 midiOutShortMsgで音源にプログラムチェンジメッセージ送るだけじゃないのか?
楽器の名前はGM規格準拠の音源なら0から127まで楽器の配置は決まってる。
>>210 >楽器の名前一覧を取得するAPIはありますか?
質問なんですが、今複数の画像を読み込みなんかも描画する物を作ってます。 画像の描画なんですが、普通 a = (HBITMAP)LoadImage(NULL, "test.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE); b = (HBITMAP)LoadImage(NULL, "test1.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE); c = (HBITMAP)LoadImage(NULL, "test2.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE); と読み込んで SelectObject(hMemDC, a); BitBlt(hdc, 0, 0, 100 100, hMemDC, 0, 0, SRCCOPY); SelectObject(hMemDC, b); BitBlt(hdc, 0, 0, 100, 100, hMemDC, 0, 0, SRCCOPY); SelectObject(hMemDC, c); BitBlt(hdc, 0, 0, 100, 100, hMemDC, 0, 0, SRCCOPY); みたいな感じで描画するみたいですが、 a = ( HBITMAP )LoadImage( NULL , "test.bmp" , IMAGE_BITMAP , 0 , 0 , LR_LOADFROMFILE | LR_CREATEDIBSECTION ); SelectObject(BhMemDC, a); BitBlt(hdc, 0, 0, 100, 100, hMemDC, 0, 0, SRCCOPY); a = ( HBITMAP )LoadImage( NULL , "test1.bmp" , IMAGE_BITMAP , 0 , 0 , LR_LOADFROMFILE | LR_CREATEDIBSECTION ); SelectObject(BhMemDC, a); BitBlt(hdc, 0, 0, 100, 100, hMemDC, 0, 0, SRCCOPY); a = ( HBITMAP )LoadImage( NULL , "test2.bmp" , IMAGE_BITMAP , 0 , 0 , LR_LOADFROMFILE | LR_CREATEDIBSECTION ); SelectObject(BhMemDC, a); BitBlt(hdc, 0, 0, 100, 100, hMemDC, 0, 0, SRCCOPY); みたいな感じで描画してはいけないのでしょうか? 処理速度などはどうなのですか? 分かる方お願いします。
別に、その方法でも良いし 処理速度は、ほとんど変わらないけど… DeleteObjectしたり、SelectObjectで 戻ってきた値をSelectObjectしなおしたり しなくても良いのか?
216 :
デフォルトの名無しさん :05/02/19 10:35:27
ペンやブラシの色を問わず背景の反転色で描画したいときは SetROP2 で R2_NOT を指定すればいいことを知ったのですが Rectangle などの図形描画には使えるのですが DrawText などの文字描画では色が反転されません。 反転色で文字列を描くにはどうすればいいのでしょうか。
OPAQ
>>214 ども^^
下の方法だと時間がたつにつれ重くなったんで・・・・
原因はなにかなと思って聞いてみました。
そりゃGDIオブジェクト解放せずにだだ漏れさせてりゃ重くもなるわな。
解放って、最後に ReleaseDC(hwnd,work_hdc); DeleteDC(BhMemDC); DeleteObject(Bitmap); みたいな感じに書くんですよね?
WNDCLASSEX構造体のlpszClassNameってなんでしょう?
LPSZ型の変数
>>222 ごめんなさい、質問の仕方がまずかったですね
WNDCLASSEX構造体のlpszClassNameってプログラム中ではどういった働きをするんですか?
あと、普通はどういう内容にするのでしょう?
(アプリ名)MainWindowClass みたいにしておくと、外部プロセスからアプリを探すときに 楽かもしれんね。
>>220 考え方としてはそう。
わかってると思うけど、その三行だけでは、213に書かれた内容に対応したものにはならないから
とりあえずタスクマネージャのGDIオブジェクトの列を出しておくと、わかりやすいよ
>>221 CreateWindow(Ex)で使うだろ。
と言う俺もアトム派。
228 :
デフォルトの名無しさん :05/02/19 13:42:50
>>225 そうなんですか?
一応GDIオブジェクトの列を表示にしましたが、どれがそうなのかワカラナイです^^;
なにが足りないのでしょうか?
センス
GDIオブジェクトの列分かりました^^ 凄い勢いであがていきます・・・・
エディットボックスでENTERキーを押すとポーンとエラー音が出るのを止める にはどうしたらいいんですか?
>>228 214さんがサラリとかいてあるのだが・・・
作ったオブジェクトは、SelectObjectしたままでは消せない。
ので、
一番最初にSelectObjectしたときの返り値を保存しておく(*)。
消すときには、保存しておいたものをSelectObjectし、
作ったオブジェクトは、全部Selectされてない状態にする。
そうしてから消す。
*返り値に何が入ってるかはちゃんと勉強しておいてね
しかし、きちんと消してないなら
213の上も下もGDIが酷いことになりそうな気がするんだが・・・
解決しちゃいますたごめんなさいorz
236 :
デフォルトの名無しさん :05/02/19 17:04:31
CreateProcessでターゲットプロセスのメインスレッドが WinMainやmainなどのエントリーポイントに突入するところでフックするには どうすればよいでしょう?
カーネルサンダースおじさんを襲う
同じプログラムを複数個起動している際にそれぞれのウインドウハンドルを取得したいのですが、 FindWindowで取得しようとすると必ず後に起動したウインドウハンドルしか取得してくれないのですが、 このような場合はどのようにしたら良いのでしょうか?
>>239 ありがとうございます。便利な関数あるもんですね・・・
FindWindowExでもよくね?
>>243 242じゃないが、どんな問題があり得ます?
>>244 FindWindowExの仕様がGetWindowに似てるから
>>245 なるほど、こういうのですね……。ありがとうございました。
>すべての子ウィンドウを取得する場合、EnumChildWindows 関数を使った方が
>GetWindow 関数をループ処理で呼び出すよりも信頼性の高い結果が得られます。
>GetWindow 関数を呼び出してウィンドウを列挙すると、無限ループに陥ったり、
>すでに破棄されているウィンドウのハンドルを参照する危険性がでてきます。
>>241 便利と思えるとはある意味幸せな人だ。
ウィンドウ間・プロセス間で協調しなければならないマルチタスクOSなら
こういう関数が当たり前に提供されていなければ、
話にならない気がするがどうだろうか?
どうでしょう?
当たり前のものが当たり前にあるから便利なんだろうと思う。 あるはずのものが無かったりするとイライラする。 特にVBとか使ってるとそう思う。
252 :
デフォルトの名無しさん :05/02/19 21:59:14
Spy++のように他のアプリケーションが送受信しているメッセージをロギングするには どうすればいいんでしょうか? SetWindowsHookEx を使ってもうまくいかないんだけど
なにがどううまくいかないのか書かなければ 「お前がヘボいからだ」 としか言いようがないわけだが。
DLLを作ろうとしています。これはAveDeskというソフトのプラグインです。 void CALLBACK DeskletSetStatic(HWND hwndDesklet, bool staticValue) { typedef void (CALLBACK *DUMMY)(HWND,bool); DUMMY HDeskletSetStatic = (DUMMY) GetProcAddress(GetModuleHandle(0),"DeskletSetStatic"); if(!HDeskletSetStatic)return; HDeskletSetStatic(hwndDesklet,staticValue); } というコードがあるんですけど、 これっていったん呼び出されたら、永遠にループしちゃうんじゃないでしょうか?? ここはどんな処理をしてるのかサッパリです。詳しい方教えてください。よろしくお願いします。
なんでだよ。 まずちゃんとC言語勉強してから作れ。
わかった~~!! このDeskletSetStaticという関数がDLLの呼び出し側(AveDesk) にあるんだきっと。 それで、ここでは逆にDLLから本体の関数を呼び出してるんだ。
GetProcAddress GetModuleHandle(0) しらべれば簡単にわかることなのにな。
>>252 大方フック部分をDLLにしてない or しててもそのDLLとアプリ間でデータのやりとりができていないに一票。
>>157 1999年からタイムスリップしてきましたか?
>>261 02/16からタイムスリップしてきましたか?
263 :
デフォルトの名無しさん :05/02/20 13:46:56
シンボルコードって自分で指定しちゃだめかな? 例えると リソースファイルに "新規作成" IDM_NEW とかさ
質問です。 デスクトップアイコンすべてを表示/非表示するプログラムを作ろうと 思っているのですが、手がかりがいまいちつかめません。 動作としてましては、 ディスクトップのなにも無いところで右クリック->[アイコンの整列]->[ディスクトップアイコンの表示] で出来るのと同じことを、プログラムからしたいのです。 MSDNのSystemParametersInfoを呼んでみたのですが、それらしいものが 見つかりませんでした。 検索するとディスクトップのアイコンの表示や非表示するソフトは結構あるみたいでしたが、コードに ついては見つけることが出来ませんでした。 キーワードやサイト等、なにか手がかりを教えていただけませんでしょうか。
>ディスクトップ ハードディスク上ってこと?
ツマんない突っ込みすんなよ。オレモナー。
>>265 いえ、実際には存在しますが、デスクトップ画面には表示されないということです。
本当に消去するわけではありません。
ディスクトップ画面にはなにもアイコンは表示されない、
でも、エクスプローラでデスクトップフォルダをのぞくとちゃんと表示されるという状態です。
単純に壁紙が、ディックトップの前面に出てきて、アイコンが隠れてしまうようなイメージですかね。
ちゃんと回答できているか自身ありませんが、私がしようとしている動作は上記のようになります。
×ディスクトップ ○デスクトップ(desktop)
>>264 >検索するとディスクトップのアイコンの表示や非表示するソフトは結構あるみたいでしたが
そのソフトがどうやってるのかSpy++で見ればわかるかもね。
やったこと無いけど、ウィンドウを最下面に配置してPaintDesktopで壁紙描画すればそれらしくなるんじゃない?
レジストリ変更一箇所するだけだろ?
>>267 こんなもんでどう?検証で書いたからそのまま載せる。
HWND hWnd = NULL;
hWnd = ::FindWindow( "Progman", "Program Manager" );
hWnd = ::GetTopWindow( hWnd );
hWnd = ::GetTopWindow( hWnd );
::ShowWindow( hWnd, SW_HIDE ); // to hide
// ::ShowWindow( hWnd, SW_SHOW ); // to show
あとは、SPYで該当ウィンドウの意味を調べて自分なりにアレンジしてくらさい。
一応参考までに、「ひょっとしたら」IActiveDesktop とかから 何かごにょごにょやるのが正統な方法なのかもしれないけど、 ちょっとそっちは見つけられなかった。
>>269 そうですね、一度ソフトを落として、メッセージを見てみます。
>>270 レジストリを操作した場合、OSの再起動が必要になるんですよね。
再起動は出来るだけ避けたいと思っています。
>>271 ありがとうございます、早速ためさせていただきます。
とりあえず場所はここのようです HKEY_CURRENT_USER Software Microsoft Windows CurrentVersion Explorer Advanced HideIcons
>>267 素晴らしい。
>ディスクトップ
>デスクトップ
>ディックトップ
278 :
デフォルトの名無しさん :05/02/20 16:07:26
>>271 ありがとうございました。
いただきましたコードで動作しました。
あと、受け取りましたコードでハイドし、
[アイコンの整列]->[デスクトップアイコンの表示](正当な手順)で
Showすることができました。多分、同じしかけなのではないかと思います。
>一応参考までに、「ひょっとしたら」IActiveDesktop とかから
>何かごにょごにょやるのが正統な方法なのかもしれないけど、
>ちょっとそっちは見つけられなかった。
そうですね、頂きました、コードで表示をHIDEしても、OS側は内部でSHOWされてると
思ってるみたいです。どこかに、OSの記憶する内部状態と同期がとれるコードがあり
そうです。
基本的に、271さんに頂いたコードで、動作としては、ぜんぜんOKです。
使わせていただきます、本当にありがとうございました。
>>274 すみません、私が無知でした。
気分をがいされたかもしれませんが、私の不勉強でした
申し訳ございませんでした。そして、ありがとうございました。
>>278 っていうかその方法だと再起動したらまた出てくるんじゃない?
>>279 あーそう言えばそうですわ。
>>276 のレジストリ変更して SHChangeNotify でも投げてやるのが
いいかもしれないです…。
dick 1 《米古風》探偵,刑事,「でか」 a private ~ 私立探偵. 2 《俗》間抜け,やつ. 3 《俗》ペニス.
エクスプローラにボタンやツールバーを追加するのってどうやるんでしょうか。 上手く説明出来ませんが、Norton AntiVirusがやってるようなやつです。 IEにボタンを追加するのならレジストリいじれば出来るようでしたが、 作りたいのはファイルのリネームツールとかでして…。
>>282 多分、シェル拡張(shell extension)
MSDN読んだ?
読みました。でもそれらしき物が見つかりません。 単純なAPIは用意されておらずメモリ解析などしているんだと思いますが?
>>286 sysinternalsに行ってみれば?
>283 ありがとう。 ググってみたらそれっぽいサイト見つけたので、のんびり調べてみます。
>>287 失礼ですが、何か知っていて言っているんですか?
それとも何も知らないけど、とりあえず
MSDNやsysinternalsにあるかもと言っているだけなんですか?
とりあえずdependsでも使ってみたらどうか。
debugとreleaseってどう使い分けるのですか?
ありえないような場所をHeapFreeするのは危険? 例えばHeapFree(GetProcessHeap(),0,NULL);みたいにNULLポインタを渡すとか。 ただ単にエラーが返ってくるだけならいいが何か実害出たりしない?
>>295 GetLastError() で試してみれば?
アイコンリソースってどのサイズまでOK? Windowsに最初からあるのは48×48があるみたいだけど Windowsのバージョンとかで変わってきたりする?
WM_CHARを使って、zが押された時に処理するプログラムを作りたいんですけどどうすればいいのですか? switch(msg) { case WM_CHAR switch(wParam) case ? ?の部分が分かりません・・・・
z
zだとエラーが出ます。
'z'
それだと、反応無しです
'z'と'Z'は違うぞ?
switch(msg) { case WM_CHAR: switch(wParam) { case 'Z': case 'z': case '\x1A': あと適当に } }
なぜ、ctrl-z・・・
いや・・・いらんだろ
ctrl-z は orz に似てるとオモタ
恥を偲んでお尋ねします "DWORD_PTR"ってどのインクルードファイルで定義されてるのでしょうか・・・ DX9SDKのDirectsoundを使うとき、windows.h、mmsystem.h、mmreg.h、dsound.hを インクルードしたのですが、ビルド時に"DWORD_PTR"型が定義されてないと 怒られます 名前の通り*DWORDなんでしょうけど自分で定義するのもなんだし DirectX7のdirectsoundはこれだけで通ったような気もするんだけどな・・・ 依存関係がわかんねぇよウワァァァン
313 :
デフォルトの名無しさん :05/02/21 12:05:07
まぁ、
>>311 のbasetsd.hにはDWORD_PTRは定義されてないけどね。
PlatformSDKをいれてインクルードパス(優先順位に注意)通せば良いと思うよ。
>>311 grepやfindが出来ないエディタ使ってるのか?
Basetsd.hには定義されてないようです 今PlatformSDKをインスコしております(PCがクソ遅くて眩暈) なんかVC4+DX7とは勝手が違ってさっぱりだ…
317 :
デフォルトの名無しさん :05/02/21 13:05:08
>>316 念のため書くけど、
PlatformSDKのBasetsd.hには定義されてて、
Basetsd.hはwindows.hをインクルードすればインクルードされるから、
#include <basetsd.h>とか書く必要ないからな。
>>311 DWORD_PTR は>.311の想像とはまったく違っていて、「DWORDと何かへのポインタの両方を
情報の欠落無しに納めることの出来る整数」のこと。Win32 では普通のDWORDとほぼ同じ。
他にもLONG_PTRとか似たようなものがある。
LPDWORD
色々とマリガトウございます
>>317 つまりまずはPlatformSDKを入れねばならんという事ですな…
>>318 盛大に勘違いしてますた('A`)
今PlatformSDKをインスコしてサーチパスを登録してビルドしたらエラー数が100を超えて中断しますた
もうだめぽ
PlatformSDKについてもうちょっと調べてみます
挫折の悪寒 なんでこんなに複雑になってんだyo…
<dsound.h>の前に<dplay.h>をインクルードしたらコンパイル通ったりしない?
あ、
>>322 のは、あくまで
#define DWORD_PTR DWORD
が定義されているヘッダファイルについて書いただけね。
なんか、話が違ってきてるみたい。
ヾ(゚∀。)ノシ
時代の流れについていけなくなりますた
そもそもPlatformSDKってなんだよ
>>323 駄目ですた
LoadStringで文字列が切れた(バッファが足りない)ことを検出する方法はないのでしょうか?
>>325 MFCやWTLのCString::LoadString()では
戻り値とバッファのサイズであれこれやってるね
>>325 MSDN の記述。
>関数が成功すると、バッファにコピーされたバイト数 (ANSI 版) または文字数 (Unicode 版) が返ります
>(終端の NULL は含まない) 。
(…NULL とか間抜けな事が書いてあるが、そこは目を瞑って)
切り捨てられていなければ、
戻り値 < nBufferMax
のはず。
328 :
デフォルトの名無しさん :05/02/21 17:08:55
>>325 バッファに1文字以上(1バイトじゃないよ)の余地があること。
マルチバイトならGetCPInfoで1文字の最大バイト数を調べる。
S-JISなら、\0の後に2バイト以上の余地があることを確認する。
でいいと思う。
たしかLoadStringは、最後の全角文字が分割されそうなときは先行バイトもロードしない。
だから\0の後方に1バイトの余地があるからといって、全体がロードできた証拠にはならない。
まぁ、最初から大き目のバッファ用意して、 そもそも切捨てが起こらないようにした方がいいよ。
>>324 ダメってのは、dplay.hには宣言されてないのか?
上の質問では、その変数が定義されてないって質問しかしてないから、変化があったのに知らせないと誰も助けてくれないよ
まぁ、DirectSoundに関する質問ならスレ違いだけどね
(DX質問スレの方)
332 :
デフォルトの名無しさん :05/02/21 18:57:51
ツールバーで、始めからモッコリしているのではなく、 マウスポインタが上に来た時にモッコリさせるやり方、 または検索する為のキーワードを教えてください。
TBSTYLE_FLAT
>>333 色が白に変わってしまいますが(透けて親ウィンドウが見えている?)、
オンザモッコリは出来ている模様です。
ありがとうございました。
色が変わってしまう部分も、対処法が分かりましたらご報告します。
まあ漏れなんか彼女と会う前からモッコリしてるけどな。
猫に乗っていましたが、以下のように後から設定するとうまくいきました。
LONG lStyle;
lStyle = GetWindowLong(hToolWnd, GWL_STYLE);
lStyle |= TBSTYLE_FLAT;
SetWindowLong(hToolWnd, GWL_STYLE, lStyle);
>>335 私も若かりし時(10代)はそういう事もありました。
>>306 そのコード打ったのですが、なにも起こらないです・・・・・
>>337 そりゃ、自分で何もしなければ何も起きない
TB_MOKKORI
DWebBrowserEvents2::OnQuitはどういうときに呼び出されるのでしょうか? ホストウインドウ(AtlAxWin)をDestroyWindowしても呼び出されません。
>>340 OutProcでIE(など)を開き、それがユーザ操作で終了したとき。
開くとこまではこんなソース。
↓
CLSIDFromProgID(L"InternetExplorer.Application", &clsid);
CoCreateInstance(clsid, NULL, CLSCTX_ALL,IID_IUnknown, (LPVOID *)&pUnknown);
340 分かりました、ありがとうございます。 自分のアプリケーションへの埋め込みブラウザの場合、IEと同様な動作を期待するなら適切なタイミングで自分で発行してやるってことですね?
デバイスコンテキストに描画する座標を指定できるapiはありますか
何言ってんだかわからない。MSDNでも開け。ぐぐってさえもいないだろう。
香ばしいな
デブが何か言ってますよw
香ばしいな
アロエリーナ
自前アプリに埋め込んだウェブブラウザの画像読み込みを抑止する方法がわかりません ざっと検索した範囲だと、ホストから実装して、Invokeをオーバーライドするみたいな事が書いてあるようなのですが、 CAxWindow::SetExternalDispatchで外部ディスパッチを指定すれば そこでダウンロードコントロールをいじれるんじゃないかなという気がして試してみたいのですが、、 ここで必要なディスパッチインターフェイスをどうやって用意するべきか分かりません。 何か良いサンプルはありませんか?
MFCスレ行くか?
円を描くには、Ellipseですが、これだと外枠しか描かれません。 円の内側を描くようにするためには、どのAPIをつかえばいいのでしょうか?
>>357 Ellipse
Ellipse
1 個の楕円を描画します。
指定された外接長方形の中心が楕円の中心になります。
現在のペンを使って楕円を描画し、現在のブラシを使って塗りつぶします。
MSDN読まない奴大杉
WS_POPUPとして、メニューもどきなウィンドウを作って(自作)表示させたのですが、 CreateMenuで表示されるWindowsデフォルトのメニューとは違い、以下の問題が浮上しました。 ・メニューを消す際に、一瞬、親のウィンドウが非アクティブに切り替わる。(その後、アクティブに戻る) ・他のメニューに切り替える時、メニューをSW_HIDEして消しますが、CreateMenuで作成されたMenuをHideする時のように綺麗に消えてくれない。 解決法がわかるかたいらっしゃいますか?
>>360 CreatePopupMenu()
TrackPopupMenu()
辺りを使用し、メニューもどきではなく、
ちゃんとしたメニューを生成・表示する。
>>361 いえ、それはわかっているのですが、
あくまで自作のメニューを表示させたいので、
CreatePopupMenu内部でどのようにコードが組まれているのかが知りたいですね。
先頭はあれだ。消す前にSetFocusでおやにフォーカスを戻せ。 後者はあれだ。きれいに消える、が何を意味しているのかによる。 ひょっとするとAnimateWindowで解決するかもしれない。
>>362 何故、「自作メニューもどき」にこだわるのか?
wineのソース見てみるとか
>>360 最近のメニューはカスタムドローでDirectXのSurfaceのGDIを渡してくる
らしきところからおそらくLayered Windowになってると思う。
カスタムドローした方が楽だと思うけど。
何ならメニューアイテム1個で中は自由に描いてもいいし。
STARTUPINFO si; を宣言すると エラーC2275 'identifier' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。 発生してしまうんですけど、どうしたら良いのでしょうか?
>>367 エラー発生行はその行で間違いないか?
あと、もうちょっと前後のコード晒せ。
>>368 間違いないです
//コメントアウトするとちゃんと通るので
エラーは こうでした
C:\My Documents\ABC\a.c(87) : error C2275: 'STARTUPINFO' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。
c:\program files\microsoft visual studio\vc98\include\winbase.h(3818) : 'STARTUPINFO' の宣言を確認してください。
C:\My Documents\ABC\a.c(87) : error C2146: 構文エラー : ';' が、識別子 'si' の前に必要です。
C:\My Documents\ABC\a.c(87) : error C2065: 'si' : 定義されていない識別子です。
>>369 その上の行あたりが間違ってると思うよ。
分かりました こうなんですけど int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { MSG msg; hINSTANCE = hCurInst; STARTUPINFO si; //STARTUPINFO si; ← こうすると通りますけど if (!InitApp(hCurInst)) return FALSE; if (!InitInstance(hCurInst, nCmdShow)) return FALSE; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }
373 :
デフォルトの名無しさん :05/02/22 23:03:05
ネットワークプログラミング板で質問したのですが、
スレ違いだったと指摘を受けたので、こちらで質問させていただきます。
ttp://www.geocities.jp/wininet_dll_jp/ このHPをサンプルに使って、WinInetでPOST処理を作ってみたのですが、
POSTのボディ部をPHPの受信側が受け取りません。
パケットキャプチャしてみた結果では、ボディ部はちゃんと
送信していました。
同様にPHPで作った送信PGでPOSTしてみて、
結果ではうまく値がわたったので、受信側はうまく動いていると思います。
どうやれば、受信部のPHPで受け取ってくれるようになるのでしょうか?
どうぞよろしくお願い致します。
文字セットとかはちゃんとあってるのか? つうか、ソースをちょっとは晒せ。 超能力者じゃねぇんだから。
>>372 もしかして、拡張子.cにしてないか?
宣言と文の混在はc++の仕様だぞ
今いろいろ調べていたんですが
どうしても分かりませんでした
>>375 言われたとうり a.c ファイルで *.cだったので
a.cppにしたら通るようになりました
どうも、ありがとうございます m(ヽ)m
( ゚д゚)ポカーン
> STARTUPINFO si; //STARTUPINFO si; ← こうすると通りますけど なにか違うか?
>>378 STARTUPINFO si;
をコメントアウトしたらって意味じゃね?
beginpaintでエディットコントロールのハンドルからDCを取得して textoutで描画してもキー入力を受け付けません。受け付けるようにするにはどうしたらいいですか?
できました。すいません
エディットコントロールを自作したいのですがどうすればいいですか?
やっぱりいいです
フォトショッをプ自作したいのですがどうすればいいですか?
やっぱりいいです
388 :
386 :05/02/23 04:33:33
できました。すいません
あんまりオモロナイ
ウィンドウAの上にウィンドウBとCが並んで表示されています。 ウィンドウCにはスクロールバーはありません。 ウィンドウBをスクロールさせるとウィンドウCもスクロールするようにしたいのですがどうすればいいですか?
391 :
デフォルトの名無しさん :05/02/23 09:34:45
>>374 ソースは基本的にリンク先のコードそのままで、
プロキシ対応の処理などを追加しただけです。
貼っても長いし、インデント崩れてみにくいので…
送信先がPHP以外のものなら、POSTできてるので、
文字セットはあっているとおもいます。
>>390 ウィンドウBで WM_XSCROLL が呼ばれたらそこで
ウィンドウBとウィンドウCに再描画命令を送ればいいんでないかい?
ウィンドウCの描画でウィンドウBのスクロール情報を
使ってはならない規則などないからな。
再描画したところで全く意味はありません。 ↓次の解決策をどうぞ
393==386
というか 393==390 じゃないのか?あまりにも失礼じゃないか? ウィンドウB,Cが自分で定義したウィンドウなら WM_PAINT でスクロール情報をもとに描画すればスクロールは実現するだろ? ウィンドウズ定義のコントロールだったら、そのくらい質問でちゃんと書いとけよ。 教える気が萎えた。
397 :
デフォルトの名無しさん :05/02/23 13:01:08
自己解決しました。
TrueTypeフォントを斜体にしたときのオーバーハング値って取れますか? GetTextMetrics/GetOutlineTextMetricsじゃだめっぽいんです。
リストビューの項目を一時的に隠すことが可能でしょうか?
>>398 GetTextExtentPoint32
オーバーハングって分からんが
斜体にした時としない時の差?
>>400 >斜体にした時としない時の差?
です。
GetTextExtentPoint32も試してみますー
402 :
デフォルトの名無しさん :05/02/23 23:15:43
Win2000orWinXPですがntdll.dllがマップされる仮想アドレス空間でのアドレスは 常に同じですか?kernel32.dllは同じだそうですが。 なぜかというとクラッシュが起きてデバッガが起動し、呼び出し履歴を見ると ntdllの中でクラッシュしてるのですがそこが何なのか知りたいのです。 でもそのプロセス内で何処にロードされたかは今となっては後の祭りで分らないんです。 よろしくお願いします。
>>402 悪いのはntdllじゃなくて、もまいのプログラム。
まちがいない。
自作クラスをCreateWindowで複数作ったのですが、staticの部分が共通化されてしまいます。 それぞれのクラスごとにデータを保持していて欲しいのですが、こういう場合は普通どうしていますか?
>>404 それぞれのウィンドウごとにデータを保持していて欲しい、です。
「自作クラス」が何のことやらよくわからんが、SetPropやSetWindowLongじゃだめなんか? C++のクラスって事ならstaticじゃ無くすればいいだけだな。
GetWindowLongPtr SetProp
>>406 WNDCLASSEXをRegisterClassExで登録したもので、そのうちの、プロシージャ部についての話です。
例えば、HBITMAPの形で画像を保持しておいても、
staticだと別ウィンドウ向けに登録したものに変更されてしまい、全てのウィンドウが同じ画像になってしまいます。
今から、その2つについて調べてみます。
そもそも、なんでstaticにしたのだ?
410 :
デフォルトの名無しさん :05/02/24 05:04:18
>>404 =408
GetWindowLong の GWL_USERDATA か
もしくは拡張ウィンドウメモリを使え。
どっちも GetWindowLong に載ってる。
というかお前の404の日本語は下手過ぎ。読む側のことも考えろ。
(´-`).。oO(っていうか407が微妙に答えてるじゃん。でも GetWindowLongPtr ってなんだ?)
(´-`).。oO(インクルードディレクトリ探しても見つからなかったから誤植かとオモタ、スマソ)
thisポインタをどっかに保存して 共通部分になってるウィンドウプロシジャーのメソッドから それぞれのクラスのメソッドをthisポインタを介して参照する 保存場所については散々でてるしいいな
SetTimer関数を使って定期的に画面を更新したいんですが、画面が更新されません。 ウインドウ作成時に SetTimer(hWnd,1,10,NULL); でタイマを作って WM_TIMER: SendMessage(hWnd,WM_PAINT,wParam,lParam); で10ミリ秒ごとにWM_PAINTを発行し再描画されるようにしているんですが・・・何か間違ってますか?
>>416 WM_PAINTはシステムが発行するものです。
ユーザプログラムが発行してはいけません。
WM_PAINTを発生させたければInvalidateRect等を使いなさい。
はい。
>417 WM_TIMER: //描画 とすれば10ミリ秒ごとに描画されますか?
やってみろヴォケ
>>420 やるの面倒くさいから聞いてるんだヴォケ
そういう書かれ方されると10人20人もそういう人がいるみたいな印象受けますけど、そうでもないですし。 正直なとこ、自分としては割と傷つくんですが。
>>421 419の方法で大丈夫です。やってみましょう。
424 :
デフォルトの名無しさん :05/02/24 19:25:49
シリアル通信でWriteFileのときに フレーミングエラーがたまに起きて、これがでると その後のWriteFileやReadFileが失敗してしまうのですが なんか対策ってありますか? どーやったら復帰できるのでしょうか?
>>416 この場合はGetDCの方で描画する方がいいかも。
後、1タイマーの精度が悪いのでせいぜい50ミリ秒ぐらいかな。
>>403 あなたはゴミですねぇ。ここに居る必要ないんじゃないですか?
もう自分で調べましたけどね。ちなみに俺のプログラムがよんでるんじゃないんですが。。
(バカのてめぇ勝手な仮定に突っ込んでも無駄か。。)
SetTimer自体の精度は50msよりマシだった気がするけど、メッセージで来るから全く信用できない気がする。 というか10msで更新だとかなりCPUパワー食われるような‥‥ 何をやりたいのか書いた方がいいと思われ。
430 :
デフォルトの名無しさん :05/02/24 20:11:52
>>427 だから説明してみろよ。
何処にntdllに問題があると書いてある?
何処に俺のプログラムからクラッシュしていると書いてある?
日本語が読めるか?質問はdllのロードされる位置についてだ。
なんでこんな見当違いで無駄なレスをつける奴を擁護するのか言ってみろ。
>>402 kernel32だったか忘れたけどWin2KでSP当てたらアドレスが変わってた事があった。
過信は禁物。
433 :
デフォルトの名無しさん :05/02/24 20:17:30
434 :
デフォルトの名無しさん :05/02/24 20:19:03
>>432 さっさと答えろ。なんか考えでもあるのか?
すれ違いだの書いてりゃ2チャンらしくていいとでも思ってるのか?
>417さんのやり方でやってみました。 ヴォケとか書いてるのは私じゃないので悪しからず
とにかくお前
>>432 みたいなのはリアルでもネットでも消えろ。
なんの価値もないレスがつかなければまだ知識のある人のレスが望めたんだよ。
答えを持ってないなら書かなきゃいいじゃねぇか。ばっかじゃねぇの?
あと関係ない皆さん、スレ汚しちゃってすみませんね。
もう消えるよ
>>402 マジレスするとDUMPBINか何かでDLLのエクスポートテーブル見れば
どんな場所かわかるよ。
ちなみにシステムdllのロードアドレスは固定。
つーかPEヘッダ手繰ってけばわかるけど。
アドレスとかの仕組みはAdvancedWindowsという本に詳しく載ってる。
>>437 ありがとうございます。アドレスについては今日調べて解決しました。
高いけど物凄い良書なので買ったほうがいいね>Advanced 版を重ねてるから古いのをつかまされない様注意
このスレの存在意義を失わせるような本を紹介するなよ・・・。
すごい自作自演なスレですね。
PCVOID という型が用意されていないことに ヽ(`Д´)ノ ウワァァァァン となったことはありませんか?
ありません
いえね、LPTSTR 等の先頭の L は過去の遺物だって話を聞いたものですから、 私は文字列ポインタ型に PTSTR と PCTSTR を使っていたわけですよ。 で、最近、汎用ポインタに PVOID を使おうとしたところ、PCVOID が 用意されていないということに気がついた次第でございまして。 まあ本質的な問題ではないのですが、イケてるWin32プログラマの皆様は一体 どの組み合わせを使っていらっしゃるのかなーなんて気になっちゃいまして。 (1) LPVOID と LPCVOID (2) PVOID と CONST VOID * (3) void * と const void * ちなみに MSDN の CopyMemory() の項目では (2) が使われているんですよね…。
448 :
デフォルトの名無しさん :05/02/25 10:14:35
エディットコントロールのソースみたいのですが見ることはできますか?
空気読めてない馬鹿がいるな
>>447 俺だったら自分でtypedef const VOID *PCVOID;と書くか、
PVOIDとconst VOID *あるいはvoid *とconst void *の組み合わせにする。
>>447 オレは極力標準の型を使う。
と言うわけで3。
>>447 おいらは
>>452 さんとは真逆で型は極力MS定義を使うようにしてる。
なので(1)
自前定義よりは他の人が見たとき混乱しにくいかなとか
将来何かしらの拡張があった場合とかMSヘッダ側でうまい事修正・対応してくれるかな
とか期待して。
上の理由は逆にすると、実際の型を知る場合に複雑なMSヘッダから定義を探さなければならないとか
MSヘッダでまずいこと修正・対応される場合もあるとかいろんな問題も含んでるので
どれが良いって事もないと思う。
ケースバイケースって感じで
GetWindowText,SetWindowTextで扱える文字列って通常何文字までですか? エディットコントロールは32KBみたいですけど、普通のウィンドウでも最大そこまでOK?
>>454 勝手な想像では、GetWindowTextLength() で扱える数値分ではないだろうかと。
>>454 エディットの32KBは9xの制限でNTは制限ない。(メモリ上の制限はあるが)
コントロールによりけりだと思われ。
>>456 はぁ?NTでも32K越えたら編集できねぇよボケ
???わけワカメ
>>457 とりあえず、732kBのテキストファイルをメモ帳で普通に開けたことを
報告しておく。
おまいらそういう時は取りあえずMSDNみようよ EM_LIMITTEXTの解説から抜粋 Rich edit controls: If this parameter is zero, the text length is set to 64,000 characters. Edit controls on Windows NT/2000/XP: If this parameter is zero, the text length is set to 0x7FFFFFFE characters for single-line edit controls or ?1 for multiline edit controls. Edit controls on Windows 95/98/Me: If this parameter is zero, the text length is set to 0x7FFE characters for single-line edit controls or 0xFFFF for multiline edit controls. まあ、この数値がMAXと書いてあるわけでもなく この数値がまで保障されると書いてあるわけでもないのでソースにならんと言えばその通りだけど この数値が制限だとおもっていいんじゃない?
だから何?
>>451 なるほど。データ型の意味が明白なら、自前で定義するというのもアリですよね…。
>>452 そういう考え方もありますね。私も最初はそうだったのですが、文字配列に
TCHAR を使うようになってからすっかり Windows のデータ型に染まってしまいまして。
>>453 やはり、どれを採用するにしてもメリットとデメリットがあるでしょうし、
コーディングスタイルも人それぞれということになりそうですね。
たいへん参考になりました。レスを下さった皆さん、どうもありがとうございました。
あんの~ハンガリー記法の中の PSTRとPTSTRとは どう違うんですか? Tが付くのと付かないのの差がよくわからないんですが・
LPTSTR/PTSTR == TCHAR * LPSTR/PSTR == char * かな。
そろそろソースもUNICODEで書きたいな・・・
コンパイル出来たっけ?
468 :
デフォルトの名無しさん :05/02/26 04:39:02
fopenで得たFILE*型のハンドルから、 CreateFileで使うハンドルを得られた気がするんですが、 なんて名前のAPIかどなたかご存じないでしょうか?
>>468 そういうAPI/ライブラリ関数は無い。
FILE *をごにょごにょすれば?
_get_osfhandle(_fileno(fp)) これじゃないか?
Unicode版は重くなるだけ。 MBCSを基本にすえておいて、必要な場面だけバッファをUnicodeに変換して Unicode版の関数を使うのがベターだと思うよ。
抽象的な質問で大変申し訳ないんだが、画面上に関数のグラフを描画する際に WM_CREATEがきた時に関数の値を計算して、staticな関数に保存するのと WM_PAINTが来るたびに計算するのとどっちがいいと思う?
473 :
デフォルトの名無しさん :05/02/26 12:54:25
こんにちは LPCTSTRの文字列のある文字が、1バイト文字なのか2バイト文字(日本語など)なのかを調べるAPIはあると思いますが、 教えていただけますか?
>>472 staticな関数じゃない、staticな配列だ…
ゴメンね
>>473 IsDBCSLeadByteExあたりだろーか
実際に見たわけではないけど、 よく聞く話としては英語版のWindowsXPは日本語版よりかなり軽いらしい。 ソースコードは同じでも、 ビルドされた生成物が文字列の変換や比較で使う関数の実装が違うから。 日本語環境はかなりCPUを損していると思う。
480 :
デフォルトの名無しさん :05/02/26 13:27:20
>>472 計算する物にもよるけど、計算結果を他に使わないなら、毎回WM_PAINTで計算&描画するのでいいと思う。
昔の定石だとWM_CREATEが来たときに計算して裏のメモリデバイスコンテキストに描画。
WM_PAINTが来たときには、BeginPaint()で再描画必要な領域を取得して、
裏からそこだけコピー・・・としてたけど、最近の高性能なパソコンなら、
そこまでする必要もないかと。
ソースをすべてUnicode対応にしてしまうと、 単にバッファ全体を扱いたいにもかかわらず、関数が厳密に文字として扱おうとして 過保護な作りになってしまうことが多々ある。 最適化で劣っているはずのLinuxが速度面で優位なのは Unicode周りの処理が関係しているからかもしれない。
それって、日本語版XPは、英語版XPとは違うビルドってこと?
んなわきゃない。それだとLinuxでJavaを扱うと劇重ってことになっちゃう
>>484 意味がわからん。何を比較対象にしたの?
>>478 解決しました。
ありがとうございました。
>>486 IsDBCSLeadByteもあるからな
IsDBCSLeadByteA IsDBCSLeadByteW
自作のエディタを作ってるので 今日から開発開始ですが、今日の夜には完成すると思います。 エディタもそうなんですが、自作のターミナル(TeraTermやHyperTerminalみたいなもの)もあわせて作る予定です。 Cisco製品で試してみようと思います。 はい。 一番の山は漢字変換当たりだろうと思います。
>>489 MBCS(SJIS)の1バイト目と、2バイト目の範囲は重なってる。
IsDBCSLeadByteがTrueを返しても、1バイト目か2バイト目だと言うこと
以上は分からないぞ。
作る前に、ShiftJISやEUCやJISの仕様について、勉強してきた方が良い。
>>490 一バイトがDBCSかどうかわかれば結構ですよ。
別にMS-WORDのような重装備なものをつくるわけじゃありません。
全テキスト文字スタイル固定のシンプルなテキストエディタですから。
ご意見ありがとうございました。
根本的にわかってない悪寒。
2バイト系文字(漢字)のSJISの場合、第一バイトは81h~9Fhだから 1バイト文字(ASCII)と区別できるんだよな。 でも2バイト系文字の第二バイトは40h~7Ehが存在するから これがASCIIと区別できないんだよな。 だから2バイト系かどうかは先頭から順にリード、トレイル、ASCII、を チェックしながら調べないと絶対わからんはずだが。。
スレ違い
495 :
デフォルトの名無しさん :05/02/26 15:10:36
489は半角カタカナの仕組みがわかってればいいんだけど・・・
素直にランタイムの_mbsbtypeとか使っておけという話だ。
なにも改善されないんだが
されるよ
もう春だね。
全部Unicodeにすれば良いんだよ
>>491 WCHARを使わないのであれば、
文字列へのポインタをそのままインクリメントデクリメントせずに、
必ずCharNextとCharPrevを使うこと。
これでどう?>All
473の株があったら空売りすれば絶対儲かる
>>471 NT系のOSは、UNICODEを基本として動作しているわけだから
むしろMBCSを使う方が非効率だと思う。
>473の株があったら空売りすれば絶対儲かる これどういう意味?
>>503 そのへんどうなんだろうねぇ
ファイル名なんかはUNICODEにしておくと無駄な変換がなくて済みそうだけど
ウィジェットのテキストラベルやテキストボックスなんかはどうなってるんだろ
507 :
デフォルトの名無しさん :05/02/26 17:29:07
>506 リンクが見れない。 どのウィンドウを指してるのかよくわからんが、 IMEの操作は、「Imm~」で始まる関数と「WM_IME_~」で始まるメッセージを使う。 特に"candidate"の扱い方を調べろ。
>>503 それはプロセスが文字列リソースを扱っている時の話。
適切な関数を使わないと、ただのバッファデータにまで
重厚・親切な文字列処理が行われかねない。
本来memcmp・memcpyで済ませて構わない場所や
従来strlenでヌル終端位置を取得していた場所が無駄に重くなる。
Unicode対応は、確かに多言語対応・機能拡張には柔軟になるが
バイナリバッファへの直接アクセスがセールスポイントであるC/C++の恩恵を捨てることにもなる。
そもそもマルチバイトコードの大市場というべき日本語環境でMBCS版がちゃんと動くなら、
無理にUnicode版でビルドする必要など皆無。
あれは英語圏の人間が、未知のマルチバイト言語用にビルドするためのものといって差し支えない。
多機能・高速な日本語テキストエディタがUnicodeでビルドされる日は来ないだろう。 わざわざ独自の実装で直接バッファアクセスによる高速化・最適化を実現しているのを、 汎用的なWindowsAPIに置き換えるメリットなどないからだ。
ImmGetCandidateWindow IME候補リストウインドウ位置取得 ImmSetCandidateWindow IME候補リストウインドウ位置設定 取得や設定ならわかりましたが、 肝心の変換文字を指定~候補リストウィンドウの表示がわかりません。
IME候補ウィンドウのハンドルを取得できるのでしょうか?
ImmGetDefaultIMEWnd?
516 :
デフォルトの名無しさん :05/02/26 18:27:18
>>512 やっぱりリンク先が見られないんだが。
IMEプログラミングは、かなり環境に依存するし情報も少ないので、
それなりに大変。ちょっと関数呼んで終わりとか、そういうのじゃないよ。
とりあえず、メッセージフック用ののソフトで、IMEを操作したときに
どういうメッセージがやり取りされてるか知れべて見ろや。
Spy、WinSightあたりを持ってないか。
>>516 そーですね。
こっちが覚えたくても情報がないから、
手探り状態。
でも乗り越えないといけない山・・・。
険しく寒い山。
ガンバ自分。
どうもです。
>>508 WindowsだからUTF-16が前提で話すけど
UNICODE文字列をmemcmp memcpyして何か問題ありますか?
wcslenは非効率な処理をしてるんですか?
むしろ1文字のバイト数が固定されているからランダムアクセスが
効率的に行えるでしょ。
SJISで文字探索するときの非効率さの方が問題。
LPSTRを引数に取るAPIってさ、NT版だと内部でUnicodeに変換してるんでない?
API呼ぶたびに文字列引数をMBCSからUnicodeに変換してるのって恐ろしく 非効率じゃないのかなぁ。俺、Unicodeでコンパイルしてるよ。 もちろん、SJISのほうが便利な部分もあるから、どっかでまとめて変換するんだけどね。 MBCS版のAPIを呼ぶことはしないな。
Win9x 系を見捨てますかそうですか
>>517 けなげだから、ヒント教えよう。
以下のコードを書いて実行してみてください。
char moji[]={"それがPSPの仕様だ。"};
HIMC hIMC = ImmGetContext(m_hWnd);
ImmSetCompositionString(hIMC, SCS_SETSTR, moji,strlen(moji),NULL,0);
ImmNotifyIME(hIMC, NI_COMPOSITIONSTR, CPS_CONVERT, 0);
ImmNotifyIME(hIMC, NI_OPENCANDIDATE, 0, 0);
ImmReleaseContext(m_hWnd, hIMC);
あと、imm.hをinclude&リンク指定としてimm32.libを忘れずに。
これで結構、筋がわかると思うよ。
>>523 9xでもMicrosoft Layer for Unicode入れれば動かせたような希ガス。
みんなUnicode対応と非Unicodeでちゃんとコンパイル出来る様にソース書いてないの?
俺は一応、切替できるように作っているつもり。 しかし、実際のところWin98なんでUnicodeにしたことはない。 MSLUも試す気には(今のところ)ならない。
どのみちUnicodeかMBCSかで内部のロジックまで組みかえる必要あるから最近は全部内部Unicodeで通してAPIは9xで使える奴だけに絞ってUnicode版直接呼んでる。
ところでlstrcpyWはNT系と98以降ってなんでこんな中途半端なことになっているんだ?
Unicode版とMBCS版で速度比較したらどんな結果がでるんだろうか?
両対応にするとソースが #ifdef _UNICODE ・・ #else ・・ #endif だらけになる。
>>533 > だらけになる。
・CStringみたいな文字列クラスを適切に使う
・TCHARだの_tcs*だのを使う
ってのを徹底すればそうでもない
完全になくすわけにはいかないけど、
末端に追いやることはできるっしょ
>>532 どっかないかねえ?
ちょっとした比較物作ろうとしてもVC6だとiostream系が (ノ∀`)アチャー だからなぁ・・・。
ファイル名はFindFirst系とかどうかな User32だと何が適切だろう
キーコードを、実際の文字charに変換する関数はなんでしょうか?
>>537 MFCだけど
str.Format("%c ", nChar);
すんごいバカ
>>537 ms-help://MS.PSDK.1033/winui/winui/windowsuserinterface/userinput/VirtualKeyCodes.htm
>>537 何貼ってんだ俺
MapVirtualKey
542 :
デフォルトの名無しさん :05/02/27 06:10:16
ウィンドウアプリケーションからコンソールアプリケーションを実行して、 出力される情報をリアルタイムで得るにはどうしたらいいのでしょうか? 出力をファイルにリダイレクトすれば、実行後には出力結果を得られますが、 あいにく実行時間が長いプログラムなので、リアルタイムで出力情報が欲しいのです。
ぱいぷ?
自己解決しました。検索したら出てきました。 CreateProcessに渡すSTARTUPINFO構造体にhStdOutputという標準出力ハンドルがありました。
>>537 MapVirtualKeyでGo!
KeyDownイベントで拾うんだぞ。
ほかの同様のKeyイベントがあるけど、仮想キーコードが異なるんだ。
>>546 それで今までやってきたのか・・・分かってないんだねぇ・・・
俺の部下にも注意しないと。
548 :
537 :05/02/27 12:07:37
>>546 仮想キーコードが異なる場合、どのように対処すればいいのでしょうか?
同じキーでも、コードが異なるのでは処理がややこしくなるのですが。
純粋にどのキーが押されたのかを知りたいだけなら、 GetAsyncKeyStateでも使えばいい。 本当はゲーム作ったりする時に使う関数だから、メッセージ通す方法の方が いいのかもしれないけどね。
>>549 どっちかというと装飾キーの状態判定がメインな気が
SelectObject(pPen);をはじめて実行したときは何が返ってくるんですか?
コンパイルエラー
506ではないですが、 自前でIMEの変換状態を描画しているのですが COMPOSITIONとCANDIDATEの各ウィンドウを 表示させない(変換動作はバックグラウンドで行う)ように するにはどうすればいいか、ご存知の方はいませんか?
COMPOSITIONウィンドウは以下で //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ HIMC hIMC = ImmGetContext(hWnd); COMPOSITIONFORM cmf; cmf.dwStyle=CFS_RECT; cmf.rcArea.left=0; cmf.rcArea.right=-5; ::ImmSetCompositionWindow(hIMC,&cmf); ・・・ //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ とすれば、非表示になりましたが、CANDIDATEウィンドウを 非表示にする方法が分かりません。誰か教えてください。
>>552 以前選ばれていた、Penハンドルが返ります。
要するに、何も選ばれて無い状態のPenハンドルは、黒のドット一本線ですから。 それが返ります。 つまり、デフォルトの状態が返るわけです。
>557 それを保存して後でまたSelectObject関数で戻さないといけないんですよね? 戻さないと何か問題ありますか?
>>558 いえ、戻さなくても問題はおきませんが。
ただ、元(デバイスコンテキストに対するデフォルトな状態)に戻したいばあいは必ずあるので、SelectObjectが返すオブジェクトは大切だと思いますが。
現在選択中のGdiObjectはDeleteObjectに失敗するので、 GDIリソースが漏れる。
>559-560 thx
GetStockObjectでとってきたGDIオブジェクトは解放せんでええから いざとなったらそれSelectすればいい話だけどな。
なるほど、良いこと聞いた
564 :
デフォルトの名無しさん :05/02/27 20:51:07
スレッドA,B,Cがあって、CがEnterCriticalSectionでクリティカルセクションに入って 次にA,Bの順で同じクリティカルセクションに入った場合、 CがLeaveCriticalSectionで抜けると、次はAが動き始め、Bは待つのですか? A,Bが一緒に動き始めたりしないですか? Win2000です。
ミューテックスをロックできた順に動きます。
>>564 >次にA,Bの順で同じクリティカルセクションに入った場合、
>CがLeaveCriticalSectionで抜けると、次はAが動き始め、Bは待つのですか?
>A,Bが一緒に動き始めたりしないですか?
用語が混乱してますね。「クリティカルセクションに入った」ってことは、
Mutexをすでに獲得したということですよ。
というのは措いといて、A,Bが同時に動くことはありません。
必ず一つずつです。
全てのコントロールをウィンドウ化させたら、重くなる? ボタンもスクロールバーもタブもスライドもコンボボックスも。
????????????
全てのコントロールはウィンドウだと思われ
VirtualAlloc(Ex)のflAllocationTypeのMEM_RESETって どういうときに使うんでしょう? page stateを変えるものではなさそうだし・・・
>>572 クリティカルセクションとミューテックスを混同しているあたり。
571ではありませんが みゅーてっくすは全く関係ありません
だから、素直にAdvancedWindows読め Win32マルチスレッドプログラミングでもいいが
>>570 AdcancedWindows読め
全ての答えが書いてある
アドバンスド大戦略を読め。
ここの奴らの言う事を鵜呑みにするなよ 合ってる場合は稀で、ほとんどが間違ってる いいからAdvancedWindows買え
アドバンスト覚えたて厨がうざいんですが
アドバンスド・ファンタジアン
>>564 EnterCriticalSection~LeaveCriticalSectionで囲われた部分は同時に実行されない。
先にどこかのスレッドが中に入っている場合、後から来た方はEnterCriticalSectionで待ちぼうけ。
そういうことをさせるためのクリティカルセクション。
クリティカルセクションはリソース競合が起きなかった場合、カーネルモードに移行しない 競合が起きた場合でも、所有権を持つスレッドはカーネルモードに移行せず実行される だからミューックスより速い これらの情報はすべてAdvancedWindowsに載ってる 買え
もうスレッドとか、カーネル周りの質問とかは「AdvancedWindows読め」でいいよね。
GameBoyAdvance
>>574 あー、そういう意味でMutexと書いたわけではないのだが・・・。
いわゆるCreateMutex等で作られるオブジェクトではなく、
相互排他に使われるモノ一般のことを言ったんだけど、
確かに誤解される書き方でした。失礼。
しかしまあ、「クリティカルセクション」ってのは、
一般に相互排他されたコード領域を指す言葉なわけで、
クリティカルセクションに入「った」ってことは、
すでに相互排他された状態だと思うわけですよ。
WindowsのCRITICAL_SECTIONのおかげで、若干混乱しがちですが。
>>585 おまえ、ミューテックスってどういう意味かわかってないだろ
いいからAdvancedWindows買えよ
意味載ってるから
MuTeX は TeX で楽譜を組版するためのマクロパッケージです
>>585 ホントに分かってなかったんだな。軽くジャブ入れただけだったのに。
どんまい。勉強して出直してきな。
本屋の回し者がいっぱい居るな、ボケ
こんにちわ、紀伊国屋書店です。
紀伊国屋書店は、なぜ、カウンター員とレジ処理員が別になってるのか、理由きぼんぬ。
MSDN のPlatform SDKのSynchronization Objectsにこと細かく書いてあるじゃん
>>533 自作ライブラリのUnicode対応をやった。C++前提だと意外と楽だね。
関数オーバーロードとテンプレートを駆使して
MBCS版バイナリとUnicode版バイナリを、生成物の中で両立できた。
TCHAR.H依存のマクロ切り替えだと
MBCS版バイナリとUnicode版バイナリが共存できない。
みなさん。いろいろありがとうございました。 AdvancedWindows持ってますがいま会社に置きっぱなしなので 明日読みます。では
AdvancedWindowsは定番って書いてあるのに なんでAmazonだと配送に4~6週間かかるんだろう?
AdvancedWindowsなんて、普通の一般人は読まんよw たぶん、在庫がないから発注してるんだろうな。
普通じゃない一般人
この業界なら普通だろ。 Windows系扱う会社でこの本が常備してないとこはヤバイな。
Windowsプログラミングを仕事としている会社なんて極僅かだよw
普通の一般人w
私は普通の一般人です。 皆さんは普通の一般人ですか?
P5ページです。
ここはひどい AdvancedWindows ですね。
AdvancedWindowsお買い上げいただきましてありがとうございます。
AdvancedWindows ぬるぽ
パスの示すものがファイルなのかフォルダなのかを調べる APIを教えてください。以前使ったことがあるんですけど、 忘れちゃって…。
すいません、たまたま見つかりました。 GetFileAttributes ですね。
WM_VSCROLLって垂直スクロールバーを触ったときに来るメッセージだけど スクロールバーに触ってない状態でスクロールバーが動いたときにくるメッセージないの?
sendmessageでWPARAMのLOWORDにメッセージ送りたいんだけどできる?
解決した
文字間を制御する必要があるため、TextOutで1文字づつ出力しているのですが、ごく稀に 代替フォントで使用されたフォントがずーっと使用されてしまうことがあります。 1文字づつSelectObjectすればちゃんと出るのは確認してますが非常に遅くなります。 文字種(漢字・アラビア文字・ヘブライ文字とか)が分かればその変わり目で 再設定すれば良さそうなのですが、文字種を判定するにはどうしたら良いでしょうか。 テーブル作るのが早いのかなぁ… あるいは代替フォントが使用される・されない・使用不可、等が判定できる方法が ありましたらご教授ください。
GetFontUnicodeRanges とかか?
なんかここで聞くよりホント
>>439 買ったほうが早そうだな。
こいつらmsdnより使えないことに最近気づいた
聞く側の分際で
MSDNの検索がうまくいかない
ム板ってID出ないんだね
馬鹿には見えないんだよ、きっと。
(´-`).。oO(またデブ好きが紛れ込んでいるな。ぜひとも実際に会ってみたいものだ)
デブ好きなんだ…
漏れ、会社でMSDNを知らない人っていうのをはじめて見たよ チョトびびった。
教えてください。お願いします
解決しました。
>>626 は偽者ですので教えてください。お願いします
スクロールバーに触ってない状態でスクロールバーが動いたとき ってどんな状況だ?ホイールスクロール?
つ ω
>613 ありがとう~ GetFontUnicodeRanges から辿ってみたら GetGlyphIndices てのもみっけ。 でもどちらも_WIN32_WINNT>=500なんでつね。 今回はXP前提なのでコレ使ってみまっす。
ウィンドウベース(非コンソール)でのアプリケーションで stdoutやstderrのデータを フック?して、EditBox等に表示したいんですが。 何かAPIありますか? できれば、自分自身のアプリケーションと systemやらCreateProcess、ShellExcecutなどで立ち上げた別のアプリケーションの stdout,stderr,を別々に監視したいです。
636 :
デフォルトの名無しさん :05/03/01 13:13:46
リッチエディットコントロールでは、 キーを押した時にメッセージは来ないのでしょうか。 普通のエディットコントロールでは、WM_COMMANDが来るようなのですが。
リアルタイムにネットワークの転送量を表示したいのですが、 式はどうなるのでしょうか? dwInOctets dwInUcastPkts dwInNUcastPkts は表示できるのですが、Octetsは通信してない時も値が入ってますし・・ どうかよろしくお願いします。
サブクラス化して、WM_KEYDOWNで処理する事にしました。
調査結果: ファイルアクセスを必要とする場合、SJIS形式のファイルを読み込む処理がある場合が多い。 UNICODEファイルを読み込むケースはほとんどない。 SJISファイルをUNICODEビルドで読み込む場合に用いるC標準関数_fgetts()が非常に遅い。 エンコードと無関係な部分においても、 文字列ソートする際などに用いる比較関数_tcsicmp()の処理がUNICODE版は非常に遅い。 補足: MFCのUNICODE版ソケットクラスには長らく不具合が存在した。 ソケットプログラムのようなマルチプラットホームを意識すべき環境には、 UNIOCDEで開発する人が少ないので不具合の発見が遅れたとみるべきだろう。 結論: 多くの場合、UNICODEビルド生成物は処理が遅い。 単にバッファサイズが2倍必要になるだけなく、諸々の処理も重くなる。 UNICODEビルドの優位性を確認できない場合がほとんどである。
移動します。スレ汚しスマソ
641 :
デフォルトの名無しさん :05/03/01 17:04:17
C#NETなんですが、ListBoxのある特定のItem(行)の 文字色を変えたり、背景の色を変えたりすることはできますか?
>>639 Win32スレなのに、NT系におけるAPIコールの速度比較を
何一つ行っていないのにワロタ。
MFCスレでやれ。
>>641 オーナードロー使え。
そしてスレ違い。
645 :
デフォルトの名無しさん :05/03/01 18:36:50
>>644 色変えたいだけなのに
オーナードロー使え?
馬鹿も休み休み言え!
正解はWM_CTLCOLORLISTBOX オーナードローとか言ってる馬鹿は氏ね。
こんばんわ //フォーマット出力 void Format(TCHAR* pFm,...){ TCHAR pOut[MAX_LOADSTRING]; wsprintf(pOut,pFm,...); } フォーマット出力をするwsprintfを、自分で作成した関数Formatでラップしたのですが、 なぜかwsprintfの ... の部分の指定がおかしいとのエラーが出ます。 この場合、wsprintfの ... の部分はどのように指定すればいいのでしょうか? 宜しくお願いいたします。
#include <stdarg.h> va_list v; va_start(v,pFm); wvsprintf((char*)pOut,(char*)pFm,v); va_end(v); これで解決です。
650 :
デフォルトの名無しさん :05/03/01 19:11:37
DirectXのバージョン情報を取得したいのですが、 どうやって取得したらいいのでしょうか? SDKってやつも見てみたのですが、 なにで検索していいのかさっぱりわかりませんでした。 もしかしたらスレ違いかも知れないのですが、 よろしくお願いします。
スタートメニューの「ファイル名を指定して実行」からdxdiagです。
>>639 UNICODEビルドでSJISファイルを読むのに_fgetts()を使ってどうすんだよ。 w
無茶苦茶だな。
>>647 行ごとにWM_CTLCOLORLISTBOXメッセージが来ないんですが・・・
うちのWindowsが悪いのかな
(・∀・)ニヤニヤ
>>647 そのメッセージでどうやって特定の行の色を変えるの?
そんなはずはありません。 OSを再インストーノレし最新パッチを当てれば解決します。
おまいら釣られすぎですよ。
こんなとこで釣りすんなよ だれも寄り付かねーぞ
659 :
デフォルトの名無しさん :05/03/01 19:28:46
>>651 ありがとうございます!
これで表示されているDirectXのバージョン情報を
API(C言語)で取得するのは可能なのでしょうか?
MSDNを見たのですが、どこのレジストリに書き込まれているのか
みつけられませんでした…
>>659 GetFileVersionInfoで検索すればわかるよ
>
>>639 >UNICODEビルドでSJISファイルを読むのに_fgetts()を使ってどうすんだよ。 w
>無茶苦茶だな。
は?
>>652 UNICODEビルドで速度を実測したことないのか?
APIへ文字列渡しする機会などほとんどない。
よってAPI呼び出しによる差異はほとんど発生しない。
むしろ、CのUNICODE関数が遅いために問題が発生する。
バッファをエンコードせず直接読み出した場合、
結局MBCS系の関数を使い続けなければならず、
UNICODE関数はSJISファイル処理に向いてない。
ちょっと分からないのでヒントください。 今、ハードウェアを制御するアプリケーションを作っていて、ハードウェアには付属のDLLが付属していてそれを使ってコントロールまでは出来ます。 そこで、2つのアプリケーションからそのハードウェアを制御したいのですが、付属のDLLを使用すると当然1つのアプリケーションしか制御できません。 (2つ目のアプリケーションを実行した時点でハードウェアが無いと怒られる) そこで、複数のアプリケーションから操作できるように付属DLLを操作するDLLを作成していて 今現在、DLL間での変数の共有やGetProcAddressで関数のアドレスの取得などやってみたのですが、動かず。 GetProcAddressは仮想メモリ空間のアドレスなので他プロセスから呼び出せないのは当然な所までは分かりました。 こんな感じにしたいのですが↓ アプリケーション1→| |制御DLL→付属DLL→ハードウェア アプリケーション2→| 今思い浮かぶ解決策としては、別プロセスの関数を呼び出す、もしくは DLL内にスレッドを作成し、スレッドをループさせ、共用変数を監視して実行させる方法の2種類です。 もうちょっと簡単な方法があると思うのですが、何かヒントをください。
>>663 そんな君にこそAdvancedWindows。
読めばたぶん即・解決。
ここで説明してやってもいいけど長くなりそうなんでね・・・。
とりあえずNt系ならCreateRemoteThreadでも試せば?
アウトプロセスCOMにでもしといたら?
>662 UNICODEビルドなら、ReadFile直後にMultiByteToWideChar。 何でCRTのMBCS関数が関係するのかわからん。
GetTextExtentPoint32 wsprintf とりあえず思いついた、上記二つの関数1,000,000回連続呼び出しという 意味の無さそうなテストの結果。 UNICODE : GetTextExtentPoint=2.406sec wsprintf=2.407sec MBCS : GetTextExtentPoint=2.547sec wsprintf=2.735sec 結論: 差はあるっつえばある
>>663 漏れもOutprocのCOMにするのに1票。簡単だから。
何らかの事情でそれが出来ないなら、自前でサーバプロセスを作って、
クライアントはWindows Messageなりソケットなりで繋げて使う。
>>666 え?
それじゃ、_wfopen()、fgetws()をテキストモードで用いるのと同じだろw
>>667 GUならびにリソースを文字列渡しAPIで操作する機会は少ない。
1秒に1000回あるかどうか。
実際に圧倒的に多いのはユーザが用いる文字列比較関数・文字列操作関数。
この作業は、ユーザによるただのメモリ操作に属するが、
しかしこの作業がプログラム処理の主体になる。
>669 fgetwsとはMultiByteToWideCharの呼び出し頻度が異なる。 その上スレが違う。
msvcrtはもはやAPIの一種だろ アフォ
えーとUNICODEについていけないUNIX厨乙?
>>669 メモリ帯域は最近比較的多目なので、文字列操作で1バイトずつ処理するのも
1ワードずつ処理するのもたいして変わらないような気がする。
扱う対象がSJISならSJISのままでやればよろし、というのは当然だけどさ。
ワードはプリフィックス付くからx86系では不利
色々制約が付いちゃってるのでOutProcのCOMとか使えないのでループさせる方法で行きます。 答えて頂いた方々、ありがとうございました。 AdvancedWindowsは買ってみようと思います。
これもスレ違いだけど、STLのアルゴリズムとかstd::wstring、つまりstd::char_traits<wchar_t>とかだとどうなんだろうか。
アプリケーション1→| |自前DLL→ハードウェア アプリケーション2→|
>>663 DLLはそれぞれのプロセスでLoadする必要があることは理解してる?
DLL側で排他制御すりゃいいじゃん
>>679 付属DLLが排他処理を実現していると何度言えば(ry
むしろ、その排他処理を無効化したい質問者の真意を汲めと何度言えば(ry
1. DLLをどっかでロードしたらハードウェア制御スレッドを作り待機 2. プロセスがアタッチしたら歯痛スレッド作る これだけでしょ?
_tcsicmp()とlstrcmpi()の違いを記述しなさい。 また、その処理速度の違いについても記述しなさい。
strcmpごときの速度でガタガタ言ってんじゃねーよヴォケ
クラッキングしたいと言っている質問者に なぜか自前の排他処理を紹介する日本語の不自由なスレ住人。 1.DLLを使うミニプログラムを作成する。 2.そのミニプログラムは起動時の引数指定で異なる動作を行い、すぐに終了する。 3.2つのプログラムから好きな時にミニプログラムをキックする。。
リソースが1っこだけならかなり簡単な問題だと思うが。 Windowsならなおさら。
663は単にスレッドとプロセスの違いを知らない人みたいだが。
AdvancedWindows読めといったはずだが。
684=663な気ガス
>>684 のDLLは付属DLL。
対処法その2
1.「付属DLLを使うプログラム」をウィンドウアプリとして作成。
2.「付属DLLを使うプログラム」はメッセージループさせつつ常駐。
3.別プログラムから「付属DLLを使うプログラム」にユーザー定義メッセージなどを送る。
>>682 _tcsicmp()はCライブラリ関数(の処理系独自拡張)。lstrcmpi()はWinAPIの関数。
lstrcmpi()は一般に時間が掛かる(と言われている)DLLの関数を呼び出すことになるので、
計測してみたら(どの程度の差が出るかはともかくとして)おそらくlstrcmpi()が_tcsicmp()より遅くなるだろう。
対処法その3 1.「付属DLLを使うプログラム」をソケットサーバーとして作成。 2.「付属DLLを使うプログラム」をlistenさせつつ常駐。 3.別プログラムから「付属DLLを使うプログラム」にソケットで命令送信。
メッセージループとか意味不明なこといってる可哀想な684は放置ということでOK?
>>692 その2、その3は妥当だと思うけどね。 SendMessageって使ったことないの??
>>690 あのさあ、msvcrt.dll使うことにしたらどのみちdllの関数呼び出すんだけど
なんでわざわざメッセージキューなんて使うのかな・・ 不思議
一番の対処法は、付属DLLのマニュアルを良く読むことだと思う。
問題は
>>663 がWindowsの排他処理を理解してるのかどうか
DLL関数の呼び出しはIAT(インポートアドレステーブル)というものあってだね、 それ経由で間接的に呼び出されるのだよ。 だから静的リンクされたライブラリよりちょっとばかし不利になる。 不利といっても参照かjmpが一回増えるだけだけどね。 ということがAdvancedWindowsに書いてあったりなかったり・・
今、確信をもって言えることは質問に対して見当違いな排他処理を説明して その間違いを指摘した善意の別人を質問者と同一人物と思い込んで 勝手に他人を自演認定しているテンパッたアフォが一名、 このスレを荒らしているということだ。
>>669 そのDLLがどんなものかわからないけど簡単にリソースのオープンとクローズが
できるならプロセス間の排他処理でいけますが、
オープンのときにハードウェアに時間のかかる初期化処理が発生するなどの
理由でそういった操作が不可能なんじゃないかな。
そういう理由なら1プロセスに処理を集中する必要があるように思うよ。
まあ、これには例外があって GetProcAddressで得たDLL関数はIATを経由せずに呼び出せる。 GetProcAddressは直接エクスポートされた関数アドレスを返す。 だからもしもより速い方が良いと思うのなら、 使うDLL関数をGetProcAddressで取得しなおすと良いかもしれない。
>>701 だから最初に起動したプロセスのDLLの一番はじめに制御スレッド立ち上げて
プロセスアタッチ毎に排他制御しろってのが伝わってないみたいだね。
わかんないのはDLLの原理が理解できてないだけ。
701が痛すぎる件について
一番痛いのは
>>705 だろうね。
ユーザーが何をしたいか、どのような制限化にあるか、
全く理解できていないと思われる。
いつからユーザーがDLLを作ることが前提になったのか不思議だ。
まあ、質問自体がスレ違いだけどねw
つまりさあ、 制御DLLだけは663が弄れるんだろ? アプリ1 → 制御DLL → 付属DLL 最初のアプリ、制御DLLで2つスレッド立ち上げるんだわ。 付属DLLを制御するスレッド 制御スレッドに命令を送るスレッド ついでにCreateMutexかなんかの排他制御用オブジェクトと 命令通知用のイベントオブジェクトを作る。 データを共有したかったら制御DLL内に共有セクション作ればいい。 アプリ2 → 制御DLL 制御DLLがこんときに立ち上げるスレッドは1つ 制御スレッドに命令を送るスレッド 付属DLLはアプリ1の制御DLLが占有してるのでリンクしない。 これでわかんねーかなあw
>>690 _stricmp()ではないけど、UNICODE環境で速度を試してみた。
400000個ほどあるUnicode文字列をqsortでソートする際の比較関数を変えてみた。
_tcsicmp() 17秒 ※実際は_wcsicmp()
lstrcmpi() 2秒
予想に反してlstrcmpi()が速いのだけど、_wcsicmp()が異様に遅いともいえる。
誰か理由を教えてくれ・・・。
lstrcmpiってUNICODEじゃないと思うけど。 なんか勘違いしてるとか。
つーか無能の人はどうして粘着してるの?
>>710 怒るかもしれないが、書かせてもらう。
制御DLLが必須ということになっている時点で、
君の中で強固な脳内補完が行われたのではないかね?
いくら排他制御を実装したところで、それを利用できるのは自分のプログラムだけだろ。
>>712 人を勘違い呼ばわりする前に、自分が勘違いしてないか
確認した方がいいぞ。
WinBase.hでも見てこい。
>>714 やっぱ俺の説明ちっとも理解してないみたいね。
>自分のプログラムだけだろ。
これ、何の反論なの?
俺
>>663 に対して説明したつもりなんだけど。
意味不明なんですがw
こんばんわ アドビのホットショップみたいに、 ツールウィンドウをクリックしても、親のウィンドウはアクティブなままにしておく方法を教えていただきたいのですが。 通常だと、TOOLWINDOWをクリックすると、親のウィンドウは非アクティブ化しますが、 TOOLWINDOWも親のウィンドウも両方ともアクティブのままにしておきたいのです。 よろしくお願いいたします。
663が退場している以上その辺は闇のなかだなぁ。前提が異なるだけで みんなそんなにはずしてないように思うけどね。 ただいえることは、675の書き込みが微妙すぎる(笑
一家に一冊AdvancedWindows
>>718 >みんなそんなにはずしてないように思うけどね。
排他処理を用意しようとしている人は、思い切りはずしているでしょw
制御DLLを作ってもかまわないが、排他処理を入れる意味が全くない。
↑馬鹿?
>>720 付属DLLを複数で使うための排他制御なんだが。
付属DLLからぶら下がってるハードウェアは関係ない。
なんも理解してないな。
ちなみにさあ、 >制御DLLが必須 とか妙な思い込みしてるみたいだけど、 DLL化しなくていいなら直接アプリ自身で制御DLLの役やっても変わらないが。 いいかげんAdvancedWindowsでも読んだら?
>>711 普段気にしたことはないけどsetlocale系の設定って影響すんでしょうかね?
APIのlstrcmpiはコントロールパネルのロケールで動いてるんでしょうけど。
>>694 Cランタイムをスタティックリンクすることも多いよ
>>717 Spy++かなんかでホットショップとやらの窓のスタイルがどうなってるのか調べる。
>付属DLLからぶら下がってるハードウェアは関係ない。 だからこそ、排他処理を自分で作る意味ないつってんだろ、アフォかお前? オナニー排他処理なぞ作って楽しいのか?
キチガイを飼ってるスレ
>>728 の脳内設計では排他制御は必要ないってことでいいんじゃない?
きちんと説明できないアフォみたいだし。
そろそろWin32APIの話に戻ろうぜ。
>>711 Cランタイムをスタティックリンクしてもダイナミックリンクしても
結果は同じ?
>>689 ブラックボックス(この場合付属DLL)を抱えてる以上、メッセージ待機は危険。
ブラックボックス内でメッセージ処理されたら悲惨なことになる。
これもある前提の上の話だけど、
ひとつの制御スレッドだけが付属DLLをコントロールする構造なら、各アプリからの
命令はシリアライズ(順番化)するまたはされるから排他処理はいらないとも
いえるし、シリアライズすることが一種の排他処理ともいえる。
それでも複数の命令をセットで発行する必要があるなら排他は必要になりますけどね。
最初の質問をした人が戻ってこないとこれ以上の議論は無意味だと思うよ。
>>733 「付属DLLを使うプログラム」<-ここは弁護するよ、これをよくみよう
>>732 >>711 はスタティックリンクを使ってます。
ロケールは、_tsetlocale(LC_ALL, _T(".ACP")) を実行しています
当方の環境は、ToolKit2003のため、
標準C++ライブラリをダイナミックリンクするためのMSVCPRT.LIBがないため、
即座にダイナミックリンクを試せないので、ダイナミックリンクでやる気が沸きません。
C ランタイム ライブラリ用MSVCRT.LIBは入っているのですが。
なぜ、このような中途半端な配布になっているのか謎です。
>>733 >ブラックボックス内でメッセージ処理されたら悲惨なことになる。
もっと詳しく
Ruby!!!!!!!!!!!!!!!!!!!!!!!
技術を駆使して無意味なことを実装しようとしている馬鹿ばかり。 排他処理のための排他処理かよ。 ポーリングだけで十分じゃん。氏ね、お前ら。
今時ポーリングだけですむような簡単なアプリを作ってらっしゃると。
>>739 今時好きなだけフリーズする簡単なアプリを作ってらっしゃると。
>>738 誰がどの書き込みかはわからなくなってるけど、
なんかこれは関係ないのが煽りにきた感じだな。
ポーリング機能だけで十分だろ。 待つかどうかはユーザアプリ次第。 同期をDLLのなかでやろうとする馬鹿まで現れたか。
ポーリングて聞くと、CPU占有率100%のあれですか?
>>742 なんなの、そのユーザーアプリって。
ポーリングはどこに掛かってるの?
まあいいじゃないか。 CPUを遊ばせておくよりは。
AdvancedWindowsのおかげで彼女ができました
AdvancedWindowsで城が建ちました。
>>735 それ(_tcsicmp)ねえ、_tsetlocale呼ばないとすごく速くなるんだけど、
そのかわり"ABCDE"と"abcde"が区別されちゃう。
デフォルトでは大小文字判定する文字が限定されているようだ。
_tcsicmp()と比較する場合は、 lstrcmpi()じゃなくてCompareString()でやらないとアンフェアということかねぇ。
750 :
デフォルトの名無しさん :05/03/02 04:09:18
RickEditで、そのエディタ上でドラッグの動作をすると、 カーソルの点滅が止まってしまい、CPU率がすごく重くなるんですが、 解決方法がありましたら教えてください。 左ボタンを最初に押した時のみメッセージが来るようで、 押し続けている時は来なく、それはサブクラス化した場合も同じなので、 どれかのメッセージを防いで解決しようと思いましたがうまくいきませんでした。
751 :
677 :05/03/02 05:02:19
リックエディット知らないの?ドムの一種だよ、ドム
バージョンアップ版のRICHEDIT_CLASSだと、その重いのが 改善されているようなので、そちらでやってみたいと思います。 失礼します。
>>751 この手の書き込みする奴に聞きたいんだけど、
「だから何?」
msvcrtでの実装では、LOCALEがC以外のとき、 towlowerがとっても遅いのでそれに引きずられて wcsicmpも遅くなる。何せ、かたやテーブル参照、方や LCMapString呼び出しだから。
>>727 Spyで調べて、スタイルをそのとおりにしましたが、
できませんでした。
誰か、解決法をご存知な方はいらっしゃいますか?
私の今必死にグーグルなどで調べています。
WM_NCACTIVATE?
リアルタイムにネットワークの転送量を表示したいのですが、 式はどうなるのでしょうか? dwInOctets dwInUcastPkts dwInNUcastPkts は表示できるのですが、Octetsは通信してない時も値が入ってますし・・ どうかよろしくお願いします。
>>759 ありがとうございました。
もう一点ですが、アクティブ化されるウィンドウ(タイトルバーの色がアクティブ色になる)は、デフォルトでは必ずひとつですが、
2つ以上のウィンドウをアクティブ表示したいのですが、その方法をご存知でしょうか?
この辺の資料が少なすぎて、手探り状態です。
よろしくお願いいたします。
762 :
デフォルトの名無しさん :05/03/02 08:55:25
>>660 調べてみます。
ありがとうございました!
レス遅くなってすいません。
>>760 API GetIfEntryのMIB_IFROW構造体のことだと書かないとスレを移しても回答はないと思いますよ。
>>763 すいません。誰かが探してくれているみたいです。
765 :
デフォルトの名無しさん :05/03/02 09:41:28
エディトコントロール上でなく、普通のstaticウィンドウなどで、 漢字変換を実装したいのですが、ひらがなを引数に渡すと、 それに対応する漢字が得られるAPIがありましたら教えてください。
複数候補があったときにどんな漢字にするかはどうやって決める?
>>766 自作のウィンドウを出して、そこに得た漢字をずらっと並べて、
数が10個を超えた場合は、スクロール処理させる感じで、
そこで選んだ漢字を戻り値にして、元のウィンドウに表示させる感じです。
>>768 ありがとうございます。やってみたいと思います。
たぶん探していたのはEnumRegisterWordProcですかね。 もう少し深く調べたいと思います。 お答えいただいた方、どうもありがとうございました。
>>669 あんたの作るプログラムがすべてのように語られてもねぇ w
誤爆?
質問です。 Windows2000/XP系で、キーボードの低レベル割り込み (9x系で言うとVxD)ってありますか? また、Windows2000/XPに対してVxDでの割り込み(無理?) できませんでしょうか?
そういう質問をするときは、目的を書いて手段を聞いた方がいいと思うぞ。
ウィンドウクラスに登録されているアイコンを取り出す(Get)場合、 どの関数を使うんですか?
wincore.cppを見たいけど、どこのディレクトリにあるんだい?
拡張子に関連付けられているアイコンを取得するにはどうすればいいのでしょうか?
>>779 ExtractAssociatedIcon
>>779 「アイコン 拡張子 取得 API」とかでググればすぐにわかるのに。
>>776 C:\Program Files\CBuilder6\Source\Mfc
wm_mousewheel使うと定義されてないってなるんだけどどうすりゃ使えるんだ?
>783 なんでそんなことしたいの? フォーカスがどこにあるのか混乱するじゃん。
>>786 ご返答助かります。
通常のウィンドウは、通常どおり、一つのウィンドウ(トップにある)だけアクティブにすればいいのですが、
ツールウィンドウは、常にアクティブにするような仕様にしたいのです。
フォットショップとかも、ツールウィンドウは常にアクティブ(タイトルバーの色もアクティブ)ですよね。
それに、ツールウィンドウは常にトップに位置するものですが、
このツールウィンドウが非アクティブになると、右上の閉じるボタン×が使えなくなり、
・トップに表示されているのに非アクティブ表示なのは不自然
・トップに表示されているのに、閉じるボタン×が使えない
ということになるので、
ツールウィンドウだけ常にアクティブ表示としたいのです。(タイトルバーの色がアクティブということです。)
グーグルで調べていますが、なかなかHitしません。
誰かご存知な方がいらっしゃいましたら、教えていただけないでしょうか。
NCPAINTで自分で塗るのが早いんじゃないの。
>>788 そうします。
自分でツールバーを模擬します。
そうするしか方法がないみたいです。
というより、Excelのツールバーを見て、ツールバー部分を独自に描画してるのを気づきました。 orz
>>783 WM_NCACTIVATEを投げるの。
DIALOG出してる時にmessageでWM_CHARが受けれないんだけど何か方法ありませんか?
サブクラス化
>>785 _WIN32_WINNTを0x400以上あるいは_WIN32_WINDOWSを0x410以上と定義してからwindows.hをインクルードすれば良い。
前者はNT4以降、後者だとWin98以降で追加されているAPIなどが使用可能になる。WM_MOUSEWHEELもその「など」のうち。
ある一点(スクリーン座標)に対してマウスクリックメッセージを送る時に、 そこが非クライアント領域だった場合、どのウィンドウハンドルに対して どんなメッセージと座標で送信すればいいんですか? その点が非クライアント領域かどうかは WM_NCHITTEST を送って調べています。
>>790 ありがとうございます。
WM_NCACTIVATEを投げて、
DefWindowProc(hWnd, message, 1, lParam);でアクティブ化したらできました。
ただ、タイトルバーはアクティブ表示になったのですが、
右端の閉じるボタン×が反応しなくなりました。
×ボタンを押しても、ウィンドウが閉じないのです。
見た目はアクティブ化されていますが、実際は非アクティブ化されたものでしょうから、
SetActivateWindowでアクティブ化をしましたが、×ボタンはマウスクリックに反応しません。
これはなぜなのでしょうか?
いつも安直に聞いて気が引けるのですが、 rich edit control の version を調べる API にありますでしょうか。 winXP では、問題ないみたいだけど、win98 では EM_GETPARAFORMAT が失敗します。 winXP で、default での line spacing が間延びしているのをなんとか したいと思っているところです。(wordpad も間延びしていると思って います。)
あのさあ、 OSのバージョンの問題とは思わないのかよ。
DrawIconExでアイコンを描画したのですが、 VisualStudioで作成したアイコンを滑らかにしたような表示になるんですよね。 綺麗にみえるんですが、 そういう滑らかにする表現をしないで、ドットのまま描画させる方法ってありますか?
サイズがあってないんだろうな
>>800 48×48、32×32、24×24、16×16
をそれぞれ16色・256色・16777216色で全てアイコンファイルに組み込む。
ただし、16777216色版は必ずしも必要ない。
803 :
デフォルトの名無しさん :05/03/03 03:50:17
>>799 ,
>>803 レス感謝。
>>クラス名とOSのバージョンで判断するんだった...
そうと思っていましたが、win98 の Windows フォルダ見たら、
riched.dll v? ファイルバージン 4.0 257,440 バイト
riched20.dll v3.0 ファイルバージン 5.30.... 431,133 バイト
riched32.dll v? ファイルバージョン 4.00.... 197,392 バイト
があるので、EN_GETPARAFORMAT で PARAFORMAT2 が使えるのではと
期待しました。しかし失敗。バージョンが確認できて 2.0 未満なら
EM_GETPARAFORMAT を止めようかと思った次第。
win98 では、2.0 に行かないんなら、上の dll はなんなんだろう
って思ってしまった。
line spacing では、ぐぐると、うまく行かない Q&A があったりする。
7行目の EN_... は EM_... の間違い。失礼。
>>793 _WIN32_WINDOWSを0x410以上と定義って意味わかんないんだけど
>>806 #define _WIN32_WINDOWS 0x410
#include <windows.h>
デバイスコンテキスト上での文字列の長さを知りたいのですが、 どの関数を使えばいいのでしょうか。 宜しくお願いします。
strlen
IEの右クリックで出るメニューの拡張ってどうやるんでしょうか 参考になるサイトがあったら教えてください お願いします
インクルードの前に#define持ってきたらできた
>>812 ありがとうございました
見てみます
…聞いてみるもんだなあ
文字列の長さがしりたいです。 文字列数(strlen)ではありません。 DCにSelectされているGDIOBJCTの状態での文字列の長さを知りたいです。
はあ。 strlenじゃないとすると、GetTextExtentPoint32かな。
長さじゃなくて、幅と言うべきかと。
>>81 8
馬鹿か?黙っていればいいものを、それか、もっと別の面白いことでボケなさい
>>818 文字列をGDIOBJECTとしてDCにSelectできるようなWindowsが出るまで
待ってくだちい。おながいします。
Windows Server 2003 family / _WIN32_WINNT>=0x0502 Windows XP / _WIN32_WINNT>=0x0501 Windows 2000 / _WIN32_WINNT>=0x0500 Windows NT 4.0 / _WIN32_WINNT>=0x0400 Windows Me / _WIN32_WINDOWS=0x0490 Windows 98 / _WIN32_WINDOWS>=0x0410 Internet Explorer 6.0 / _WIN32_IE>=0x0600 Internet Explorer 5.01, 5.5 / _WIN32_IE>=0x0501 Internet Explorer 5.0, 5.0a, 5.0b / _WIN32_IE>=0x0500 Internet Explorer 4.01 / _WIN32_IE>=0x0401 Internet Explorer 4.0 / _WIN32_IE>=0x0400 Internet Explorer 3.0, 3.01, 3.02 / _WIN32_IE>=0x0300
>>816 DrawTextもDT_CALCRECTでRECTで戻してくれるぞ。確か。
824 :
デフォルトの名無しさん :05/03/03 21:55:44
Internet Explorer 5.5 / _WIN32_IE>=0x0501 詐欺だな
Windowsプログラミングができると尊敬されますか?
いんや
むしろ奴隷にされる
奴隷はいやだ! 奴隷はいやだ! 奴隷はいやだ!
830 :
デフォルトの名無しさん :05/03/04 00:53:42
文字列が、Windowsのファイル名として適当なものであるかを判定する関数ってあるでしょうか? hoge("filename.cpp"); //true hoge("text"); //true hoge("."); //「.」一文字はファイル名にならないのでfalse hoge("2005\\03\\05"); //「\」をファイル名に使うことはできないのでfalse こんなことができないかなと・・・
質問です。次の手順でコンボボックスを操作するものとします。(Windows XP) (1) 「ドロップダウン」でコンボボックスを作成 (2) 1つ以上のアイテムを追加 (例:"Windows") (3) 追加したアイテムのうちの1つと同じ文字列を先頭から一部だけ入力 (例:"Win") (4) MoveWindow() もしくは SetWindowPos() でコンボボックスのサイズを変更 このようにすると、フォーカスの有無にかかわらず勝手に "Windows" が選択され、 表示されてしまいます。"Win" を表示したままサイズを変更する方法をご存知の方が いらっしゃいましたら、どうか教えてください。よろしくお願いします。
ふと疑問に思ったんだけど、文字コードを1byteしか使わない国(アメリカ等)の ファイル名に0x81~0x9Fや0xE0~0xFFが使われてる事ってあるのかな?
昔はそう言うコードを持ったファイル名のファイルを埋め込むツールがあって困った。
いかん、メール欄は気にしないでくれ。
>>830 #define hoge(name) strpbrk(name, "\\/:*?\"<>|")
>>830 前に調べたこと歩けど、APIでは用意されてないはず。
書いてあるの以外にも、ファイルの長さチェックやCOM1とかの予約名もあって結構複雑で。
>>838 例の3つ目に書いてある
>hoge("."); //「.」一文字はファイル名にならないのでfalse
でいきなり駄目だと思うけど。
実際にファイルを作ってみて、成功したらOKってことで……。
>>838 一部の漢字を使用したファイル名も使えなくなるね。
ファイル名なんて、ファイルシステムによって違うじゃん。
NTFSはUTF-16だっけ?
しまった、またやったか。
>>834 アメリカなんかのソフトでReadMeとかに突然、半角のゥやョが出てきて何かと思ったら、
欧文フォントにすると©や®になるなんてことはしょっちゅう。これはファイル名じゃないけど。
Photoshopィ
>>839 >>841 うぬぬぬ…
定義済みファイル名は置いといて、
#define hoge(name) (! _mbspbrk(name, "\\/:*?\"<>|") && (*name != '.' || *(name + 1) != '\0'))
これでどうだっっ
>>848 無駄な足掻きを。
".."もダメだし、nameが""だったらname[1]はやっちゃダメだろう。
そういや、Win9X限定で、cd ....とかやれるんだよね。
>852 ..(親)が出来るのは当然。 ...(=..\..)や、 ....(=..\..\..)ができると言う話だ。
854 :
デフォルトの名無しさん :05/03/04 18:31:58
フルパスでファイルを開いた後、相対パスでファイルを開いた時や、 GetOpenFileNameでOFN_NOCHANGEDIRをつけない時などに、 うまく動作しなくなる事があるのですが、これはどういう現象なんでしょうか。
カレントディレクトリが変更されたわけです。 特にGetOpenFileNameはねぇ。
カレントディレクトリが変わってしまうから。
857 :
逆アセ初級者 :05/03/04 18:47:06
>>855 >>866 おおっ、時間がまったく同じ!
なるほど。ドスでcdでパスを変化させますが、
あれと同じようなことが起こっているんですね。
ありがとうございました。
時間が同じでも、レス番が違っていた・・。
>>834 半角カタカナの小さい「ゥ」・・・ゥ
著作権を表わす(c)のかわりによく使われる。
GetFileTitleの反対で、パスの方を得るWin32APIがありましたら教えてください。
GetFullPathName
かなり激しく初歩的なことですが BCCってVBみたいにランタイムみたいなもの必要ないですよね?
>>865 たぶんkernel32.dllあたりが必須。
VBのランタイムもmsvcrt.dllみたいにOS標準であったなら、 こんな差別はなかったかもしれない、ね。
猿でも使えるようにするためにはある程度の犠牲はやむえない。
Win32APIで小数点の扱い方がよく解らないので質問させていただきます。 FLOAT で変数を宣言したのですが、中の値がずっと0と表示されます。 FLOAT a とし、 CHAR ch; wsprintf(ch , "a=%f" , a); TextOut(hdc , 0 , 0 , xh , lstrlen(xh)); (途中を省略しています。) これで「a=0」と表示されます。 何がおかしい、またはここをこうすればよいなど、教えていただきたいです。
>>870 とりあえず、ソースファイルの拡張子を*.cから*.cppに変えてビルドを試してから来い。
Cしか使わないからという短絡的動機で拡張子を*.cにする初心者が多すぎる。
>>870 wsprintfの書式指定にfはありません。
>>871 .cppにしても同じ状態でした。
>>872 小数を扱えて、それを文字列に代入するにはどうすればよいでしょうか?
>>873 どうしてもと言うなら wsprintf(ch,"iTest=%d.%d", (int)a, (int)(a * 1000.0f) % 1000);
>CHAR ch; >wsprintf(ch , "a=%f" , a); これって間違いだよねぇ?
どこでも突っ込み放題だな。
>>875 というかコンパイル通らないだろ。それ?
WinXPでタスクバーの空のツールバーのサブクラス化しようとしたんだけど、 GetWindowLongとSetWindowLongで「アクセスが拒否されました。」が返ってくるんだけど 何かいい方法無いのかな?
要するに、 >これで「a=0」と表示されます。 が嘘な訳で、答える気しない。
880 :
834 :05/03/05 02:20:59
>>835 >>837 >>846 >>861 遅レスですが、勉強になりますた。
やはり、各言語に対応させるには、その言語分の
バージョンを作らないと駄目なんですね…。
1つのアプリで多言語対応…ってファイルを
扱う時点で無理って事ですか(;´Д`)
もし、やるとしたらOSの国コード調べて分岐とか…?
CHAR ch;
>>878 AdvancedWindowsでプロセスとスレッドについて勉強して出直して来い。
マウスホイールメッセージをグローバルフックするのに DLL で SetWindowsHookEx(WH_GETMESSAGE, ...) して、 WM_MOUSEWHEEL が来たら処理しているのですが、 以下の状況ではメッセージが送られてきません。 1.コンソールウィンドウがアクティブなとき 2.最小化ウィンドウがアクティブなとき(Alt+ESC使用時など) 上記の状況でもホイールメッセージを取得できる方法を知りませんか?
WH_MOUSE_LL
>>884 素早いレスどうもです。
確かに WH_MOUSE_LL を使用する方法で試したら解決しました。
でもこの方法は NT系でしか使えないのが難点ですね…。
ひとまずはこれでやってみることにします。
ありがとうございました。
XPなんかのパスワード入力ボックスはどうやって実現したら良いでしょうか。 あの「●●●」って表示されるやつです。
こんにちは HeapAllocで作ったメモリのサイズを調べる関数は何でしょう? char* cp=HeapAlloc( ~ ) cp <-このポインタのデータサイズを知りたい
HeapSize
>>891 MSDNでHeapAllocを見ればSee Alsoに「HeapSize」って入ってるんだか
ら、自分で調べられるようになろうな。
>>892 君、的はずしまくってるんだけど。
多分コメントしようがないと思うぞ。
はずしすぎてて。
GlobalAllocやHeapAllocで、動的にメモリ配置をした場合、 なぜか例外が多発するんです。 文字列の長さを、Setする文字列にあわせて動的にサイズ変更をしたいのですが、 例外が多発します。 この問題はどのようにすればクリアー(解決)できるのでしょうか。
>>894 「クリアー(解決)」
↑
なんでこういう余計なことするの?理由書いてみ?
クリアーと入力した直後に、(消去)と思われないようにするために、(解決)とつき加えました。
そんなもん「つき加え」なくても「クリアー」を削除して改めて「解決」と書けばいいじゃん。 まぁ、ソース晒すのが一番の近道だね。
#include "stdafx.h" #include "Memory.h" CMemory::CMemory(){ //hProcess=HeapCreate(HEAP_GENERATE_EXCEPTIONS,128,64000); } CMemory::~CMemory(){ Release(); } void CMemory::Allocate(SIZE_T size){ pVoid=(char*)HeapAlloc(GetProcessHeap(),HEAP_GENERATE_EXCEPTIONS|HEAP_ZERO_MEMORY,size); } void CMemory::ReAllocate(SIZE_T size){ pVoid=(char*)HeapReAlloc(GetProcessHeap(),HEAP_GENERATE_EXCEPTIONS,pVoid,size); } char* CMemory::Get(){ return (char *)pVoid; }
unsigned long CMemory::GetSize(){ unsigned long ret; ret=(unsigned long)HeapSize(GetProcessHeap(),HEAP_NO_SERIALIZE,(void*)pVoid); return ret; } void CMemory::CopyMemory(CMemory* pSrcMem){ // long size=pSrcMem->GetSize(); ReAllocate(size); // int c; char* pDstMem=Get(); char* pSrcMem2=pSrcMem->Get(); for(c=0;c<size;c++){ *pDstMem=*pSrcMem2; pDstMem++; pSrcMem2++; } } void CMemory::Release(){ HeapFree(GetProcessHeap(),0,(void*)pVoid); }
↓HeapAlloc void CMemory::Allocate(SIZE_T size) ↓HeapReAlloc void CMemory::ReAllocate(SIZE_T size) ↓char*にキャストして返り値 char* CMemory::Get() ↓サイズを得る unsigned long CMemory::GetSize() ↓複製 void CMemory::CopyMemory(CMemory* pSrcMem) ↓解放 void CMemory::Release() 今年からプログラミングを始めた大学生です。 なにぶん、初心者でわからない点が多いのでアドバイスいただけたらうれしいです。
>>894 メモリ確保失敗してるのに文字列をコピーしてるとか
ポインタとハンドル混同してるとか
確保した領域よりデカい文字列入れてるとか
そんなとこだろ
>>896 アホの上塗りか。素直に「アホだから」ってかいときゃいいんだよ。
>>897 まさにその通り。アホのフォローは大変だな。
>>902 ha ha ha
質問者より3ヶ月早くプログラミングを始めただけで上級者気取りか。
おめでてーな。
>>903 技術以前の問題ですが。
それすらも分からないのに勝手に入ってこないでください。
905 :
デフォルトの名無しさん :05/03/05 21:29:40
LVCOLUMNのpszTextにはconst char *を渡しても良いですか? リストコントロールが自分で作ったバッファにコピーして、それを使ってくれるの?
>>903 期間は関係ない。理解度の問題。
10年やってもアフォはアフォ。
>>894 終端null分を確保していないに3000バッファ
>>906 こらこら、君も理解できてないのに分かったようなレスを
しないように。
911 :
デフォルトの名無しさん :05/03/05 23:42:46
ファイルを作成するときに与えられたパスが存在しない場合、 「なんちゃらフォルダを作成します」とか表示してファイルを作成できるAPIはありますか?
フォルダを作成するつってるのに、ファイルを作成するんですか? おかしなAPIですね。
それいただき。
914 :
デフォルトの名無しさん :05/03/05 23:56:26
ファイルを作成するときに、そのパスが存在していない場合、 そのことをユーザーに確認するダイアログを表示し、 OKを押下された場合にフォルダを作成して、 そこにファイルを作成できるAPIはありますか?
>>914 そんなもんはない。
CreateDirectory
MessageBox
この辺使って自分で作れ。
そのうち、「~なソフトを作れるAPIはありますか?」という質問が…
CPhotoshopクラスの使い方を教えてください^^
>>917 CPhotoshop ps;
for(;;)
sell(ps.clone());
通報しますた
僕は何も悪いことはしていませんよ
922 :
デフォルトの名無しさん :05/03/06 00:48:06
CreateNamedPipe()について、 第2引数にFILE_FLAG_OVERLAPPEDフラグを指定しない事と 第3引数にPIPE_WAITフラグを指定する事は同じ意味でしょうか? 同期モード、オーバーラップモード、ブロッキングモード、非ブロッキングモードの 意味を理解するのに混乱してしまっています。
>>915 普通はSHCreateDirectoryEx()でしょ。
>>923 Minimum operating systems Windows 2000, Windows Millennium Edition
だしなぁ・・・
シャアウェアを作るAPIはありますか?
赤く塗っとけ。
>>919 sellのtargetを指定してないな。
エラーを吐くぞ
>>923 ,924
対話ダイアログはないけど
MakeSureDirectoryPathExists()とか。
>>912 Windows使ったことないのか?というか質問の意図が分かってなさそう。
朝からすいません。 フォントを作る際、 int fontsize=12; LOGFONT logfont; memset(&logfont, NULL, sizeof(logfont)); logfont.lfHeight = fontsize; logfont.lfWeight = FW_NORMAL; logfont.lfCharSet = SHIFTJIS_CHARSET; logfont.lfOutPrecision = OUT_DEFAULT_PRECIS; logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS; logfont.lfQuality = DEFAULT_QUALITY; logfont.lfPitchAndFamily = FIXED_PITCH; strcpy(logfont.lfFaceName, "MS ゴシック"); と、フォントのサイズをint fontsize=12;としたのですが、MS-メモ帳と比べてフォントサイズの大きさに違いがあるんですけども、 何か修正しなければならないことはあるのでしょか? MS-メモ帳と同じ大きさにしたいんです。
>>932 たしかメモ帳の初期値はFixedSysの14ポイント。
>>933 ええ、メモ帳のフォントのサイズも「12」と合わせた上で比較したのですが、大きさが異なるんです。
私の知識不足からくるものということはわかってますが、
どこに修正を加えればいいのでしょうか?
935 :
デフォルトの名無しさん :05/03/06 11:39:29
>932 メモ帳のフォントで使われている単位は「ポイント」 それに対して、LOGPONTのlfHeightは「ピクセル」 12センチと12インチを比べても一致しないのと同じこと。 相互変換にはGetDeviceCaps()を使うけど、定番の処理なので検索すればすぐ見つかる。
>>935 解決しました。
ありがとうございます。
937 :
デフォルトの名無しさん :05/03/06 13:19:56
938 :
デフォルトの名無しさん :05/03/06 22:23:51
Win32 VC++のサンプルにあった、Spyプログラムを動かしています。 IE6の各種イベント(ボタンをおしたりメニューを選択したり)はフックできますが (WM_COMMANDがフックされる)、例えばFireFoxのイベントは取得できません (例えばメニュー選択中にMENU_SELECTは発生しない)。 Beckyのイベントはフックで来ますが、Netscape7.1のイベントは取得できません。 すべてのイベントを取得するにはどうしたらよいでしょう?
FirefoxのメニューはそもそもWindowsのメニューコントロール使ってないんだろ。
オープンソースなんだから
メニューコントロールって何よ
WinXPで InitializeCriticalSectionAndSpinCountを使おうと思ってコンパイルしたら error C3861: 識別子は、引数依存の照合を使用しても見つかりません。 と言われて、仕方ないんで#define _WIN32_WINNT 0x0501と書いたらとりあえずエラーは出なくなったんだけど、 これでいいのかな?それとも何か別の正しい方法があるのかな
AdvancedWindows(ry
ウィンドウクラス定義するときの背景ブラシを wc.hbrBackground = CreateSolidBrush(RGB(0, 0, 0)); ってした場合ってこのブラシ破棄しないとダメぽ? あと、BCCとVCとかBCBとかの総合環境ってのはどのくらい違うのでせうか・・。
>>942 その手の定義が必要なものは見たまま、
使用するOSがそのバージョン以上であることを要求するからだよ。
デフォルトの状況だと昔のバージョンのOSでも動く関数しか使えない状態になってる。
仮に
_WIN32_WINNT 0x0501
を定義しないと使えないのであれば、その関数はWinXP以上の環境でないと使えない関数ということになる。
(NT4.0・2000等では動かない)
InitializeCriticalSectionAndSpinCountの説明見ると
Windows NT 4.0 SP3 以降
Windows 98 以降
となっているのでもう少し定義Verをさげられるんじゃまいかな?
面倒なのでその辺は自分でしらべておくれ。
>>944 UnregisterClass時にシステムが破棄するから自分で破棄しちゃだめぽ と書いてある。
自前でUnregisterClass呼ばなくてもプロセス終了時にUnregisterClassされるはずなので
普通にアプリ作る場合はUnregisterClassも呼ばないかな、あんまり。
質問です。 GetCurrentThreadで返されたハンドルを他のスレッドに渡して使わせるには、 DuplicateHandleしないといけないんですよね?
え、プロセス間で共有するときに使うんじゃないの?
950 :
デフォルトの名無しさん :05/03/07 15:11:05
#include <io.h> #include <stdio.h> void main( void ) { intold ; FILE *fp; old = dup( 1 ) ; fp = fopen( "data", "w" ) ; _dup2( _fileno( fp ), 1 ) ; puts( "この行はファイル 'data' に出力されます。\r\n" ); printf("hoge\n") ; fflush( stdout ); _dup2( old, 1 ) ; printf( "foo" ) ; fclose( fp ); getchar() ;//ここのgetcharが、fooより先に表示されてしまうのは、なぜなんですか? } 誰か分かる人いますか?
951 :
あら :05/03/07 15:15:38
ウィルス送ってきて~ お願い
どこら辺がwin32apiなのやら
質問ですが、 GetDC(m_hWnd) したあと、必ずReleaseDCをしなければならないと決まりがありますが、 特にReleaseDCをしなくても、エラーは出ません。 これはGetDCをするたびに、メモリ領域が作成され、 終了後、すぐにReleaseで削除しないといけないということなのでしょうか? GetDCを呼び出す回数が多いので、いちいちReleaseDCを呼び出すのが難です。
>>950 「getcharが表示される」とはどういう意味?
それから、スレ違い。
>>953 WTLについてるCDCとかCPaintDCがお勧め
>>953 文字列表示関数、ビットマップ表示関数などを作って、引数の指定によっては、
関数の中で、Get~Releaseを行うみたいな事をすればいい。
WM_CREATEでGetDCしてWM_DESTROYでReleaseDCすりゃいいよ。
959 :
デフォルトの名無しさん :05/03/07 16:50:38
CreateProcessして出来たプログラムから、 呼び出し元のウィンドウハンドルを得る方法を教えてください。 呼び出し先への引数で、ウィンドウクラス名、ウィンドウタイトル名を渡して、 呼び出し先でFindWindowという方法は思いついたのですが、 ウィンドウクラスが渡せない状況の時はどうすればいいでしょうか。
>>959 ウィンドウクラス名、ウィンドウタイトル名が渡せるのなら
ウィンドウハンドルを直接渡せばいいじゃない。
>>960 すいません。ウィンドウハンドルも渡せません。
例えば、一般のテキストエディタからプログラムを呼び出し、
その引数にテキストエディタ名(.exe)、編集中の.txtを渡して、
呼び出し元の方でなんかやる見たいな事がしたいんです。
>>961 間違えました。呼び出し先でなんかやるです。
編集中の.txtは、ファイル名の事です。
>>961 ウィンドウハンドル渡せない理由が無いが?
>>963 JmEditor2というテキストエディタからプログラムを呼び出したくて、
ツール実行という機能があるので、それで呼び出します。
ファイル名は、当然知っているので簡単に渡せますが、
ウィンドウクラス名、ウィンドウハンドル名は、
JmEditor2の中にアクセスできない状況(ユーザーとして使う状況)では、
分からないと思うのですが。
ウィンドウクラス名、ウィンドウタイトルのみっでは同名クラス同タイトルの別ウィンドウが存在しうるので一意の同定は不可能。
JmEditor2側にそういう仕組みが無いならFindWindow等で調べるしかない。
>>965 >>966 そうですよね。%fとかで、ファイル名は簡単に分かるんですが、
ウィンドウクラス名、ウィンドウハンドルも渡す機能が欲しいです。
所で、テキストエディタから、別のテキストエディタを呼び出して、
その引数に現在編集している.txtのファイル名を渡すと、
(EcoNote.exe(フルパス一時ファイル名) → JmEditor.exe)
呼び出し先で編集して、呼び出し元の.txtも変わる見たいな事が
出来る事が分かったんですけど、これはどういう感じで行っているのでしょうか。
ファイル名しか渡していなく、僕の状況と同じだと思うんですが、
こちらはアクセスして処理できています。
>>967 FindFirstChangeNotificationで監視していて
変更されたら再読み込みしてるとか?
>>968 そのキーワードで調べてみます。
お答えくださった皆様、どうもありがとうございました。
うまくやるやり方が分かった時は、ご報告させていただきます。
970 :
デフォルトの名無しさん :05/03/07 23:07:22
あ、それから「socketライブラリ使えばできるじゃないか」ってツッコミはなしの方向でw
それはWin32APIの質問じゃなくてRubyの質問なんじゃないのか
リストビューコントロールについて2つ質問させてください。 一つ目はカラムの数を知ることができるマクロ(メッセージ)についてです。 ListView_GetColumnCountみたいなマクロがあれば一番なんですが、ないみたいなので 今のところListView_GetColumnでカラムのインデックスを0から増やしていって FALSEが返るまで呼び出すことで数えています。 ただ、このやり方でホントに常に正しく数えられるのかどうか分からないし、 いまいちスマートさに欠けるやり方なのでよりよい取得方法があれば教えてください。 二つ目はListView_GetColumnWidthについてです。MSDNを見ると・・・ If you use the returned string width as the column width in a call to the ListView_SetColumnWidth macro, the string will be truncated. To retrieve the column width that can contain the string without truncating it, you must add padding to the returned string width. となっていて、カラム幅を適切に設定したいならpaddingを足せとのことですが、このpaddingの値を適切に 取得する方法が分かりません。 以上です。どなたかご存知の方がいればよろしくお願いします。
すみません。二つ目の質問のマクロは ListView_GetColumnWidth じゃなくて ListView_GetStringWidth でした。 英文もこっちのマクロの説明です。 あ、あとあげ忘れてた。
>>974 一つ目はListView_GetHeaderしてHeader_GetItemCountかな。
>>977 どうもです。一個目のほうはうまくいきました。
二つ目は今のところ適当に10pixelほど足してごまかしています。
カラム間の境界部分をダブルクリックするのをエミュレートすれば勝手に幅を整えてくれるとも
考えたのですが、なんか余計に泥臭くなってしまいそうでいまいちです。
Windows内部ではこの幅の調整の処理をうまく行えているということは
何か方法があるとは思うのですが・・・
単純にカラム幅をアイテム幅に合わせたいなら ListView_SetColumnWidthをLVSCW_AUTOSIZEでかな。
>>979 ガ━━(゚Д゚;)━━━ン!!
・・・今までの苦労はいったいorz
何はともあれ、どうもありがとうございました。
982 :
デフォルトの名無しさん :05/03/08 09:40:48
WMIでワークグループ取得ってどこでやるんでしょうか? Win32_NetworkAdapter Win32_NetworkAdapterConfiguration Win32_NetworkAdapterSetting を使ってみたのですが、該当項目が見当たらなくて。 取得不可能??
>>982 Win32_ComputerSystemのDomainじゃダメ?
984 :
デフォルトの名無しさん :05/03/08 10:59:30
>>983 とれました!
ネットワークと違うところに格納されているとは盲点でした。
ありがとうございました。
WNDClASSで決まっているスタイルを変更する方法を教えてください。
>>985 SetClassLongPtr 関数を使え。
できました、ありがとうございました。
window messageをアプリケーションに送るツールありませんか?
SendMessage(otherAppHWnd, WM_APP, wParam, lParam);
次スレまだー?
【AdvancedWindows】Win32API質問箱 39【読め】
39かよっ!
【AdvancedWindows】Win32API質問箱 29【読め】
梅
梅
(( ) ) ノ /^l'"'"~/^i'ツ'ッ., (( (( ヾ ヾ モフー・・・ ) ) 丿 ミ ´ ∀ ` 彡 (( ( ノノ ッ _ ミ ∴∵ >> (´彡,. (,,_,ノ _,,.ヽ //》||ヾミ\ "'"'゙''""''''゙""´
ume-
このスレ終了。続きは次スレ。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。