1 :
はじめてのスレ立て :
2007/12/06(木) 02:13:50 これからもヨロシクな
1が使えないので、代わりにテンプレ貼っとく。
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。
過去スレ、関連リンクは
>>4-7 くらい。
■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(
http://msdn2.microsoft.com/library/ )の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
以上、1の代わりにテンプレ貼り。 デスクトップ2chの長期メンテナンス、にくちゃんねるの終了により、 最後を独断で一部変更。
>>8 乙です
FPSを計るプログラムを書いてみたんですが
実行すると"14,15FPS"位の時と"140〜160FPS"位出る時に何故か分かれます
普通に実行した場合が前者で、2ch見てると後者になるんですが
理由がよく分かりません、こういうのはパソコン側の問題なんでしょうか?
CPU使用率っていうのも取ってみました 前者が100%で後者はもっと低くなっていました google見ても後者になったのでブラウザ立ち上げるとなるみたいです
いい加減スペル直そうぜ
12 :
デフォルトの名無しさん :2007/12/06(木) 18:12:25
質問です。 自分以外のウインドウがアクティブになっているときでも、 キーボード入力があればイベントが発生するようにプログラミングするには、 フックが必要になるのでしょうか? フックを使わずにこれを行う方法はあるのでしょうか?
>>12 特定のキーの組み合わせだけでよければ、ホットキーというのもある。
使用するAPIはRegisterHotKey/UnregisterHotKey
「共有フォルダ/ネットワークドライブ」がリムーバルドライブ上に存在するかを確認する方法てありませんか?
>>9 お前は本当にそれでレスが付くとでも思ってるのか?w
UpdateLayeredWindowで半透明にしたウィンドウに文字列を表示しようとしてます。 HDC hScreenDC = GetDC(0); HDC hWndDC = CreateCompatibleDC(hScreenDC); HBITMAP hBmp = CreateDIBSection(0, 略, (void **)&bmpData, 0, 0); /// bmpDataに背景を直接描画 DeleteObject(SelectObject(hWndDC, hBmp); ///ここでTextOut 略 UpdateLayeredWindow(hWnd, hScreenDC, ... , hWndDC, ... , ULW_ALPHA); としてみたところ文字列は表示されますが、文字列の表示領域の背景がおかしくなって、 文字列自体も透明度100%の状態で表示されます。 これを半透明のウィンドウに自然に文字列が表示されるようにはどうすればいいですか。
テキストの背景ブラシに透明ブラシを設定するとかなんとか
18 :
デフォルトの名無しさん :2007/12/07(金) 01:09:34
SetBkMode(TRANSPARENT); 最高に頭の悪い発言をしてみた(テヘッ
/\___/\ / ⌒ ⌒ ::: \ | (●), 、(●)、 | / ̄ ̄ ̄ ̄ ̄ | ,,ノ(、_, )ヽ、,, | < やるじゃん | ト‐=‐ァ' .::::| \_____ \ `ニニ´ .:::/ /`ー‐--‐‐―´´\
/\___/\ / ⌒ ⌒ ::: \ | (○), 、(○)、 | / ̄ ̄ ̄ ̄ ̄ | ,,ノ(、_, )ヽ、,, | < わろたよ | ト‐=‐ァ' .::::| \_____ \ `ニニ´ .:::/ /`ー‐--‐‐―´´\
21 :
デフォルトの名無しさん :2007/12/07(金) 02:22:08
全画面表示(っていうのかな? 、クライアント領域をデスクトップにバァっとかぶせる感じにしたいんだけど 以下のコードじゃうまくいきません どうしたらいいですか? ShowWindow(FindWindow(TEXT("Shell_TrayWnd"), NULL), SW_HIDE); GetWindowRect(GetDesktopWindow(), &rc); AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, TRUE); MoveWindow(hwnd, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE); どこかおかしいでしょうか?
>>17-18 文字列表示領域の背景が変になるのはそれで直りました。
文字列事態が透明になってしまうのはTextOutでの文字列描画が32bitで
記録されないためのようです。
bitmapDataからα値が0のところを0xffに書き換えてやるとちゃんと表示されました。
が、およそ全てのピクセルを一度チェックしないといけないため非効率に思われます。
32bit値で文字列をbitmapDataに描画する方法があれば引き続き教えて下さい。
どう上手くいかないんだよ
>>22 よく考えれば分かる気が
GetDC(0)〜CreateCompatibleDCで半透明ウィンドウ用のDCを生成してるって事は
hdcのビット深度は24ビットになってる
それならtextoutが24ビットで出力するのは当然だと思う
32ビットで出力したければ(以下略
LVM_SETICONSPACING で ListView のアイコンの間隔を変えてやると, ListView の認識しているアイコンの位置は中途半端にしか変わって ないみたいで,シフトキーを押しながらマルチセレクトをした時に ずれて選択されっけど,これって仕様なの?
26 :
デフォルトの名無しさん :2007/12/07(金) 11:26:37
27 :
23 :2007/12/07(金) 11:32:10
とりあえず >ShowWindow(FindWindow(TEXT("Shell_TrayWnd"), NULL), SW_HIDE); これおかしいだろ Shell_TrayWndってタスクバーじゃなくて端の通知トレイだろ
>>22 >>24 GDIの昔からある描画関数は32bit対応が全く考慮されてない
半透明対応で文字描画するならGDI+使うかDrawThemeText
30 :
デフォルトの名無しさん :2007/12/07(金) 12:38:42
VC#からWinAPIって使えるんですか?
使える
32 :
デフォルトの名無しさん :2007/12/07(金) 14:43:39
UTF-8をデコードする方法を教えてください
このスレで聞いてるってことはAPIで? MultibyteToWidechar()を使えばいい。 コードページはCP_UTF8
>>33 そうですAPIで探していました。
ありがとうございます。
早速ためしてみます
35 :
デフォルトの名無しさん :2007/12/07(金) 15:00:18
親ウィンドウのプロシージャ内から、ウィンドウを作成しようとしたのですが、 CreateWindowに失敗してしまいます。エラーコードは1401でメニューハンドルが無効とのことです。 このウィンドウは子ウィンドウではなく独立したウィンドウとして作成しています。 hMyWnd = CreateWindow( "MyWnd", NULL, WS_VISIBLE | WS_CLIPCHILDREN, NULL, NULL, 300, 50, NULL, (HMENU)MYWND, GetModuleHandle(NULL), NULL); どこが間違っているのでしょうか?ちなみにメインとなるウィンドウプロシージャのWM_CREATE内で作成しています。
(HMENU)のところ、IDを入れていいのはWS_CHILDな子ウィンドウだけだぞ
hMenuのとこにIDが入ると子ウィンドウ ID 、ハンドルが入るとメニュー扱い。
38 :
デフォルトの名無しさん :2007/12/07(金) 15:15:14
>>36 まじすか・・・。NULLにしてみたらウィンドウを生成できました。
実はこの後WS_EX_LAYEREDを追加したいので子ウィンドウには出来ないのですが、
WS_CHILD属性を持ってないと持ってないでまた不便ですね。
WS_EX_LAYEREDが子ウィンドウに使えたらいいのに・・・
>>38 だからID使わないでLoadMenu使えばいいでしょ。
メニューIDとウィンドウIDを混同してないか? WS_CHILDなウィンドウでないとウィンドウIDは持てないぞ?
Vistaのエクスプローラでは、サムネイルプロバイダから取ったイメージに 「動画用」とか「静止画用」みたいにフレーム装飾を付けて表示できますけど、 その「装飾済みのイメージ」を取得する方法ってないでしょうか?
あほな質問してごめんなさいと言え
あほな質問してごめんなさい
ハッ!
45 :
21 :2007/12/08(土) 02:41:10
何がおかしいかというと、自分の考えとしては、クライアント領域がデスクトップ全面を覆ってしまう ようになってほしかったのですが、(つまり、背景白のクライアント領域で、全く描画していない状態だと、 デスクトップが真っ白になるという状態)、タスクバーの部分だけはそのままデスクトップの壁紙が見えてるという状況になっているんです。 ShowWindow(FindWindow(TEXT("Shell_TrayWnd"), NULL), SW_HIDE); //これでタスクバーは消えます(壁紙が見えるようになる) GetWindowRect(GetDesktopWindow(), &rc); //デスクトップのサイズを取得して AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, TRUE); //それをクライアント領域のサイズとするように、ウィンドウの位置、サイズを取得 MoveWindow(hwnd, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE); //で、ウィンドウを移動&リサイズ AdjustWindowで返されるRECT構造体を見る限り、自分の想定どおりの値が返ってきてるのですが・・・
46 :
デフォルトの名無しさん :2007/12/08(土) 02:46:06
勝手にタスクバー消すのはどうかと… それはそうと、たぶんWS_OVERLAPPEDがだめなんじゃないかなと思う WS_POPUPにしてみたら?
47 :
デフォルトの名無しさん :2007/12/08(土) 04:37:15
WS_OVERLAPPEDがダメな理由は??
ジョークソフトなら兎も角、勝手にタスクバー消すなんて行儀悪すぎだろ ま、どうしてもタスクバーが邪魔ならウィンドウを画面サイズにして最前面表示するかDirectXだろう スクリーンセーバがやってる方法だな
50 :
デフォルトの名無しさん :2007/12/08(土) 11:16:31
ウィンドウのリサイズ等をしたときにビットマップがちらついて困ってます。 CreateCompatibleBitmapというものを使えばちらつきが防げるようですがイマイチ使い方が分かりません。 WM_CREATEで hBmpOff = LoadBitmap(((LPCREATESTRUCT)lp)->hInstance, MAKEINTRESOURCE(IDB_BITMAP1)); のようにビットマップを読み込んだ後、WM_PAINTでどのような処理を行えばいいのでしょうか?
52 :
デフォルトの名無しさん :2007/12/08(土) 12:41:30
>>51 一応全部読みました。ビットマップは画像と考えるよりもブラシと考えたほうがよさそうですね。
しかしやっぱり理解できません。WM_PAINTが発行されたときに、再描画領域にあるものは
一度全部消されるんですよね?InvalidateRectなどの引数でFALSEなどが指定された場合を除いては。
実際はこのCreateCompatibleBitMapはWM_CREATE内で何をするのでしょうか?
CreateCompatibleBitmapから離れろよ CreateCompatibleBitmapは デバイスコンテキストと互換性のあるビットマップを作成する関数であって これ自体がちらつきを抑える機能を持っているわけではない ちらつきを抑えるってのは再描画をなるべくしない事だ 裏で別のデバイスコンテキストを用意して必要な描画を全て終えてから表に転送する
なんでちらつくかというと、背景塗りつぶし→描画の過程が見えてしまうから。 背景を消去する必要が無ければ、ウィンドウの背景ブラシをNULLか WM_ERASEBKGNDを自分で処理すればいい。
まずは、ウィンドウクラスのスタイルから CS_HREDRAWとCS_VREDRAWを外してからだな。
56 :
デフォルトの名無しさん :2007/12/08(土) 14:10:51
その裏で用意するのがメモリDCですよね?それで裏で描画処理を終えてから表に転送するという事は、
背景塗りつぶし→描画 から 裏で描画→それで上書き になるって事で合ってますか?
なんかちょっと分かってきたような気がしないでもないような・・・
>>55 CS_HREDRAWとCS_VREDRAWをはずしたらちらつきがなくなりました。
なんか当然のようにいつも指定しているスタイルなので盲点でした。
しかし、このスタイルよく考えたらあまりいらないな。。。
要らなくはないだろ。 でも、HREDRAWとVREDRAWに分ける意味は分からん。 単独で使うことあるのか?
スクロール方向が固定ならありかもね
>>21 ゲームのように一定のサイズ(800x600など)でしたいわけではないんですよね。ChangeDisplaySettingsとかでやったり、DirectXのメソでやったりあるが。スクリーン全体の幅を求めるのは GetDeviceCapsとかもある。
プロシャージャ内で
static RECT rcClient; 作成時にでもとっておくGetWindowRect(hWnd, &rcClient);
static RECT rcScreen; GetWindowRect(GetDesktopWindow(), &rcScreen); AdjustWindowRect(&rcScreen, WNDSTYLE, FALSE);
フル化したいとき MoveWindow(hWnd, rcScreen.left, rcScreen.top, rcScreen.right - rcScreen.left, rcScreen.bottom - rcScreen.top, TRUE);
元に戻したいとき MoveWindow(hWnd, rcClient.left, rcClient.top, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top, TRUE);
case WM_GETMINMAXINFO: {
RECT rc; LPMINMAXINFO lpmmi = (LPMINMAXINFO)lParam;
GetWindowRect(GetDesktopWindow(), &rc); // デスクトップのサイズを取得して
lpmmi->ptMaxSize.x = rc.right - rc.left; lpmmi->ptMaxSize.y = rc.bottom - rc.top;
AdjustWindowRect(&rc, WNDSTYLE, FALSE); // 最大値を変更、終了時に元に戻したほうがいいかも
lpmmi->ptMaxTrackSize.x = rc.right - rc.left; lpmmi->ptMaxTrackSize.y = rc.bottom - rc.top;
} return 0;
改行多いとかで書き込めなかったので、読みやすいように書いてね。spy++でどういうメッセージやり取りしているのか見たけど、WM_NCCALCSIZEとか使うのかもしれないが。
WM_TIMERだと精度が悪いんで、QueryPerformanceCounterを使って タイマーイベントを発生させたいんですけど、単純にwhile文で回して カウンタをインクリメントして、カウンタが一定値になる度にメッセージを 投げるようにすると、CPU使用率100%になってしまいます。 下記にソースを載せます。 CPU使用率を余り上げずに精度の高いタイマーイベントを取得する方法はないでしょうか。 unsigned __stdcall timerthread(void *lpx){ __int64 hindo; int ms = *(int*)lpx; if( QueryPerformanceFrequency( (LARGE_INTEGER *)&hindo ) == TRUE ) { //hindoに、精度/secが入る __int64 count; // __int64 def_count; // //ms(ミリ秒)ごとにMY_TYMERを送る QueryPerformanceCounter( (LARGE_INTEGER *)&def_count ); while(1){ do { QueryPerformanceCounter( (LARGE_INTEGER *)&count ); } while( count - def_count < (hindo*ms/1000) ); def_count = count; SendMessage(hWnd_copy, MY_TIMER, NULL, NULL); } } else { Debug("***1.パフォーマンスカウンタは実装されていません。***"); } return 0; }
ms単位の制御は無理だろ…Windowsじゃ
その関数の頭に timeBeginPeriod(1); を入れて ループの中に Sleep(1); を入れて 最後に timeEndPeriod(1); を入れるんだ
timeSetEvent
>60 昔見た手法ではWM_TIMERで大まかに時間を刻んで、残りをQueryPerformanceCounterで 時間待ちをして精度を出すってのをやってたが。
fpsに大体合わせて動作させるのに、 マルチメディアタイマーで1ms毎に割り込ませつつ、 予め作っておいた時間間隔テーブルに合わせて実行 ってな感じの作り方をしたことがあるな。ゲームじゃないけど。 テーブルは、60fpsだと{ 16, 33, 50, ,,, }という風に1秒分を整数演算で生成。
68 :
60 :2007/12/08(土) 23:10:23
>>61-67 timeBeginPeriod, timeEndPeriod, timeSetEventを使ってみたところ
安定してタイマイベントを発生させることが出来ました。
ありがとうございました。
69 :
デフォルトの名無しさん :2007/12/09(日) 08:34:58
>>59 ありがとうございました。
思い通りの結果が得られました。
貴重な助言、ありがとうございました。
いまいちMINMAXINFOのそれぞれのメンバーがどういった効果を持つのか不明なので
いろいろ実験してみます。
本当にありがとうございました。
>>69 > MINMAXINFO
Windows がウィンドウサイズを変更する前にそのウィンドウに
「君はどの範囲でサイズを変更してもいいのかな?」
とお伺いを立てるメッセージとその返却に使う構造体。
71 :
デフォルトの名無しさん :2007/12/09(日) 10:45:34
>>70 それはわかってるんだけど、ptMaxSizeに値を設定して、ptMaxTrackSizeに値を入れないと
全画面化したときに、タスクバーの部分は除外されてしまうし、
ptMinTrackSizeに値をいれないと、クライアント領域がほとんどゼロみたいなウィンドウが表示されるし
そこら辺を色々試してみようかな、と思ってる
72 :
デフォルトの名無しさん :2007/12/09(日) 13:36:31
>>70-71 lpmmi->ptMaxSizeは必要ないな
ptMaxTrackSizeさえ設定しておけばOK、のようだ
VC2005でオーナードローを使ってテキストボックスの描画の殺し方を教えてください。 ボタン等のオーナードローの方法は分かるのですがテキストボックスのオナードローは良く分かりませんでした。 ご教授よろしくお願いします
WindowsXP SP2 VC++6.0で動くプログラムの 共有メモリについて質問があります。 ページングとメモリマップドファイルについて 以下の認識であっていますでしょうか? 1) Windowsでメモリを確保した場合、OSの決めた優先順位により、ページング作業で 特定できないタイミングで外部記憶装置に書き込まれる場合がある。 2)メモリマップドファイルはメモリ上に配置され、実際にファイルに書き込むことはしない。 ただしページングは発生する。 3)設定でページング無しにすると、ページングは発生しない。 4)物理メモリを動的に確保する場合、要求サイズを超える連続した物理メモリが無い場合 ページング作業が発生する。3)でページングなしにすると確保できない。 3Mのデータを動的にメモリに確保して処理する作業を一定時間で1日2万件くらい処理した いのですが、ページングが発生すると、問題がありそうなのでどうにかしたいのです。
>>74 まず、仮想メモリと物理メモリについて調べるとよさげ。
プロセスから見えるメモリ空間が仮想メモリで、これを適当なサイズで区切ったのがページ。
物理メモリも同じサイズで区切って、これらを 1:1 で対応付けるのが OS の仕事。
使ってないと判断されたプロセスの特定ページをディスクに退避して空きを作るのがページング。
退避した仮想アドレスにアクセスが発生した瞬間に OS が検知して書き戻す。
たとえ物理メモリ上でページが連続していなくても、仮想メモリ上では連続して割り当てられる。
普通のアプリケーションならこんなこと気にする必要はない。
プロセスから見えるアドレスはいつでも連続してるし存在してると仮定しておk。
直接物理メモリをどうこうするのはデバイスドライバとか書かないとできない。
質問です。 最前面化したウィンドウを一切入力が出来ないようにするにはどうすればいいのでしょうか? SetLayeredWindowAttributesで半透明化し、SetWindowPosで最前面化したウィンドウ(A)をEnableWindowで入力無効化してみたののですが、その下に透けて見えているウィンドウ(B)を操作することが出来ません。 (AとBが重なっていない所ではBを操作できるのですが、重なっているとろでマウスクリックをすると、Bからフォーカスが外れてしまう) イメージ的には「マウスカーソルをAとBの間に滑り込ませる」ようにしたいと思っているのですが、どうやったらそれが出来るのかがわかりません。 お願いします。
むり
レイヤードウィンドウなら、WS_EX_TRANSPARENTをつければ、マウス操作は全部透過するはず。
79 :
76 :2007/12/09(日) 18:25:45
>>78 その方法で出来るようになりました。ありがとうございます。
>>74 1) ある。
2) なんのこっちゃわからん。
3) 発生する。例えばプログラムの実行コードはexeファイルをメモリマップしてるだけなので、コードを実行するその時々に必要な部分部分だけをexeファイルからページインし、そのメモリを他の用途に使う必要が生じたらページアウトする。
4) 物理メモリが連続してる必要は無い。飛び飛びでも空いてれば使える。ページングなしに設定していれば、exeの実行コードとかディスクキャッシュといった、再ロード可能/破棄可能なページを回収して要求に応える。それでも足りなければ確保できない。
VC++ 6.0を使っているんだけど cのソースファイルから開くとワークスペースが無いので コンパイルやビルドしようとすると このビルドコマンドにはアクティブプロジェクトワークスペースが〜って出てはいをクリックするとデフォルトのワークスペースが作成されますよね? でも、今私が見ているソースは主にwin32アプリケーションなので プロジェクトの設定がwin32アプリケーションの方が都合が良いわけです。 デフォルトのワークスペースをwin32アプリケーションに対応する方法などはありませんか?
それはWin32APIの質問なのか?
>cのソースファイルから開くとワークスペースが無いので >コンパイルやビルドしようとすると >このビルドコマンドにはアクティブプロジェクトワークスペースが〜って出てはいをクリックするとデフォルトのワークスペースが作成されますよね? ふつーcl。
74です。回答ありがとうございます。 仮想メモリと物理メモリをもう少し理解を深めてきます。
今時VC6てw と、ドトネトインスコしたくないのでVC6使ってる漏れが言ってみる
VC2005だって、ドトネト使わない開発できるだろ? もしや俺の知らないところで、ドトネト暗躍してるのか!? いやユーザに配布してんだ、そんな筈は!
msvcrt.dllを使うために未だにVC6。
90 :
デフォルトの名無しさん :2007/12/10(月) 04:35:32
ファイル名として適切ではない文字を、「-」に置き換えてくれるような関数はないでしょうか? 例えば int CheckPath(LPCTSTR lpPath, LPTSTR lpCheckedPath); lpPathで、例えばユーザーが入力したパス「ホゲホゲ12/10」を「ホゲホゲ12-10」に直して返してくれるような関数です。 IEなんかにも実装されていると思うんですが
それぐらい自分で作れよ
93 :
デフォルトの名無しさん :2007/12/10(月) 08:10:38
ウィンドウがアクティブかノンアクティブかを調べるにはどうすればいいですか? WM_ACTIVATEにおいてフラグを設定しているのですが、イマイチ挙動がおかしいような気がします。 ウィンドウのアクティブ状態を調べるにはWM_ACTIVEでフラグを設定するだけではいけないのでしょうか?
アクティブウィンドウって一個じゃないよ フォアグラウンドウィンドウは一個だけど
95 :
デフォルトの名無しさん :2007/12/10(月) 09:32:54
>>94 MSNのメッセンジャーみたいに、ノンアクティブの時に右下にウィンドウを出したいのですが、
あれはアクティブでない時にウィンドウを出してるのではなく、フォアグラウンドでない時に出してるってことですか?
今までのアクティブの認識が間違ってたせいか、ちょっと混乱しています。
フォアグラウンドになった時、フォアグラウンドでなくなった時に発行されるメッセージとかあるのでしょうか?
メッセージはWM_ACTIVATEだったと思う WM_ACTIVATEで次にアクティブになるウィンドウを調べて 自スレッドの所属してなければ非フォアグラウンド化でいいんでは
98 :
デフォルトの名無しさん :2007/12/10(月) 09:57:14
>>96 あれ?WM_ACTIVATEで処理してたんですけどね・・・
WPARAMの下位ワードの値を見てWA_INACTIVEだったらアクティブフラグをFALSEに
それ以外の値であればアクティブフラグをTRUEにするのではダメですか?
>>93 その用途ならWM_ACTIVATEAPPかも。
100 :
デフォルトの名無しさん :2007/12/10(月) 13:33:33
ウィンドウが最小化されてるかどうかを調べる関数が思い出せない。 なんだっけ?
IsIconic
102 :
デフォルトの名無しさん :2007/12/10(月) 14:02:24
それだ!Thx!
103 :
デフォルトの名無しさん :2007/12/10(月) 14:05:45
>>99 おぉそれを使ってなんとかできました。
アクティブ化の判定をWM_ACTIVATEでwpの上位と下位ワードを使って行って、
非アクティブ化の判定をWM_ACTIVATEAPPのwpの値を使ってやりました。
ありがとうございました。
104 :
デフォルトの名無しさん :2007/12/10(月) 14:26:56
と思ったら、なんかタスクバーをクリックで最小化する時の動作が若干変に・・・ メインウィンドウと、メインウィンドウ内で作成したTOPMOSTのレイヤードウィンドウがあるのですが、 メインウィンドウがノンアクティブになったら、レイヤードウィンドウを非表示にするという動作をします。 ここで、タスクバーのアイコンを2回押さないと最小化しないのですが、どういう原因が考えられますかね?
105 :
デフォルトの名無しさん :2007/12/10(月) 14:33:20
て、分かるわけないですね、ソースもうpせずに。 とりあえずタスクバーのアイコンをクリックして最小化するのと、 ウィンドウの右上の _ マークを押して最小化するのと、何が違うのでしょうか? 詳しくは分からないのですが、タスクバーをクリックして最小化しようとすると、 一回目のクリックで、一瞬ノンアクティブになってまたすぐにアクティブになるような挙動をしてるように思えます。 2回目のクリックでは普通にノンアクティブになる感じなのですが・・・
つspy++
>>105 >タスクバーのアイコンをクリックして最小化するのと、
>ウィンドウの右上の _ マークを押して最小化するのと、何が違うのでしょうか?
タスクバーをクリックして最小化
→まずタスクバーがアクティブになる
108 :
デフォルトの名無しさん :2007/12/10(月) 14:47:47
っと自己解決しました。原因は↓でした。
メインウィンドウがアクティブになると、それまで非表示にしていたTOPMOSTのレイヤードウィンドウを再表示に。
ここでShowWindow()によってフォーカスがレイヤードウィンドウに移動、メインウィンドウはフォーカスを失う。
次にタスクバーのアイコンをクリックするけど、ここでは最小化せずに、フォーカスがメインウィンドウに移動するだけ。
最後にタスクバーのアイコンをクリックでようやく最小化しました。
てことで、ShowWindowのあとにSetFocusでメインウィンドウにフォーカスを持っていくことで解決しました。
一人で騒いでてすみませんでした。
>>106 spy++苦手だったり・・・。
つSW_SHOWNOACTIVATE
110 :
デフォルトの名無しさん :2007/12/10(月) 14:53:09
>>109 なんと・・・。今までSW_HIDEとSW_SHOWしか使ったことなかったのですが、
それキーワードにググって見たらShowWindowにも色々定数が用意されてるんですね。
これを機会に色々覚えておこう・・・
覚える必要はない。MSDNで調べるクセをつけろ。
>>110 ってか……ShowWindow使ってりゃ、何があるかぐらい分かるだろ。
調べるのはSW_SHOWやSW_HIDEではなく、ShowWindowの方だぞ。
ウィンドウを強制的に再描画させるためにInvalidateRectを使ってるんですが 描画がやたら重くなってしまいます WM_PAINT以外を受け取ったときに再描画する、もっとスマートな方法はあるでしょうか?
>>113 WM_PAINT以外では描画してはいけない、という決まりは無い。
WM_PAINTのハンドラとは別に、
更新に必要最小限の描画だけを行うルーチンを用意すればいい。
再描画の際に、クリップ系APIで本当に描画が必要な領域を
判定するだけで済む話かもしれないけど。
115 :
113 :2007/12/10(月) 22:53:06
>>114 普通にBitBltで描画したら若干軽くなりました。
でもなんだか根本的な不具合が解決してないっぽいので
もう少し調べてみます。ありがとうございました。
だぶるばっふぁりんぐ
子プロセスとして起動させるコンソールアプリケーションの標準出力を奪い取り処理したいと考えています FStartupInfo.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW; FStartupInfo.wShowWindow := SW_HIDE; CreatePipe(FhStdout, hStdout, @FSecurityAtt, BUFF_SIZE-1); にてパイプを作成し、 CreateProcess(nil, PChar(name), @FSecurityAtt, nil, true, CREATE_NEW_CONSOLE, nil, nil, FStartupInfo, FProcessInfo); にてプロセスを作成し、PeekNamedPipeにて取り出しています 負荷の軽い処理の場合は問題なく動作するのですが、重い場合(重いI/O処理を行っている場合)は標準出力を拾えません 処理が軽くなってからまとめて取り出されます。 データの取りこぼしこそありませんが、リアルタイム性を重視しているため困っています ためしにコンソール(cmd.com)からプロセスを起動してみると標準出力には送られていますし 標準入力をはき出すecho.exeを作成し、cmd.comからecho.exe|target.exeとすればちゃんとパイプ処理されます 多分、CreatePipeで作成されたパイプはバッファをフラッシュされない限りPeekNamedPipeで拾えないように思えるのですが、何か方法はありませんか? CreateProcessで 'CMD /C target.exe'とcmd.comを通す方法も試してみたのですがダメでした
子プロセス側が、自前のバッファリング機構をもっているというオチではなかろうね
119 :
デフォルトの名無しさん :2007/12/11(火) 02:54:56
>>92 PathCleanupSpecを使ってみたけど、戻り値は0だし、第二引数の文字列にも何も返ってこない
>>119 自作すればいいだろ
その程度の文字列処理もできないならC言語を勉強し直した方がいい
>>118 stdio.hを利用した一般的なコンソールアプリケーションは意識的、無意識的を問わずバッファリング機構を使用していると理解しています
PathCleanupSpecだって \/:*?"<>| を取り除いてるだけだしね
>>121 そういう問題じゃなくて、子プロセスが出力をプールするバッファを持ってて
一定量になる度にパイプに出力してんじゃねえのかって話
>>119 MSDNは読んだか?
APIの使い方はあってるんだよな?
であれば、残念ながらこのAPIでは要件を満たさないようなので、
>>120 の言うとおり自作するしかないね。
shiftjisで渡してんじゃないの? unicodeだぞ
126 :
デフォルトの名無しさん :2007/12/11(火) 07:18:53
127 :
デフォルトの名無しさん :2007/12/11(火) 07:41:53
SetTimer(hwnd, TM_START, 30, NULL); でタイマーを作成したのですが、WM_TIMERメッセージが来ません。 NULLを返していないのでタイマーの作成でこけてるわけじゃないのですが・・・ どういう原因が考えられますか?
>>126 そのAPIの呼び出し周りのソース晒せば?
ありえないと思うけどWM_TIMERイベントの優先度はメッセージの中で一番低いから 他に処理すべきメッセージが入ってきてる時はGetMessageで取り出せない
131 :
デフォルトの名無しさん :2007/12/11(火) 08:18:58
>>129-130 早い回答ありがとうございます。昨日からずっと悩んできたのですが、
今目的の動作をしました。しかし意味がよく分からないです。今から仕様を書きます。
メインウィンドウ生成 → スレッド作成
スレッド内でサーバーとのメッセージのやり取りを行う。
ある特定のメッセージが来たらCreateWindowでウィンドウ(新着ウィンドウ)を作成する。
新着ウィンドウのプロシージャでタイマーを作成し、一定時間が過ぎたら自分で自分を破棄する。
で、この新着ウィンドウの生成はmyCreateWindow()という関数を作り、そこで作成を行っています。
スレッド内からmyCreateWindow()を呼び出した場合、先ほどのようなタイマーが発行されないという問題が起きます。
しかし、このスレッド内からmyCreateWindowを呼び出すのではなく、
まずSendMessageでユーザ定義のメッセージをメインウィンドウに送り、
メインウィドウがそのメッセージを受け取ったら、そこでmyCreateWindowを呼び出し新着ウィンドウを生成する。
こんな流れて作成した場合正常に動作しました。全く意味が分からないのですが、
スレッド内からの関数呼び出しと、メインウィンドウからの呼び出しで何かが違うのでしょうか?
嫌な予感… 別スレッドにTIMERイベントがポストされてないか?
>>126 ここにぐだぐだ書いてる暇があったら自作できるだろ
時間を無駄にするなよw
134 :
デフォルトの名無しさん :2007/12/11(火) 08:26:38
>>132 SetTimerが成功して、かつWM_TIMERが発行されない事を考えるとその可能性もないとは言い切れないですね。
一応spy++で確認したのですが、新着ウィンドウのプロシージャにWM_CREATEは来てませんでした。
しかし、新着ウィンドウのプロシージャのWM_CREATE内で、SetTimer(hwnd, , , );をしているのに
他のプロシージャにWM_TIMERが行く事ってあるのでしょうか?
一応新着ウィンドウのプロシージャの定義は
LRESULT CALLBACK NewWindowProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
としてますし・・・。もしかしてこのhwndに変な値が・・・いや、そんな事は・・・。
135 :
デフォルトの名無しさん :2007/12/11(火) 08:27:43
>>134 すみません、書き間違えです。2行目のWM_CREATEはWM_TIMERの間違いです。
WM_CREATEが発行されてるのは確認できています。
APIでは無いのですが、ビットマップフォントのフォントファイルを作るにはどうすればいいのでしょう? .FONや.FNTは、バージョン2と3共に、開始文字と終了文字の指定が1バイトで、半角文字しか作れなさそうなのです。
ウィンドウを作成したスレッドに、ウィンドウは属する。で、
>>132 GUI系の操作はメインスレッドに統一するのが常識だ。
138 :
デフォルトの名無しさん :2007/12/11(火) 11:22:16
馬鹿な質問をしてごめんなさいって家!
ごめんなさい
MFCも使っているのですが、APIに関連しているので、 こちらで質問させていただきます。 WindowsのTCHARって、Unicodeビルド時はwchar_tになりますが、 これは16ビットですよね。 ということは、TCHAR文字列はUTF-16しか扱えないということなのでしょうか。 UTF-8のUnicodeファイルを読み込んでCStringに入れ、 それをエディットボックスなどにSetWindowText()したいのですが、 単にUnicodeビルドでCStringにReadString()してもダメということでしょうか。
CStringA使えばいいじゃない
142 :
デフォルトの名無しさん :2007/12/11(火) 12:06:28
SendMessageで自分で定義したメッセージを送る時にWPARAMの上位ワードと下位ワードそれぞれに 値を格納したいのですが、どのようにすればいいのでしょうか? LOWORD(wParam) = (WPARAM)hWnd; HIWORD(wParam) = (WPARAM)hoge; イメージ的には↑のようにしたいのですが・・・。
143 :
デフォルトの名無しさん :2007/12/11(火) 12:06:58
>>128 static TCHAR szPath[MAX_PATH], szPathCleaned[MAX_PATH + 1];
iRet = PathCleanupSpec(szPath, szPathCleaned);
MessageBox(hwnd, szPath, APPNAME, 0); //当然これは入力したパスが表示されるが
MessageBox(hwnd, szPathCleaned, APPNAME, 0); //修正されたパスが表示されると思いきや、何も表示されない
wsprintf(szBuffer, TEXT("%d"), iRet);
MessageBox(hwnd, szBuffer, APPNAME, 0); //で、戻り値は「0」が返ってる
shlobj.hで見る限り、PathCleanupSpec関数の戻り値として期待される値は
#define PCS_FATAL 0x80000000
#define PCS_REPLACEDCHAR 0x00000001
#define PCS_REMOVEDCHAR 0x00000002
#define PCS_TRUNCATED 0x00000004
#define PCS_PATHTOOLONG 0x00000008
だから「0」はないんじゃないのかな、と思うんですが
>>142 MAKELONG
ってこれはマクロだけど
145 :
デフォルトの名無しさん :2007/12/11(火) 12:20:08
>>142 HWNDは32bit値だからMAKELONGに食わせちゃだめだぞ
16bit以下の値でないと
64bit環境だとさらに問題だが
>>143 第2パラメータはIN/OUT
とりあえず、↓でいいんじゃね?
lstrcpyn(szPathCleaned,szPath,MAX_PATH);
PathCleanupSpec(NULL, szPathCleaned);
>>143 どう見ても使い方が間違ってます。本当にありがとうございました。
MSDN読まないで質問するなよ。
>>140 UTF-8はMultibyteChar
>>143 こんな馬鹿なら自前で作らせるよりAPI使わせた方がまだマシか
151 :
デフォルトの名無しさん :2007/12/11(火) 12:53:20
>>146 そうでした。HWNDはLPARAMにぶち込みます。。。
ウィンドウの背景色を動的に変えたいのですが、 ウィンドウクラスの登録の時に指定した色から変えることは可能でしょうか? 可能ならどういった関数が用意されてるのか教えてください。
WM_ERASEBKGNDで処理しなさい
>>153 ググって頑張ってみます。ありがとうございまいした。
155 :
デフォルトの名無しさん :2007/12/11(火) 13:07:24
>>148 >>150 俺のPSDK Windows Server 2003 Familyには↓のように書いてあるんだよぉ!!!
pszDir
[in] A NULL-terminated Unicode string that contains the starting file path.
It must not exceed MAX_PATH characters in length, including the terminating NULL character.
pszSpec
[out] A string buffer that receives a NULL-terminated Unicode string that contains the cleaned file path.
This buffer should be at least MAX_PATH characters in length to avoid the possibility of a buffer overrun.
156 :
148 :2007/12/11(火) 13:16:50
>>155 正直すまんかった。M$もテキトーだなぁ。
>>141 >>149 VCでのいわゆるUNICODEはwchar_t配列で、これはUTF16。
UTF8を扱うときには、結局はchar配列を使って読み込み、内部でTCHARに変換。
ということになりますでしょうか?
>>155 最新のをチェックする癖をつけようぜ
webのは重いけど
>>123 それは無いようです
試しにVC++でコンソールアプリケーションを作成してfflush(stdio);を挿入した場合としていない場合では動作が違うため、標準ライブラリのバッファ動作が原因と考えています
しかしながら、cmd.comからの起動ではバッファをフラッシュするタイミングが違うのが理解できません・・・
161 :
デフォルトの名無しさん :2007/12/11(火) 14:05:08
>>147 今試してみたら、完璧でした
本当にありがとうございました。
>>155 そのAPIはSettlement Program Interfacesに載ってる元非公開APIだ
これらのAPIはドキュメントに嘘が多くて説明のいい加減な物が多い
例えば
>Minimum operating systems Windows 2000
と書かれているが実際は9xでも使える(ただし文字列引数がANSIになる)
しかも将来使えなくなる可能性もあると書かれてるものが多いので
自分で解決できないなら使わない方が無難なAPIってこった
The Old New Thing のコメント欄て2chみたいだな
164 :
デフォルトの名無しさん :2007/12/12(水) 04:00:55
>>162 Shell○○には、非公開のものが結構あるみたいですね。
終了ダイアログやアイコン選択ダイアログなんかも、dll内の関数の番号??を指定して呼び出すとか
typedef LONG (CALLBACK *SHCHANGEICONDIALOG)(HWND hwnd, LPCSTR szFileName, LONG Size, int *IconIndex);
SHCHANGEICONDIALOG SHChangeIconDialog=NULL;
hShell32 = LoadLibrary(TEXT("SHELL32.DLL"));
SHChangeIconDialog = (SHCHANGEICONDIALOG)GetProcAddress((HINSTANCE)hShell32, (LPCSTR)62);
bRet = (BOOL)SHChangeIconDialog(hwnd, (char*)wBuffer, MAX_PATH, IconIndex);
とか
昔の人は大変だったんだな
>>159 了解です。ありがとうございます。
せっかくのUNICODEビルドなのに、結局は面倒臭い処理が入るのですね。
>>165 だからUTF-8はマルチバイトだから当然だろ
API一発で変換できるのにめんどくさいんだったらプログラム書くのやめたら?
>>165 UNICODE識別子(UTF-16)はWindows SDKやMS謹製ライブラリなどに対して、
「Unicode用のAPI、構造体、型などを使用する」と指示しているだけに過ぎない。
外のものに対しては関知しない。
面倒なら、.NETに移行したら?
StringクラスやMarshalクラスで簡単にHandlingできる。
それ相応の代償も必要だがw
winsockで通信するプログラムを作成中なんですが、先ほど突然 Debugモードでビルドしたクライアントプログラムが、サーバプログラムと通信出来なくなってしまいました。 Debugモードでビルドしたクライアントプログラムがサーバプログラムにconnect()すると connect()直後に通信が遮断されてしまいます。 Releaseモードでビルドしたプログラムは、今まで通り問題なく通信出来ています。 現象が起きる前のソースをビルドしても、Debugモードでビルドすると通信出来なくなってしまいました。 ファイアウォールやセキュリティソフトの設定も特にいじっていないのですが 原因として考えられることってありますか?
socket自体には問題はないだろう ws2_32.dllにデバッグモードも糞もない ステップ実行で周辺洗ってみたら? デバッグコードが何か悪さしてるんだろうけど
170 :
168 :2007/12/12(水) 23:23:39
>>169 ありがとうございます。
ステップ実行してみたところ、サーバ側ではacceptが終了した直後に
recvの返り値が0になり、通信が終了してしまっています。
また、クライアント側は非同期で通信していますが、connect()直後に
FD_CLOSEに飛んでしまい、やはり通信が終了してしまいます。
特にSOCKET_ERRORが出てるわけでもなく、手の打ちようがありません…。
FD_CLOSE前後の条件分岐が未初期化とかなんじゃねーの。
鯖、クライアントともに全ての closesocket や shutdown にブレークポイント仕掛けて実行してみれば?
173 :
168 :2007/12/12(水) 23:48:42
>>171 まさにそうでした。
いつの間にかそうなってたみたいです・・・ありがとうございます。
でもなんでreleaseモードだと切れなかったんだろう…。
ヒューマンエラーでした
175 :
168 :2007/12/12(水) 23:57:51
FD_CLOSE前後の条件分岐のせいかと思ったんですけど、やはり違ったみたいです。 更に今度はreleaseモードでも切断するようになってしまいました。 FD_READには一度も入らないみたいです。もうわけがわかんないです・・・。
デバッグ関係ないじゃん TCPモニターでACKでも見てろ
LoadImage()でDIBとしてロードした ビットマップの色深度ってそのままなんでしょうか? GetObject()で調べてみたんですが ヘッダの情報では取得できないのか0になってるので分からなくて
どうせハンドルが無効とか引数が間違ってるとかそんな所だろ
オーナー描画のポップアップメニューで、 メニューアイテムで描画している画像をアニメーション表示したいのですが、 任意のタイミングでWM_DRAWITEMを発行させるにはどうすればよいでしょう?
それはシステムが勝手に送ってくる奴だから無理ー どうしてもやりたければメニューイベントをハンドリングして自分で書こう
Alphaチャンネルマスクを持ったImageListを、ImageList_DrawIndirectでHDCに描画したのですが、 1bitマスクでしか描画してくれません。 ILD_TRANSPARENTだけではダメ? TreeViewにセットしたら正しく描画されたので、ImageListは正しく作られてます。
ILC_COLOR32付けてる? XP以降?
今は言いたくありません
言いたくなるまで待ってるよ 嘘だけど
ちょっと面白かった
今言ってもいいですか?
もうちょっとだけ待って!
続けるのかw
>>183 Vistaです。
ImageListはSHGetImageList(SHIL_SMALL)で取得したものです。
IImageList::GetItemFlagsを呼ぶとILIF_ALPHAが返ってきますし、
ImageList_GetImageInfoで取得したBitmapにGetObject(BITMAP)をかますと、
Image:32bit
Mask:1bit
で返ってくるためILC_COLOR32が指定されていると思います。
Visual Styleの指定もManifestで行っています。(CommonControl 6)
我慢できずに言っちゃいました
だれだよw
いや、まだ早い
えっ!
195 :
デフォルトの名無しさん :2007/12/14(金) 21:26:12
質問です。 別プロセスの任意のウインドウ内に任意の図を描画したいのですが、どうすればいいでしょうか?
ウィンドウハンドルさえ取得できれば、後はGetDCして描画できるんじゃない? やったことないけど。
それだけだとそのプロセスでWM_PAINTが来たら消されちゃうしゲームのように更新が多い場合もある。
対象プロセスのWM_PAINTの処理を行った後に追加処理を行うことってできるんだろうか? フックは対象プロセスの前だから・・・
wndproc呼んだらええんやけどね
>>198 SetWindowLongPtr辺り使ってゴリゴリ書いたら出来る気がしなくもない。
できるけど結局フック使わにゃ
エディットコントロールにSetWindowText();で文章を書いていくと、文章の積み重ねじゃなく上書きになってしまいます。 ↓こうすると、最終的に うんこ しか表示されない SetWindowText(main , "ほげほげ"); SetWindowText(main , "うんこ"); SetWindowText();の数が不特定多数で、ほげほげうんこ のように連結して表示させていくにはどうしたらいいですか。 変数適当に作ってwsprintfで地道に連結させていく方法しか思い浮かばないですが、APIでスマートにやる方法はありますか。
SendMessageとEM_REPLACESEL
普通に文字列連結した方がスマートじゃねえの?
>>201 フックを使うにしても、対象プロセスの描画処理が終わった後に追加の描画処理を行うことに
なると思うのですが、それはどうすればいいのでしょうか?
>>206 フックDLLにWM_PAINTをハンドリングするウィンドウプロシージャを入れておいて
SetWindowLongPtrで元のウィンドウプロシージャとおきかえる
BeginPaintをフックすれば。
いや、描画した後に上書きしたいんだろうから、この場合EndPaintだろ。
>>204 おお、できました!ありがとうございます。
>>205 100行くらいになると重くなったりしそうなので。
212 :
デフォルトの名無しさん :2007/12/15(土) 13:09:16
誘導されて来ました。 VC++でOpenCV使ってます。 画像を表示するとき、ウインドウの枠やタイトルバー、タスクバーなど 諸々が表示されないように全画面表示したいんですがどうしたらいいでしょう? OpenCVのライブラリ見てみたんですが、具体的にどういう設定にするのかがわかんなくて・・・ cvNamedWindowの中に記述できるんでしょうか?
グローバルキーボードフック(WH_KEYBOARD)をしているのですが、キーが押されると nCode = 3, wp=押されたキーコード nCode = 0, wp=押されたキーコード と何故か2回フックプロシージャが呼ばれるのですがどうしてなんでしょう?(離されたときもまた2回呼ばれる。)
winsockのプログラムにて 自分のPCの指定したポートが開いているかどうかを調べる、といった事をしたいのですが、 どのようにすればいいでしょうか? bindを試すのはまた違いますよね・・
>>212 マルチかよ
CreateWindowの引数でも弄ってろ
216 :
212 :2007/12/15(土) 14:10:02
DWORD dwStyle ってやつですか?分かりません><
>>215 誘導されて来た場合もマルチって言うんですか?
217 :
デフォルトの名無しさん :2007/12/15(土) 14:26:41
218 :
212 :2007/12/15(土) 14:41:59
OpenCVスレにも投稿したの忘れてました、すみません。 そちらに移動します。
220 :
デフォルトの名無しさん :2007/12/15(土) 16:46:28
あきた
ここまでテンプレ
質問です。 シェルのExplorerをKillProcessの様な強制的な方法以外で、APIを使って、安全に終了させる方法は何かあるでしょうか? 恐らく、シャットダウン時のような時には安全に終了させていると思うのですが... タスクトレイにWM_CLOSE等を送ってもうまくいきませんでした よろしくお願いしますm(__)m
>>213 フックはキーボードが押されたときに呼ばれるのではなく、
GetMessageやPeekMessageでメッセージが処理されるときに呼ばれる。
PeekMessageでPM_NOREMOVEフラグが指定されたときにも
フックが呼ばれるので、それを使用しているアプリケーションでは
1回のキー入力で複数回フックが呼ばれる。
PM_NOREMOVEが指定されたかはcodeがHC_NOREMOVEかどうかで、
判別できる。
>>224 エクスプローラに限らず外部から安全に終了させる一般的な方法は無い。
シャットダウンは個々のアプリを閉じてるわけじゃない。
シャットダウンしていい?と訊いた後、シャットダウンするからセーブするなら今のうちと通告して
ガチャンと電源切るようなもん。
>>224 回答じゃないけど、OS再起動ダイアログ上でCtrl+Shift+Alt+ Esc or キャンセルクリックでエクスプローラを安全に終了できるね
セキュリティ上APIじゃ無理なんじゃないかな。
228 :
228 :2007/12/16(日) 00:41:03
質問です、現在ネットからHTMLを読み込むプログラムを作成しています。 //HTMLデータを取得する BOOL GetHTMLData(const char* Agent, const char* URL, char* Buf){ HINTERNET hInternet; HINTERNET hFile; DWORD ReadSize; BOOL Result; //インターネットハンドルの取得 hInternet = InternetOpen(Agent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); //URLのオープン hFile = InternetOpenUrl(hInternet, URL, NULL, 0, INTERNET_FLAG_RELOAD, 0); //バッファへの読み込み Result = InternetReadFile(hFile, Buf, 65536, &ReadSize); //各種ハンドルをクローズ InternetCloseHandle(hFile); InternetCloseHandle(hInternet); return(Result); } といったプログラムです。
229 :
228 :2007/12/16(日) 00:43:05
>>227 はじめて知った
この機能で誰が喜ぶんだよ
233 :
228 :2007/12/16(日) 02:21:55
>230 解決しました、ありがとうございます。
>>226 やはりそうですか..
教えて頂きありがとうございます
>>227 初耳ですね
その方法の実行時に何か独自のメッセージがExplorerに届いていないか、Spyと睨めっこしてみます
ありがとうございましたm(__)m
>>224 古い記憶だけで書くのでウソの可能性が高いけど、
PostMessage( FindWindow("progman", NULL), WM_CLOSE, 0, 0 );
こんなかんじじゃだめかな。
それで安全だという保証は(ry
WM_SONYTIMERを止めるAPIを教えてください。
WM_CLOSEで閉じたとしても、将来のバージョーンでも通用する保証は(ry
しまったAPIスレだったorz
242 :
デフォルトの名無しさん :2007/12/16(日) 16:22:45
タスクトレイに常駐アイコン作ってます。 常駐アイコンにマウスをポイントした時に表示される文字列を 変更するのってどうしたらいいんですか? マウスポイントされるたびに変更したいのです。 文字列の変更の仕方と マウスポイントされたイベントを受け取るメッセージを教えて下さい。 常駐アイコンはこうやって作りました。 ntfyIcon.cbSize = sizeof( NOTIFYICONDATA ); ntfyIcon.uID = 0; ntfyIcon.hWnd = hWnd; ntfyIcon.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; ntfyIcon.hIcon = LoadIcon(ghInst, (char*)IDI_ICON); ntfyIcon.uCallbackMessage = WM_USER_ICON; strcpy( ntfyIcon.szTip, "あああ Shell_NotifyIcon( NIM_ADD, &ntfyIcon);
243 :
242 :2007/12/16(日) 16:30:46
ごめんなさい。 自己解決です。 変更は Shell_NotifyIcon( NIM_MODIFY, &ntfyIcon); マウスポイントは WM_MOUSEMOVE ←とりあえずコレでいけたっす お騒がせごめんなさい
質問です。 SetWindowsHookEx( )を使って、特定のウィンドウにポストされる メッセージをフックするにはどうすればよいでしょうか。 SetWindowsHookExを呼び出すのはDLLからで、 対象のウィンドウはそのDLLをロードするアプリケーションが生成したものです。 そのアプリケーションのウィンドウハンドルは取得できています。
ReadFile()で読み込んだ文字列が文字化けして印字されてしまって困っています。 バグが出る最小単位のプログラムを書いたので、下に記載します。 #include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){ HANDLE hFile; hFile = CreateFile(TEXT("test.txt"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if( hFile != INVALID_HANDLE_VALUE ){ TCHAR buf[256]; DWORD readsize; // bufに読み込んで、結果をメッセージボックスに表示 ReadFile(hFile, buf, sizeof(buf), &readsize, NULL); buf[readsize] = TEXT('\0'); // 末尾に'\0'が無いので付加 MessageBox(NULL, buf, TEXT("結果"), MB_OK ); CloseHandle(hFile); } return TRUE; }
246 :
245 :2007/12/16(日) 17:33:53
開発環境:Visual C++ 2008 Expression Edition OS:Windows Vista Business buf[]にテキストファイル(test.txt)からファイルサイズ(readSize)分だけ文字列を読み込み、格納しているだけです。 borland C++ 5.5.1 for Win32 でコンパイル&実行すると文字化けしないのですが、VC++2008だと文字化けしてしまいます。 実際に作成しているプログラムは既に合計で2k行程になっており、ファイル数もそれなりに多くなっているので、できることならこのままVC++2008で開発を続けたいです。 何かお心当たりある方がいらっしゃいましたら、何卒ご教授くださいませ・・・。
>>245 UNICODEでコンパイルしてANSIなファイルを読み込んでるんだろ。
TCHARとかTEXT()も何を意味してるか分かって使ってる?
>>246 プロジェクトのプロパティの構成プロパティ-全般の文字セットをマルチバイト文字セット使用にする
249 :
245 :2007/12/16(日) 17:39:17
ちなみにfopen()、fseek()、fread()などを使って試してみたのですが、それでも同様に文字化けしてしまいました。
って2008のEEなら英語版か。まあ見りゃわかるっしょ。
251 :
245 :2007/12/16(日) 17:44:30
>>247 いえ、一度ANSI文字を表示できるようにコードを書き直してやってみたのですが、そちらも文字化けしてしまいました・・。
>>249 試してみます。
252 :
245 :2007/12/16(日) 17:49:03
>>249 できました。ありがとうございました!
ちなみに上の
一度ANSI文字を表示できるように〜〜 > 一度ANSI文字だけを表示できるように〜〜
の間違いです。
とりあえず皆さんありがとう!
>>252 ANSIビルド、UNICODEビルド、TCHAR、TEXT()あたりをよく調べておくことをお薦めする。
UNICODEビルドのままでやるなら、
>>245 のReadFileとMessageBoxの間に、
MultiByteToWideCharなどでコード変換が必要。
いまどきマルチバイト文字でビルドを薦めるなよ。 後々苦労するぞ。
というか、普通は_T()とかじゃねーの? いちいち限定する必要あるん
マルチバイトに慣れてる奴はTでいいと思うけど 近頃VC始めた漏れは混乱するのでユニコードに統一してまつ
マルチバイトのビルドにした途端にCreateProcessWithLogonWみたいなのがキレるから
ビジュアルエディタを使って、ダイアログ内に コンボボックスを作成しているのですが、表示がうまくいきません。 HWND combo = GetDlgItem(hWnd, IDC_COMBO1); SendMessage(combo, CB_ADDSTRING, 0, (LPARAM)"test01"); SendMessage(combo, CB_ADDSTRING, 0, (LPARAM)"test02"); SendMessage(combo, CB_ADDSTRING, 0, (LPARAM)"test03"); SendMessage(combo, CB_SETCURSEL, 2, 0); 上のようにデフォルトではtest03が表示するようにしているのですが、 右隅のドロップダウンボタンをクリックしても、test01とtest02が表示されません。 プロパティの設定が間違っているのでしょうか? SendMessage(combo, CB_GETCOUNT, 0, 0);はちゃんと3を返します。 CB_SETCURSELで番号を指定して、デフォルトでtest01、test02の表示はできました。 ドロップダウンだけが表示されません。
コンボボックスの高さが足りてないとか。
>>260 すみませんどのように変えるか分からないのですが。
CreateWindowの引数を変えればおk
>>262 Visual Studioのリソースビューから作っているのでrcファイルをいじらないと
だめですかね?CreateWindowをまず試してみます。
リソースビューで作ったことないから知らないが、 それならリソースファイルいじらなくてもウィンドウの大きさ変えれるだろ。 普通ににょーんってすれば。
>>264 それが、横幅しか変えられないんですよ。
リソースエディタで、一回「▽」を押すと、縦幅が変えられた希ガス。 というか、これってコンボボックスのFAQだった希ガス。
>>263 rcファイル弄るのが早いだろ
数字かえるだけだ
>>266 さん
やった!できました!!ありがとうございます。
って何でこんな分かりにくいとこに(泣)
いやあ解決して良かったです。みなさんご協力ありがとうございました。
有勝 卓
271 :
てるてる坊主 :2007/12/16(日) 23:49:53
BCC Developerを使って(APIとC++言語)で、ウィンドウアプリケーションを作っているんですが、 まだ始めたばかりでわからない事がある為 質問させてください。 ファイルを開く際に GetOpenFileName() 関数を使うと思うのですが、マクロを含むエクセルファイル は開けるのでしょうか??(そもそも、エクセルファイルが開けるかが分かってないのですが・・・) これまで「猫でも・・・」を読ませて頂いていたのですがこの辺の詳細が載っていなかったので 質問させて戴きました
最大化ボタンは有効のままで(他の事に使うので) 押されたときに無視するにはどうすればいいの?
>>271 GetOpenFileNameは、「ファイルを開く」ダイアログでファイルを選択するところまで。
実際にファイルを開いてくれるわけではない。
僕ハッカー!!!!
case WM_SYSCOMMAND: if((wParam & 0xFFF0) == SC_MAXIMIZE) { // 最大化ボタンなら無視 break; }
278 :
てるてる坊主 :2007/12/17(月) 00:15:12
>>273 そうなんですね・・・。 上記に記載してあった参考URL「Win32 API入門」中の”ファイル選択”を 見た限りだと、htmlファイルの開き方のプログラムが載っていたんですが 少しソースを変えればエクセルファイルも見れるようになるんですかね・・・??
>>278 htmlだろうと、xlsだろうと選択するところまでしかしてくれないことにかわりはない。
>>278 どんだけ……
関連付けで開くのはシェルの仕事
ShellExecute
質問です。ただ単純にリソースから相対パスを取り出してソフトを起動し、自分自身は 終了するというだけのソフトを作っています。Windows xp sp2 Home Editionでは起動 されたソフトが終了されなくても自分自身は先に終了してくれます。これが期待している 動作です。 しかし、Windows 2000 Professional Editionでは起動された側のソフトが終了しても 自分自身が終了していない場合があります。ちなみに開発環境は前者であり、後者では デバッグが不可能です。 ソースは以下が全てです。どなたか良い解決策をお持ちでしたら、ご教示下さい。 よろしくお願いします。 #include <windows.h> #include <shellapi.h> #include <shlwapi.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { char ThisFilePath[MAX_PATH], AppFileName[MAX_PATH], AppRelativePath[MAX_PATH]; if (!GetModuleFileName(NULL, ThisFilePath, sizeof(ThisFilePath))) return 1; PathRemoveFileSpec(ThisFilePath); if (!LoadStringA(GetModuleHandle(NULL), 0, AppRelativePath, sizeof(AppRelativePath))) return 1; PathCombine(AppFileName, ThisFilePath, AppRelativePath); ShellExecuteA(NULL, "open", AppFileName, "", "", SW_SHOW); return 0; }
282 :
244 :2007/12/17(月) 01:46:22
>>269 ありがとうございます。
ですが、ドキュメント読んでも未だ理解しきれませんorz
グローバルフックはできたのですが、
特定のウィンドウのみフックすることができません。
SetWindowHookEx( ) の引数のインスタンスハンドルとスレッドIDには
どういう組み合わせを渡せばよいでしょうか。
284 :
244 :2007/12/17(月) 04:43:06
>>283 >スレッドが何なのか良く分かってないんじゃないの
すみません、Win32API は勉強し始めたばかりなもので…
教えてくださってありがとうございます。
何とか解決できそうです。
コンソールアプリを立ち上げるとコンソールウインドウが開きますが そのハンドルを自分自身の中で取得する方法を教えてください. というのは現在簡単なコンソールアプリがあってその結果を 別ウインドウに表示するプログラムを作りたいのです. main関数の中で別ウインドウを作成することはできたのですが, 制御がそっちに移ってしまってコンソール入出力のほうに帰ってこないので 何とかしたいのです.
何故制御が戻らないか考えよう
複数のムービーを垂れ流す簡単なアプリを作っているのですが MCIWndCreateを子として作り MCIWndOpenでファイルを開き MCIWndPlayですんなり再生まで行くのですが 次のムービーに行く時に MCIWndCloseをかけると親ウィンドウがちらつく (アクティブが他所へ移る?)ような状態が発生するのですが これを抑える、もしくはごまかす上手い方法は無いものでしょうか?
アプリケーションが3枚のウィンドウを持っていて、そのZオーダーを常に固定するということはできますか?
>>286 メッセージループそのものを別スレッドで
立ち上げればいいんですかね?ちょっとやってみようと思います.
>>289 一般にそれをやる時はコンソールプログラムをCreateProcessで子プロセスとして起動して
出力ハンドルを見張る
標準入出力 リダイレクト
あたりでググるといいかも
>>287 親ウィンドウの背景を消去しなければいいんだろうけど
そうすると再生中のムービーが背景に残りそうな余寒…
背景消去のキャンセルはウィンドウクラスの背景ブラシを透明ブラシにするか
WM_ERASEBKGNDをスルーする
>>288 ちょっと探したけど簡単な方法は無さそう
WM_ACTIVATEとSetWindowPosを駆使すればできるかもしれないけど
領域内に閉じこめられてもいいならSetParentで・・・ちょっと無理か?
いけるんじゃない? モードレスダイアログを2段重ねるようなもんだべ?
いや、ダイアログを重ねるのまではいいとして アクティブになる時に前に出てくるのをどうブロックするか
2枚目のモードレスダイアログが親になってモードレスダイアログ開くのさ SetParentでできるかはやってみてないからわからん。
owned, ownerの関係にすれば前後関係は固定できるな
>>290 とりあえずメッセージループをbeginthreadで立ち上げたら
コンソールのほうに制御は戻りました。ただ生成したウインドウのほうが
やばくなってきたのでいろいろ考える必要がありそうです。
あと、いわれた単語でググって見たらいろいろ見つかったので
勉強してみようと思います。ありがとうございました。
どうしてAPIは素直に文字列を返してこないの?
何の話?
全部
その文字列は誰が確保して誰が開放するんだ
ひょっとしてgc世代のゆとり乙ですか?
大解放ですよ
シェル関連ならCoTaskMem***で確保・解放が統一されてるような
文字列クラスも知らないって糞杉ワロタ
何の話?
全部
その文字列クラスは誰が確保して誰が開放するんだ
もういいって・・・
いいならレスしないでくださいよしつこい人ですね
310 :
デフォルトの名無しさん :2007/12/17(月) 19:50:34
しつこいのはあなたですよ 早く氏んでね^^
ケツロン C#最強
例えば、 Control側で文字列持ってんだから、わざわざこちらでバッファ確保させずにそのままLPCTSTRで返せよ、 ってことか? C++/CLIだろ、最強は。
文字列なんてのがあるからいけないんだ
314 :
デフォルトの名無しさん :2007/12/17(月) 20:32:16
ステータスバーに文字列を設定する場合 SendMessage(hStat, SB_SETTEXT, (WPARAM)(SB_SIMPLEID | SBT_NOBORDERS), (LPARAM)szText); という風にしますが、ステータスバーの領域が一つしかない場合は SendMessage(hStat, WM_SETTEXT, 0, (LPARAM)szText); としても可能です。 ただWM_SETTEXTで文字列を変更する場合、ウィンドウを再描画させても変更した文字列がステータスバーに表示されますが SB_SETTEXTで変更した場合は、ウィンドウを再描画させると、変更前の文字列(CreateStatusWindowで設定した文字列)が表示されてしまいます。 これはどういう違いから来るものなんでしょうか? 詳しい方ヨロピクビー
315 :
デフォルトの名無しさん :2007/12/17(月) 20:44:58
どう考えてもC/C++に文字列型がないからいけないんだ
んなモンいらねーよ
文字列型に頼ってバイナリ満足に扱えないVBer共はしねwwwwwwwwwwwwwwwwwww
ちょっと文脈をカンチガイしてないか?
320 :
デフォルトの名無しさん :2007/12/17(月) 22:19:11
323 :
デフォルトの名無しさん :2007/12/17(月) 22:56:36
____ / \ / ─ ─\ 今年もあと一ヶ月だお・・・ / (●) (●) \ | (__人__) | ________ \  ̄ ./ .| | | ノ \ | | | /´ | | | | l | | | ヽ -一ー_~、⌒)^),-、 | |_________| ヽ ____,ノγ⌒ヽ)ニニ- ̄ | | | / ̄ ̄ ̄\ / ─ ─ \ / (●) (●) \. 俺はこの一年間何をしていたんだろう | (__人__) | 2chで浪費した莫大な時間を何か有意義なことに使っていたら・・・ \ ` ⌒´ / / \
無駄上等ッ
今PSDKのステータスバーコントロールの箇所読んでて間違いを見つけたんだけど、
さらしても問題ない?
あまりにもアホな間違いで、exampleのコードなんだがな
それよりも誰か
>>314 に答えてくれませんかね
言っておきますが、このスレを建てたのはこのボクですよ。
早くしてね(ハート
string hoge = wsprintf(_T("%d 回氏ね。", n);
>>325 exampleはインターンが書いてたりするのでわりといいかげんなのは普通。
>>326 そこまでやるなら
string hoge = string::format(_T("%d 回氏ね。", n);
のほうがいいだろ。
329 :
デフォルトの名無しさん :2007/12/17(月) 23:33:27
固定長配列で実行するまで長さ不明の文字列受け取るのは馬鹿げてるよね
ならもっと高級なクラスライブラリでも使えば?
APIの理想像じゃねw
32bppのビットマップにGDIで描画しても、alphaの値が変わらないのは仕様ですか
じゃなかったw
APIスレなんだからいつまでもHeapAllocとVirtualAlloc使ってろw
いい加減ドトネト厨うざい
アンチドトネト厨うざい
>>334 GDI+やDirectX使うか、自分でブレンディングするべし。
342 :
デフォルトの名無しさん :2007/12/18(火) 09:05:57
>>340 win32スレでドトネトの話題を繰り返すな低脳
それじゃ歌おうじゃないか
死にたい人にお薦めの危険な街ヨハネスブルグ ・軍人上がりの8人なら大丈夫だろうと思っていたら同じような体格の20人に襲われた ・ユースから徒歩1分の路上で白人が頭から血を流して倒れていた ・足元がぐにゃりとしたのでござをめくってみると死体が転がっていた ・腕時計をした旅行者が襲撃され、目が覚めたら手首が切り落とされていた ・車で旅行者に突っ込んで倒れた、というか轢いた後から荷物とかを強奪する ・宿が強盗に襲撃され、女も「男も」全員レイプされた ・タクシーからショッピングセンターまでの10mの間に強盗に襲われた。 ・バスに乗れば安全だろうと思ったら、バスの乗客が全員強盗だった ・女性の1/3がレイプ経験者。しかも処女交配がHIVを治すという都市伝説から「赤子ほど危ない」 ・「そんな危険なわけがない」といって出て行った旅行者が5分後血まみれで戻ってきた ・「何も持たなければ襲われるわけがない」と手ぶらで出て行った旅行者が靴と服を盗まれ下着で戻ってきた ・最近流行っている犯罪は「石強盗」 石を手に持って旅行者に殴りかかるから ・中心駅から半径200mは強盗にあう確率が150%。一度襲われてまた教われる確率が50%の意味 ・ヨハネスブルグにおける殺人事件による死亡者は1日平均120人、うち約20人が外国人旅行者。
冫─' ~  ̄´^-、 / 丶 / ノ、 / /ヽ丿彡彡彡彡彡ヽヽ | 丿 ミ | 彡 ____ ____ ミ/ ゝ_//| |⌒| |ヽゞ |tゝ \__/_ \__/ | | ヽノ /\_/\ |ノ _________ ゝ /ヽ───‐ヽ / / /|ヽ ヽ──' / < ♪も〜〜い〜くつ寝〜る〜と〜〜 / | \  ̄ ,/| \_________ / ヽ ‐――‐
まて、正月の前にはアレがある まだ油断できぬ
アレってなんだ? 、、、、天皇誕生日か。
スキー旅行だろ常考・・・
冬だなぁ
日本人なら冬至には柚湯。これ。
冬は葛湯ですよ。
葛根湯との違いは何かね
そりゃ冬ですよばか
CreateDialogについて質問です CreateDialog上に配置してある複数のエディットボックス。 それらをTabキーでフォーカスが移動するようにしたいのですが、うまくいきません。 タブストップ設定はしてあるのでDialogBoxで呼び出した時にはきちんと意図した動作をしました 調べてみたところCreateDialogで作ったダイアログ上のTab移動については、ウィンドウメッセージループ(GetMessageなど)のところでIsDialogMessageで判定を行い適切な処理が必要とのことでした。 ですが今のアプリケーションはDialogBoxでメインダイアログを表示し、その上に(場面に応じたダイアログを)CreateDialogではりつける形になっています。 DialogBoxの場合ウィンドウメッセージループは隠蔽されてしまいますよね? どのようにしたら意図した動作にできますでしょうか
ボタンのキャプションを左揃えにしたいのですが、 どうしたらいいでしょうか。 CreateWindowExでWS_EX_LEFTを指定してもうまくいきませんでした。
BS_LEFTとか無かったっけ
>>357 ありがとうございます。
その通りやったらできました!
どういたしました
明らかな弱点挙げて批判したら〜と比べるなって 分かり安すぎだなお前らw
Vistaのスレあたりの誤爆かw
ちがうよばか
何の話?
なにこのディスコミュニケーションスレw
葛根湯の話だろ。
葛湯に使われる葛粉は、今は葛を使わずにじゃが芋の澱粉を使うって話か?
かぶとむしのはなし
368 :
デフォルトの名無しさん :2007/12/18(火) 20:25:16
冬だなぁ
日本人なら冬至には柚湯。これ。
冬だなぁ
APIの勉強したくてAdvanced Windows第四版ポチってしまったんだけど APIのリファレンスみたいのは付いてますか?
>>371 ついてない。
普通はAPIリファレンス=MSDN。
>>372 即レス感謝。
ディスプレイ上の情報よりも本で読んだほうが
文字が頭に入るんだよね。だから付いてればいいな、と思っていたけど
無いのは残念だな。勝手に期待しただけだけどw
>>373 本に収めたらいったいどんなことになるやら。
更新も頻繁すぎるし、検索性を考慮に入れてもリファレンスマニュアルを本にするのは非現実的なレベル。
リファレンスなんて必要な時に引くもんであって頭に入れるもんじゃない
英単語と一緒だな
いい加減インサイドWindowsのv6カーネル対応版だせ 上中下巻で3万でも買うからだせ
>>371 Advanced WindowsはAPIの勉強するような本じゃねぇぞw
APIのリファレンスが欲しいなら、翔泳社のWindows95APIバイブルだな。
掲載されている全てのAPIに対してサンプルコードが載っている。
古本なら1500円程度で買えるから、全部揃えてもいいんじゃないか?
1と2だけでもいいな。3はデータベースやAVIを使わなければ必要ない。
Windows98APIバイブルもあれば、普通に使うAPIはほとんど網羅できる。
かなり厚い本だけど、持ってると便利だよ。
いや、Advanced WindowsこそAPIの勉強をする本だろ。
特に、詳しく知らないと使う気にすらならないという人間にとっては。
>>377 たしかにWindows InternalsのVista版はほしいよな。
380 :
デフォルトの名無しさん :2007/12/19(水) 02:26:11
ステータスバーの文字の色を変更するにはどうしたらいいですか? 背後の色はSB_SETBKCOLORで変更できるようなんですが、ググってもリンクが切れてるものばかりで
382 :
デフォルトの名無しさん :2007/12/19(水) 11:20:42
読むのめんどくせーから教えてくれって言ってるんだよばか
383 :
デフォルトの名無しさん :2007/12/19(水) 11:27:18
読むのめんどくせーから教えてくれって言ってるんだよばか
384 :
976 :2007/12/19(水) 11:31:16
wparam、lparamに、どういったタイプのデータがどっちに入る、みたいな法則はあるんでしょうか? メッセージごとによく使うデータがwpだったりlpだったりして覚えにくくて困ってます。
コールバック関数の引数に意味は求めても、結局は実装次第じゃなかろうか 入力と出力の2個あるほうが便利、それ以上は構造体ポインタ 戻り値で関数実行の成功失敗を返す。とか、そんなレベルかとおもわれ 感性的に前から埋めていくだろうから、wp にin/out、 lp は NULL 固定とかでも 仕様変更やバージョン進むにつれて、互換維持のために wp に NULL、lp に新しい引数を〜ってのもあるだろうし。
>>386 みじかいのがWPARAM、ながいのがLPARAM
一応ポインタ型は大概LPARAMの方に入ってる 16bitの名残で
>>386 The Old New Thingsの訳本に答えが書いてあった気がするが忘れた。
wparamのサイズが昔は小さかったって記述を見つけたんですが、 その頃の名残で多少の法則性があったりするけど、 あまりそういうことは意識せず一個一個覚えてる、って感じでしょうか。 ポインタは確かに今まで勉強したのは全部lpに入ってました。 少し覚えやすくなった気がします。 どうもありがとうございました。
応
wparamのwはwordのw? つーか覚えないでしょ 毎日使うようなものじゃなきゃそのつどMSDN見る
.NETは美しいんだよ。 APIのドキュメントと長時間睨めっこしなくて済む
Javaの方が美しいよ。
397 :
デフォルトの名無しさん :2007/12/19(水) 14:51:40
質問です なぜドトネト厨がwin32スレでドトネトマンセーレスを繰り返すのでしょうか、誰か教えてください
それはwin32厨の嫉妬心から来る錯覚です
399 :
デフォルトの名無しさん :2007/12/19(水) 15:06:12
でもwin32スレでドトネトの話題はスレ違いですよね? それともスレ違いではないのでしょうか? 詳しく教えてください、お願いします
Win32APIとの比較の話題なのでスレ違いではありませんよ
401 :
デフォルトの名無しさん :2007/12/19(水) 15:26:16
つまりドトネトの方がwin32より優れていると、スレの住人に教えてくれているのですね ありがとうございました
WinFX (わらい
>>400 技術的なマジネタなら歓迎するよ。
文字列が(笑)ドキュメントが(笑)みたいなレス乞食ネタは勘弁な。
ドトネトなんてWin32APIラッパーの塊 Win32APIが無きゃ何もできない
レイヤーの違いすら分からずにズレた発言を連発する新参.NET厨、 というベタな痛キャラを演出した暇人による迷惑行為、 だと思ってたんだが、ひょっとしてマジだったのか?
たかが文字列受け取るのに何行も書くのまじうけるw バッファ足りなくてバグの温床だったり
なんかいやなことでもあって、この板で発散してるんだろw
明らかな弱点挙げて批判したら〜と比べるなって 分かり安すぎだなお前らw
409 :
デフォルトの名無しさん :2007/12/19(水) 16:50:43
僕は文字列ではありません
入門書だとどれも、リソースはエディタを使って追加しろとあるのですが、 メモ帳に手書きでこの作業をすることはできないのでしょうか? 本についてたサンプルプログラムをコピーして試してもうまくいきません。
>>410 いや、どううまくいかないのか。
メモ帳でもできるはずだよ、何を使ってどうやったの?
素人お断りだからな。>Win32API まぁ、.NETがNativeAPIになる日も遠くなかろう。
>>410 リソースコンパイラに.rc喰わしてる?
>>412 近くもないだろう
C#.net勉強しまくってVistaが出るのを心待ちにしてたが
実際はあの体たらくだ
Win32APIプログラムは死なぬ
何度でも蘇るさ と言ってみる
415 :
410 :2007/12/19(水) 17:40:37
本に載ってるソース、ヘッダ、リソースファイルをコピーして同じフォルダに放り込んで、 Borland C++でリソース無しの時と同じようにコンパイル(bcc32 -tW test.cpp)してみたら、 外部シンボル'TransparentBlt'が未解決(C:\(中略)\TEST.OBJが参照) というエラーが出ました。 リソース入りだとコンパイルの手順が変わったりするんでしょうか?
それはmsimg32.libが必要だ
418 :
410 :2007/12/19(水) 17:49:16
あああああそれが原因でしたか。 読んでもよく理解できずに後回しにしたところでしたorz 調べてみます、ありがとうございました。
コンボボックスのタイプをドロップダウンリストにしているのですが、 ドロップダウンリストの横幅が表示されている文字列より短い場合、 全体が表示できなくて困っています。 ドロップダウンリストに水平スクロールバーを追加することはできないでしょうか、 試しにWS_HSCROLLを追加したのですがうまくいきません。
>>419 失礼しました。
CB_SETHORIZONTALEXTENT
でできました。
なるほどね おれにふかのうはない なめてんじゃねーよ
じゃあしゃぶれ
しゃぶしゃぶ食いたくなってきた
C++のnamespace内の関数を.defでエクスポートする方法って無いんでしょうか。 namespace test { void api_func() { } } となってるとき、 EXPORTS api_func EXPORTS test::api_func どちらも失敗します。
SetWindowPosを使い、既に最前面化されている場合は解除、そうでない場合は最前面化という動作を させたいのですが可能でしょうか? 内部で自分が最前面化したウィンドウを覚えておくのではなく、 最前面化されているかどうかを取得できればいいのですが。
WS_EX_TOPMOST
>>424 がんばってマングル済みの名前を探し当てれば、それを書けばいいはず。
あるいは関数にextern "C"を付けろw
さてBeOSでもいれるか
429 :
425 :2007/12/19(水) 21:48:49
解決しました、ありがとうございます!
>>385 おおう! 出版予定ちゃんとあったのか すこし嬉しい
メイン窓のDestroyWindowは自分で呼ぶの?
イミフメー
ウィンドウプロシージャでWM_CLOSEをDefWindowProcに投げれば、 向こうでDestroyWindowしてくれるはずだぞ。
DefWindowProc
投げるって言い方悪かったな。 素通しとかにするんだった。
WS_EX_TRANSPARENTを持たせると WM_ERASEBKGNDのデフォルト処理はスキップされるの?
438 :
は@c44.010.c3-net.ne.jp ◆cplnFO9T0I :2007/12/20(木) 01:29:28 BE:90784692-2BP(1001)
モーダレスダイアログボックスを使うのと標準ウィンドウにコントロールを貼っていくのではどちらがおすすめでしょうか?
ケースバイケース
どういった場合では前者が、またどういった場合では後者がおすすめでしょうか? 個人的にはDPIを変更すると崩れてもそのDPIに追従する方を選びたいのですが。 (最初からこう聞けば良かったですね。反省。)
モーダレスダイアログボックス =モーダルダイアログボックス+モードレスダイアログボックス?
モーダレス(笑)
>>438 モードレスの方は、余り経験はないけど、Window Procedure を入れ子みたい
に使えて、コードを考えるのに小回りが利く感じがする。
通常ウインドウにコントロールを付けると、WindProc にその処理を入れない
といけなくなる。
ウインドウの種類が増えると、どのウインドウかを判別して、入ってくる
コントロールの処理を振り分けないといけない。面倒。
いい方法が他にあるのかも知れないが。
モードレス = モーダレス = modeless
モーダレス(笑)
>モーダレス ぐぐると同じ間違いをしてるアホが結構見つかる
かなり昔から聞くよ モーダルという言葉を先に覚えるからなんだろうか そもそもモードという言葉を知らないのか・・・
ダイアログボックスのように、同じプロセスの他のウィンドウをアクティブにできないようにするにはどうしたらいいですか。
リストビューのヘッダにクリックすると変化する2種類のビットマップを表示しようと イメージリストを使用して登録してみました。 hIml = ImageList_Create(width, height, ILC_COLOR32, 2, 0); hBitmap = CreateTestBitmap(width, height); ImageList_Add(hIml, hBitmap, 0); Header_SetImageList(hHeader, hIml); HBITMAP CreateTestBitmap(int width, int height) { DWORD color = 0x505050; int totalWidth = width * 2; DWORD *test = HeapAlloc(GetProcessHeap(), 0, totalWidth * height * sizeof(DWORD)); for(int i = 0; i < totalWidth * height; ++i) { test[i] = color; } BITMAPINFO bi = {sizeof(BITMAPINFOHEADER)}; bi.bmiHeader.biWidth = totalWidth; bi.bmiHeader.biHeight = height; bi.bmiHeader.biPlanes = 1; bi.bmiHeader.biBitCount = 32; bi.bmiHeader.biCompression = BI_RGB; return CreateDIBSection(NULL, &bi, DIB_RGB_COLORS, &test, NULL, 0); } 指定サイズのビットマップが表示されはしたのですが どういう訳か、どのような色を指定しても黒一色になってしまいます。 CreateTestBitmapの代わりにImageList_LoadImageを使用してみたことろ正常に表示されたので CreateTestBitmapに問題があると思うのですが、自分では原因が解りません。 どこが間違っているのでしょうか?
452 :
451 :2007/12/20(木) 11:02:33
すみません、自己解決しました。 CreateDIBSectionって空のビットマップを作る関数だったんですね… 作ってから色を入れたら変化しました。 どうもお騒がせしました。
453 :
デフォルトの名無しさん :2007/12/20(木) 15:05:17
>>381 トンクス
オーナードローはめんどくさそうだけど、やってみるわ
あとhtmlとかxmlのタグの中身を取り出したり、属性をとりだしたりする便利な関数ってないですか?
getElementsByTagNameのc言語版
ウィンドをクラスにするとスタテE
>>453 C++のほうが楽だと思うだけど、MSHTMLとMSXML。
456 :
デフォルトの名無しさん :2007/12/20(木) 17:16:38
457 :
デフォルトの名無しさん :2007/12/20(木) 17:20:24
文字列 LPCTSTR szString[20]; にTEXT("HELLOこんにちは") が格納されているとする この場合 szString[0] == TEXT('H'); だよね? 以下同じ様に szString[1] == TEXT('E'); szString[2] == TEXT('L'); szString[3] == TEXT('L'); szString[4] == TEXT('O'); となってると思うんですが、 szString[5] == TEXT('こ'); なんですか? どうやって1バイト文字と2バイト文字の区別を付けてるので?
>>457 >LPCTSTR szString[20];
ここはタイプミスということにして・・・
'H' は文字コード 0x0048 の2バイトだぞ。
ってunicodeビルドの話だよな?
#define UNICODE
#include <(゚д゚)ウマー>
464 :
デフォルトの名無しさん :2007/12/20(木) 18:04:55
えらそうに言うな豚が
だめだこりゃ
>>456 WindowsでC++が使えない環境っていったい‥‥
>>466 456自身が使ったことないってだけだろ。
468 :
457 :2007/12/20(木) 18:42:41
ANSIビルドの話っす。もち
すみませんです。
>>458 TCHAR szString[20];
でござった。
質問しておきながら、タイプミスとは・・
なんつーか、俺が質問したかったのは
ポインタを一つ進めるというのは、そのポインタが表わす型によって、進めるアドレスの大きさが違うってことです。(そうですよね?あってますよね?)
つまり
short *ps;(short は 16ビットとする)
ps++ とやると、16ビット分アドレスを進めてるわけですよね
int *pi;(int は32ビットとする)
pi++ とやると、32ビット分アドレスを進める指示をしてると思うんですが
文字列に2バイト文字が混じってる場合、どうして
>>457 のようになるのかなぁと
1バイト文字の部分は、8ビット分(1バイト分)アドレスが進む、すなわち次の文字を参照することになる
わけですけど
2バイト文字の部分は?どうなるのぉ??というのが疑問
何も起こらない。 1バイト分進み、2バイト文字の2バイト目を指すので、 気を付けないとアウアウってことになるだけ。
470 :
デフォルトの名無しさん :2007/12/20(木) 18:52:38
>>466 自分が使える環境だからって全員そうだと思ってる馬鹿はレスしないで下さい
ANSIなら >szString[5] == TEXT('こ'); なんですか? こうはならない szString[5] == 'こ'の1バイト目 szString[6] == 'こ'の2バイト目
姫宮ANSI
>>468 2バイト文字の部分も型はchar
あと、CharNext, CharNextA
よく知らんけど
,. -‐'''''""¨¨¨ヽ (.___,,,... -ァァフ| あ…ありのまま 今 起こった事を話すぜ! |i i| }! }} //| |l、{ j} /,,ィ//| 『おれは諸世紀という詩集を書いたと思ったら i|:!ヾ、_ノ/ u {:}//ヘ いつのまにかペテン師扱いされていた』 |リ u' } ,ノ _,!V,ハ | /´fト、_{ル{,ィ'eラ , タ人 な… 何を言ってるのか わからねーと思うが /' ヾ|宀| {´,)⌒`/ |<ヽトiゝ おれも 何をされたのか わからなかった… ,゙ / )ヽ iLレ u' | | ヾlトハ〉 |/_/ ハ !ニ⊇ '/:} V:::::ヽ 頭がどうにかなりそうだった… // 二二二7'T'' /u' __ /:::::::/`ヽ /'´r -―一ァ‐゙T´ '"´ /::::/-‐ \ 意訳だとか超解釈だとか / // 广¨´ /' /:::::/´ ̄`ヽ ⌒ヽ そんなチャチなもんじゃあ 断じてねえ ノ ' / ノ:::::`ー-、___/:::::// ヽ } _/`丶 /:::::::::::::::::::::::::: ̄`ー-{:::... イ もっと恐ろしいものの 片鱗を味わったぜ…
>>468 TCHAR は UNICODE ビルドなら char (CHAR) の別名
ANSI ビルドなら wchar_t (WCHAR) の別名。tchar.h 参照
TEXT マクロは UNICODE ビルドなら L を文字や文字列の頭にくっつけたのと一緒
ANSI ビルドなら何もくっつけないのと一緒。winnt.h 参照
なので ANSI ビルドの TCHAR szString[20] = TEXT("Helloこんにちは"); は
char szString[20] = "Helloこんにちは"; と一緒
"Helloこんにちは" は単なるバイト列
>>475 >TCHAR は UNICODE ビルドなら char (CHAR) の別名
>ANSI ビルドなら wchar_t (WCHAR) の別名。tchar.h 参照
しむら〜、逆!逆!
477 :
475 :2007/12/20(木) 19:57:41
豪快な間違えっぷりに自分でもワロタ 吊ってくる
478 :
457 :2007/12/20(木) 20:44:02
>>471 マジっすか?
オラますます混乱してきたぞorz
またWin32APIに関係ない話かよorz
名前付きパイプのことで質問です。 データをバイトではなくメッセージとして読み取りたいです。 SetNamedPipeHandleStateでモードを変更するのかと思うのですが エラーが返ってきます。 そもそも書き方が違うのでしょうか…。 ちなみにVB6です。 DIM lngRes AS Long lngRes=SetNamedPipeHandleState(lngHandle,PIPE_READMODE_MESSAGE or PIPE_WAIT,vbNullString ,vbNullString )
その昔、Managed DirectXと言うのがあってだな…
Win32は不滅です。
>>480 2番目の引数は値ではなく値へのポインタを渡せとリファレンスに書いてあるが。
>>483 本当ですね…orz
ご指摘ありがとうございました。
とても助かりました。
485 :
457 :2007/12/21(金) 04:23:34
うざいと思われるの承知で、 ANSIビルドで、 wsprintf(szBuffer, TEXT("%c"), szSrc[0]); とするとき、szSrcに例えば「Hello\0」という文字列が格納されていた場合は、szBufferは「H\0」となりますよね szSrcに「こんにちは\0」という文字列が入っていても、sprintf系の関数で「こ」一文字を上の「H」の場合みたいに取り出すことはできない?ですか? 日本語の文字を取り出したい場合は、UNICODEビルドしかないの?
>>441-442 、
>>444-449 ナンテコッタイ/(^。^)\
>>443 ありがとうございます。
もう一つ聞きたいのですが、アイコンを変えたい場合はどうすればいいでしょうか
・関連付け等で決められているアイコン
・exeファイル、icoファイルから(これはLoadIconで大丈夫でしょうか)
の2つの場合について教えてください。
最近はホスト晒すのが流行っているのかい?
>>487 >・関連付け等で決められているアイコン
レジストリの
HKEY_CLASSES_ROOT\.拡張子
を開いて「規定」に書いてある「ファイルの種類」を取り出す
レジストリの
HKEY_CLASSES_ROOT\ファイルの種類\DefaultIcon
キーを開いてアイコンを指定する
指定の仕方は
アイコンが入ってるモジュールのパス,アイコンの序数
>・exeファイル、icoファイルから(これはLoadIconで大丈夫でしょうか)
EXEはLoadLibrary→LoadIconで良いだろうけどicoはLoadImage
| /| / ̄ヽ | ̄ヽ /| / ̄ヽ | / | ヽ_ |_ノ / | | | /_ | . \ |\ /____| | ヽ_ノ / | ヽ_/ | し ,/ | \_ノ ∩∩ ,V∩ (7ヌ) オ マ エ の 権 利 は オ レ の モ ノ (/ / / / ∧_∧ ∧_∧ || / / ∧_∧ ∧_∧ __( ´∀` ) ∧_∧ _ (´∀` ) ∧_∧ || \ \( ´∀`)ー‐--( ´∀` ) ̄ 総 ⌒(´∀` ) ̄ ⌒`(´∀` ) // \ 財 ,./⌒ 天 ⌒~ヽ 務 /~⌒ 随 ⌒ ̄ヽ.、 族 /~⌒ 広 ⌒ / . | 団 |ー、 下 /\i 省 //`i 意 /\| 議 //`i 告 / . | 法 | | り / (ミ 官 ミ) | 契 | (ミ 員 ミ) | 代 | | 人 | | 役 | / 僚 \ | 約 | / \ .| 理 | | | ) 人 / /\ \| 業 / /\ \| 店 ヽ /. | / ヽ、__/) (\ ) 者 ヽ、__/) (\ ) | | i |/ /| / レ \`ー ' | i / レ . \`ー ' | i /
491 :
288 :2007/12/21(金) 18:12:54
>>290-295 できました。ありがとうございます。
CreateDialogParamのhWndParentに呼び出し側のハンドルをセットすることを2回繰り返すことでできました
>>489 ありがとうございます。こちらの表現が悪くて話がかみ合わなくなりましたが、理解できました。
関連づけされているファイルのアイコンの取得はそこまで面倒だとは....
ちなみにアイコンを変えるというのはウィンドウに表示されているアイコンという意味でした。
(MSDNライブラリを読んでいたらわかったのですがWM_SETICONで出来るんですね)
SHGetFileInfoに拡張子つっこめばとれるっしょ
今別アプリのキャプションを取得するような物を作っています EnumChildWindowsでウィンドハンドラを取得し GetWindowTextでキャプションを取得しています spy++でキャプションを見たときと GetWindowTextで取得した値が違いました spy++と同等の結果を取得したいのですがどうすればいいのでしょう?
495 :
494 :2007/12/21(金) 21:55:09
なんとなく自己解決しました WM_GETTEXT送ってきます。。。
「"放射能割り込み"のあるコンピュータが存在する」 旧ソ連の軍用組み込みコンピュータ、Argon-17は放射線計数管からの パルスがしきい値以上にあると、自動でレジスタの中の値をコアメモリ に退避してシャットダウンした。それで放射線環境がマシになったら 自動で復帰するという塩梅。
いっぽうアメリカは鉛で囲んだ
日本はそろばんを使った
そして日本はオペレータが死亡
かくして1985年の労働者派遣法成立まで待たねばならなくなるわけだが これが後の時代に失われた300年と呼ばれる暗黒時代の始まりである
つまんね
502 :
デフォルトの名無しさん :2007/12/22(土) 05:39:08
こういうのってコピペにしても書いた本人は面白いとでも思ってるのかね?
それは分からんけど496には普通に「へ〜」と思ったわ すれ違いだけど 497からは滑ってるかな
おもしれー
スレ違い gdgd続けんなよカスども
timeGetTimeをたくさん呼ぶと遅くなりますか?
どれだけ沢山なのかどれだけ遅くなっちゃダメなのか、 自分で測って自分で決めて下さい。
timeSetEventで1ms毎に取り込めばいいよ。 と書こうとして調べてたら、こんなの発見。 Windows XP: Included in Windows XP only. なんのギャグだ、これは?
>>508 書いてあるじゃん
>This function is obsolete. New applications should use CreateTimerQueueTimer to create a timer-queue timer.
510 :
508 :2007/12/23(日) 00:06:16
>>509 SDK6.0(Update for Windows Vista)付属のドキュメントには
そんなこと書いてなかったんだよ!ヽ(`Д´)ノ
timeKillEventの方にはNT3.1/95以降って普通に書いてるし。
CreateTimerQueueTimerの解像度はGetTickCountと似たようなもんなのかなあ。
TimerQueue+ThreadPoolは割と面白そう。
512 :
508 :2007/12/23(日) 00:54:46
Timer-queue Timerというか、大元のWaitable-timer自体 10ms単位で10秒寝ても、930カウント程度しか取れない。 timeSetEvent+タイムテーブルの疑似60fpsのような実装には、明らかに力不足だな。 それなりに便利だったのに、今になって廃止しようとする意図が判らん。 よ〜し、こうなったらパパQueryPerformanceCounterでポーリングしちゃうぞ〜
W95以降、obsoleteと書かれて本当に廃止されたAPIなんかあったのかね? Reymondがあれだけ互換性の維持に腐心しているんだから大丈夫でねーのかな。
そんなこというと、レイモンドに怒られるぞ
ルフェーブルか。
http://www.radiumsoftware.com/0406.html#040624 Windows 3.x 版の SimCity を書いた Jon Ross 氏が私に語ったところによれば,
氏は件のゲームにおいて,解放されたばかりのメモリをリードするというバグを誤って残してしまったそうだ。
これは Windows 3.x ならば問題無い。メモリはどこにも移動しないからだ。さて,ここからが素晴らしいところだ。
ベータバージョンの Windows 95 を試してみたところ,案の定 SimCity は動かなかった。
そこで Microsoft はバグの追跡を行い, SimCity の監視を行う特殊コードを Windows 95 に組み込んでしまった。
そのコードは SimCity が動いていることを検出すると,メモリアロケータを特殊なモードへ移行させ,
メモリをすぐには解放しないような設定にしてしまう。これは,後方互換性に対する執念の一例であり,
これこそが人々を Windows 95 へアップグレードさせようとする要素であったわけだ。
すごいけど、プログラマを甘やかしてる気もする。
少なくとも、エ○ゲ関係のプログラマは甘え過ぎてたな。 2000
ごめん、切れた。 2000が発売されて7年近く経っているのに、 未だにAdminでインスト&Usersでプレイすら作れない奴は、いい加減氏ね。 互換性を考えて、安易に管理者権限を持つユーザを作れるようにした結果がこれ。
さすがに非コンシューマ用だった2kから数えるのはどうか それ以外は同意するが
しかしマイドキュメント内に雨後の竹の子のごとくディレクトリ掘られるのもちょっと‥‥
ルートにディレクトリつくる某プリンタドライバとかは?
キヤノンか。あれもいい加減にして欲しいよな。
Vista特有の作法についてはここで話をする、でいいのかな?
Win32APIに関する限りは問題ないんじゃない?
Vista以降GetUserObjectInformationでデスクトップヒープが取れるらしいので
↓のようなソースを書いたのだけれども
ttp://www.hsjp.net/upload/src/up7994.txt なぜか↓しか出力されない。
WindowStation: WinSta0
Desktop: Default
Desktop Heap:12288
Press any key to continue . . .
DesktopHeapも常に12288が返るし、
複数アカウントでログオンしてAdminやUACの昇格実行してもWinSta0しか列挙されない
環境は32bit VistaSP1(v668)とVC9。
なにがまちがっているのか、あるいはこうなるものなのか教えてください
レジストリ使いませんとか自慢して。.\にini書き込む阿保とかな。
正しくはマイドキュメントにMy xxxだよな
>>527 しかも制限ユーザで使うと"INIに書き込めません"とかエラー出て終了できなくなるソフトもあるぞ
あほ仕様でもそれをマンセーするユーザがいるのも事実なわけで。
Adminでインスト&Usersでプレイなんて ごくまれなユーザーは無視でいいよ
Usersでインストールできるならそれでもいいんだが
Win9x時代から全く進歩していない自称パワーユーザって沢山いるよね。
534 :
デフォルトの名無しさん :2007/12/23(日) 16:08:36
535 :
526 :2007/12/23(日) 16:21:07
adminの場合はWinSta0 のWinlogonまでは取れてました ごめんなさい でもサービス関係のデスクトップとれないし(これはそういうものかも知れないけど) 12288とかなによ orz 教えてエロイひと
>>521 Visual Studioのことかぁーーーーーーーーーーーーーー!
http://ir9.jp/prog/ayu/strsafe.htm ここの↓ってTCHARにANSIが選択された場合
nBuffSize = 文字数でなくなるのではないの?
CUINT nBuffSize = 20;
tchar szDest[nBuffSize];
hr = ::StringCchPrintf(szDest, nBuffSize, _T("Num = %d"), 169);
check(hr);
puts(szDest);
ANSIでもUNICODEでもnBuffSizeは文字数として正しい。
( ・∀・)つ〃∩ ヘェーヘェーヘェーヘェーヘェー
リファレンスに書いてあるじゃねーか
メモリエディタ作ろうとしているのだが。 GetWindowThreadProcessId()でそのウィンドウのプロセスIDを取得 ↓ OpenProcess() ↓ ReadProcessMemorデータ読み込み ReadProcessMemoryの二番目の引数である”読み取り開始アドレス”の取得の仕方がわからない。 教えてくれ。
そりゃユーザが表示させたいところを読み取るんだろうに。
>>527 ポータブルなソフトならそうすべきじゃないのか
User権限でProgramFilesでやられると厄介だが
選べるならそれでいい
>>543 いっそのことexeん中に設定書いてしまえば超ポータブル
実行中は書き換え不能なんじゃないかなと思ったけどまあどうでもいい
これからはネットワークストレージに設定保存ですよ
保存しなくて済むようにしようぜ
549 :
デフォルトの名無しさん :2007/12/24(月) 03:10:36
済んだ話題を蒸し返すなよ糞共
別個のファイルでいいじゃん& NTFSにしかインストールできません、で通すのか?
DCさくらは初回起動時に何処に設定置くか選べる
ジャンクション削除したら中身までまとめて削除してくれる%windir%\explorer.exeは氏ね
,、,、,|| ;'`,゙、.||'、 '; 、' /´;`'., ´' .; ' ; '、'. '; 、 ' ,' '.,´; ' l !j /ルゝ
>>553 explorer.exeを削除で、殺せる
一度、やってみたらすっきりするかも
556 :
526 :2007/12/24(月) 14:36:34
チラ裏だがだいたい自己解決したんだぜ UOI_HEAPSIZEはSharedSectionの2番目の値を返す。そんだけ。動的な使用量とか見えるわけじゃない模様 チラ裏だがついでに UOI_HEAPSIZE 5 Returns a ULONG value containing the size of the desktop heap, in bytes. とか書いてあるがCreateDesktopEx 読むと The second SharedSection value is the size of the desktop heap needed for each desktop that is created in the interactive window station, WinSta0, in kilobytes. となってる。なにがbytesだ。クリスマスとか死ねばいいのに。チラ裏だが
557 :
デフォルトの名無しさん :2007/12/24(月) 16:27:13
Windowを2個出して、変数は共有したいのですが、 子ウィンドウだと、親の外に出られないので困りました。 CreateWindowを使って親を2個つくろうとしてみたのですが、 Windowsプログラミングをよく理解できていないので、上手くいきませんでした。 方法は合ってるのでしょうか?
SHGetFileInfoに、 "C:\foo\bar.sln" (存在するファイル) を渡したときと "*.sln" を渡したときとで違うアイコンが返ってくるんだけど、なんで?
>>558 ソリューションファイル(*.sln)は、
アイコンハンドラの中で、中身を見て別のアイコンを割り当てているから。
VS2005だとアイコンに8という数字が見えるけど、
VS2003とかのファイルだと、たしか7とか付いたはず。
試しに、空ファイルの拡張子をslnに変えて見れば良く判る。
typedefされてる構造体名で、↓みたいな感じに、 typedef struct tag_test{ ... } TEST, *LPTEST; 構造体へのポインタが LP(構造体名)ってなってるのをよく見ますが、 このLPって何の略なんでしょうか。 Pはポインタだろうと思うのですが。
Long Pointer
Win16の名残だな
Pをつけるだけだと別の単語になってしまう場合があるから 俺は今でもLPを使っている。
., -、,. -─- 、⌒〉 { } ヽ_ r'⌒) ヽ、 ,,-‐‐ ‐‐-、 iヽ、 J { 、_(o)_,: _(o)_ヽ/ ヽ/∪ ! >:: } / 丶 l /( [三] )ヽノ‐''> < つわぁぁぁああああ! i⊂}__ `二´‐'´__/__ はちみつだと思ったら味噌だった〜 ヽ ‐- 、二`ヽ/〉⊂ニニ⊃) | // ̄ ̄)j~U^∪ヽ ノ ` ‐-L!--‐''(´ ) `i''ー----‐ ''"´ ヽ、__/ ! } ` } !. , -‐- 、. ノ--─ ' ヽ、_{. `ヽi'⌒i `''‐- 、.. __,! 【ラッキーレス】 このレスを見た人はコピペでもいいので 10分以内に3つのスレへ貼り付けてください。 そうすれば14日後好きな人から告白されないわ宝くじは当たらないわ 出世しまくらないわ体の悪い所全部治らないわでえらい事です
ウインドウクラスってのがよくわからないんですが ・表示領域+メッセージプロシージャに名前を付けたもの ・OSがそこにメッセージを送る って感じであってるんでしょうか? あと、どうもウインドウとかメッセージとかの断片的な知識しかないっぽいので その辺まとまってる本ご存知でしょうか? ペゾルトの5版には載ってるのかな?
RichEditのマージンを変えるにはどうしたら良いんですか? 教えてください
/ ̄ ̄\ O⌒> 丶 ⊂二二二⊃ _/ノ 丶 メリーセモーニャ!!! / / ● ●| `/ | (_●_) ミ f 彡、 |∪| 、\ | / __ 丶ノ/ > ) | (___) / (_/ 丶_| / | /\ \ | / ) ) ∪ ( \ \_)
>>566 RegisterClassの引数がすべてだよ。
自分で登録しなくたって、"EDIT"の名前でCreateWindowすると
エディットコントロールが使えるべ?
ボタンの絵を持ったものがボタンウィンドウのクラス
573 :
デフォルトの名無しさん :2007/12/25(火) 10:25:59
誘導されたのでこちらで失礼します。 現在、MSNメッセンジャーで受信したメッセージから特定のコマンドを抜き出して 別のアプリケーションへ送るというソフトを作ろうとしています。 そこで、まず、あらかじめアクティブにしておいたメッセンジャーで受信した文字列を 1秒間隔でCTRL+A CTRL+Cを利用して取り込む・・・という方法を調べているのですが分かりません。 どなたか答えていただける方がいればよろしくお願いいたします。
先ず確認しよう。 あんたはCでAPIを使っているのかC++でAPIを使っているのかどっちだ。 つーか、誘導されたら元の方では移動する旨書くのが当然だろ。
575 :
デフォルトの名無しさん :2007/12/25(火) 10:42:02
>>574 以前やたらとたらい回しにされて移動移動と書いたせいでウザがられてたもので、
ここ暫くはスレの趣旨に合ってるか確認してから移動の旨を書くようにしていたもので・・・すいません。
私の場合はCです。
アドインAPIとか使わないでやりたいのか?
577 :
デフォルトの名無しさん :2007/12/25(火) 12:08:55
なるべくややこしくならないように作ろうとは思ってるんですが・・・。 アドインAPI? ・・・こんなのあったんですか。 ちょっと説明読んで見ます。
578 :
デフォルトの名無しさん :2007/12/25(火) 13:16:02
僕はAPIではありません
PCTSTRとかのTって何のT?
TCHARのT
いやTの意味を教えてくださいよこの役立たず
Transformableかと思ってた
Type of CHAR
_TEXT()マクロの省略形に思える_T()マクロがあるから、もともとTextのつもりだったんじゃなかろうか。
>>582 サンクス
どのサイトや参考書を見てもLPとかCは載っててもTだけ解説されてないから気になってたんだ
Template
HRESULTのHは・・・
むしろ可変なんだからテンプレートは逆なんじゃ・・・?
ハンドルのH?
591 :
デフォルトの名無しさん :2007/12/25(火) 17:34:25
性会!!
HRESULT=妊娠
質問させてください。 現在、WindowsAPIにてファイルを保存するプログラムを作成しています。 ダイアログボックスを開き、ファイルを保存することは出来たのですが、 ダイアログボックスを開かずかつ相対パスの指定でファイルを保存させ たいと考えています。(キャッシュファイルのように自動的にファイルを保存 するというような感じです) 色々調べたのですが、情報が少なく困ってます。 ご存知の方いましたらご教示ください。お願いします。
>>594 早速のご回答ありがとうございます。
調べてみたところ、TEMPファイルのディレクトリを取得して、
そこに書き込むよう事が出来るみたいですね。
できれば私が指定した場所にファイルを書き込めるようにしたい
と考えています。
現在実行してるexeファイルの場所を取得しておなじ階層に
ファイルを保存したいと考えています。
立て続けに申し訳ありませんが、もしご存知でしたらご教示お願いします。
GetModuleFileName PathRemoveFileSpec PathAppend
>>596 ありがとうございます。
私のやりたかった事ができそうです。
しかし、3つも関数を使わなければいけないのは意外でした。。。
本当にありがとうございました。
こうしてまたひとつprogram filesにファイルを書き込もうとする残念なアプリが
599 :
デフォルトの名無しさん :2007/12/25(火) 21:08:05
レジストリは使いませんと書いておけば 自称上級ユーザが有難がって使うからね
まずインストーラがうざい
Program Filesにデータ置くと何が問題なの? ユーザー?
vistaのUACが怒る
データを置いても別に問題は無いな
usersで書けない →Administrator常用する マルチユーザ無視
>>598 593ですが、特にプログラム上で
program filesにファイルは書きませんが、
なにか問題があるんでしょうか。
良い子は"%APPDATA%\ユニークなフォルダ"か(ユーザの)レジストリに書こうね!
%WINDIR%\WIN.INIにユニークなセクション作って書いていいですか?
〜⊂´⌒∠;゚Д゚)ゝつ
>>606 exeと同じ場所に書くんだろ。exeをProgram Filesにインストールしたら、Program Filesに書くことになる。
でそれのナニがいけないの?
足が臭い
Program Files下には、プログラムを置くものだ。 このディレクトリ下が、一般ユーザの権限でも、書き換えできたら、 セキュリティ上問題になるだろ? だからVistaはProgram Filesに適切にパーミッションを設定した上で、 UACを使っているんだよ。 Program Filesに、一般ユーザ権限で書き込めるってのは、 バッファオーバーフローで任意のコードが実行されるようなセキュリティホールより、 よほど危ない。
でも何も起きた事無いだろ
ユーザーAがアプリAをカスタマイズして使用する ↓ ユーザーBが同じアプリをカスタマイズ ↓ ユーザーAが再度使用する。(;:. @u@)?設定が違うお ほかにもAが立ち上げたままBが一時ログオンしたりすると整合性が取れなくなったり。
あれだな、 「XPを複数ユーザで使ってはいけませぬ」 だな。
>>613 とはいえ、EXEと同じ階層にINIとか作るソフトが多いと思うんだが
Vistaは使ったことないんだがそういうソフトでも警告でまくるの?
>>617 互換性のために、
ファイルとレジストリの仮想化というものがあって、
32bitコードが一般ユーザの権限で実行されている場合、
システムのレジストリに書き込もうとすると、自動的にユーザのレジストリにリダイレクトされ、
Program Filesに書き込もうとすると、別のディレクトリにリダイレクトされる。
>>617 一般ユーザが Program Files 以下に書き込もうとしたら
実際には別のフォルダにアクセスする機能があった気がする
exeのディレクトリにファイル保存するって言うとすぐに反応があっておもしろいな。 インストールしないソフトだったら関係ないじゃん。
615の問題を考慮していればね。
>>621 私のプログラムはProgram Filesへのインストールは必要ないので
>>613 のような心配は無いですが、確かにそう言う危険性も
あるんですね。。。無知でした。今回は大丈夫ですが、
こういう事も念頭に置いて設計するべきでした。
当たり前のことなのかもしれないですが、ありがとうございます。
取り敢えずUNIX勉強しとけ
>>623 でもさ今時一つのマシンみんなで使うとか有り得なくね?
しかしないこともないから もしフリーで配布とかするなら 考慮するのがばふぁりん
この話題って絶対荒れるよなw
インストールするとかしないとか関係ない。 マシンをみんなで使うとか使わないとか関係ない。 ACLとかグループポリシーの実行可能パスとか何のためにあると思ってんだ? システムの安全策の基本中の基本だろ。泥酔時に備えた。
あれだ。呼気中のアルコールを検出するセンサー内臓のPCがほしいぞ。
そんな内臓要らない。
しかしHDDの容量が500GBにもなろうかという時代に ドライブ分割もせず全てのアプリをProgramフォルダにインストールするものかね?
うん
>>627 変なトラウマを持っているのが居着いているだけかと…
2000の頃からMSのガイドラインには設定ファイルはユーザーディレクトリに保存しろとは書いてあるけどね
VistaはProgram Filesに書こうとすると、Usersの下のログインユーザーのディレクトリに書き込まれる。 これは互換性のためにやっていることで、積極的にこの機能を利用するなとは言ってる。 オレも設定ファイルどこ行ったか探し回って気が付いたのだが・・・
OSが対応してくれてるなら何の問題もないじゃん 馬鹿?
32bitポインタの最上位ビットをフラグとして使っても問題ないよね。 HWNDは上位16bitと下位1bitを削っても使えるけど問題ないよね。 つーかシフトJISで問題ないよね。
>>639 それで実際問題が出ていないなら何ら問題ないよ
はい次
>>639 Windows 2000 からアプリケーションのアドレス空間が3GBになるモード
があるので、ポインタの最上位ビットを他の用途に使うことはできない。
HWNDが0x10000以上になることはあった気がする。
VistaでSpy++起動してみたら0x10000超えのHWNDなんていくらでもあるぞ 0x0111001Cなんてのも
どっちもWin9xの話じゃないのか 95のAPIセットはWin32cと呼ばれてた時代が懐かしい
Win32Sも懐かしい
WinGも懐かしい
Win32ってなにげに登録商標なんだよな
×対応してくれる ○馬鹿の尻拭い
「管理者常用は池沼」的な啓蒙を怠ってきたのが悪い。
649 :
デフォルトの名無しさん :2007/12/26(水) 15:59:44
いいやおまえがわるい
まだ「exeと同じフォルダ」にini作るソフトはマシな方 カレントフォルダ=exeのフォルダと決めつけてコーディングしてる馬鹿ソフトが未だに多い
皆さんは大きさを変えられないウィンドウを作るときってどうしてますか? WM_SIZINGに処理を書いているのか、ウィンドウスタイルの変更だけで対応しているのか それぞれのメリットデメリットってどんなのがあるんでしょうか?
ウィンドウスタイルでそれ周り削れば
そんなになんとしてでもサイズ変えて欲しくないって状況じゃないし、スタイルだけだな
WS_SIZEBOX持ってるのにサイズ変えられない窓ってどうよみたいな感じ。
質問です 起動しているプロセスがどういうAPIを使用しているか検出するツールってありますか?
>>655 起動じゃないけど、EXEやDLLのファイルから調べるやつがあるよ。
depends.exe マイクロソフト製
起動しているプロセスを列挙 目的のをチョイスさせる 実行ファイルを探す インポートテーブルを漁る
ってどういうDLLだけか、わかるのは
VS2008になってDepends.exe付属しなくなってない? 見つからないんで2005の使ってる
660 :
651 :2007/12/26(水) 18:04:12
>>653 スタイルだけで普通に使う分には大丈夫ですよね。
ところでSetWindowPosで起動後にウィンドウサイズを最小化限度より
小さく設定するとウィンドウを移動したりしたときに大きさが限度サイズに
勝手になってしまうんですが、これってスタイルだけじゃ済まないですかね?
661 :
デフォルトの名無しさん :2007/12/26(水) 18:14:48
はい
>>659 Dependency Walkerは単独でも入手できる
GetTickCountとtimeGetTimeの違いは何ですか
>>663 解像度の違い。
GetTickCountは、NT系で10ms、9x系だと55ms位か?
timeGetTimeはtimeBeginPeriodさえきちんと呼んでいれば、
1msまで確保できる場合が殆ど。(一応PCに依存するという事にはなっているが)
100ms単位程度の適当な間隔でいいならGetTickCount、
もっとまともに計測したい場合はtimeGetTime、
極めたいならQueryPerformanceCounterってところか。
分解能の間違いです。ごめんなしあ><
気にしなくていいですよ♪
いいや、貴様は気にするべきだ
>9x系だと55ms位か? 懐かしいな、この間隔はDOSのときのタイマー割り込みだな。 8253のカウンター割り込みで、すべてがこれを基準にしてたなあ
ウィンドウの上にカーソルが乗っかってるか判断したい場合 どのようにすればいいいですか?
>>669 WindowFromPointを使うとか。
それかGetWindowRect → PtInRect
SetRectEmptyとかPtInRectってAPIにするほどのものだったんだろうか・・・
それを言い出すとCのabsとかも関数にするほどじゃないと思うけど、まぁ別にいいんじゃね。 すべてのAPIがカーネルモードに入るわけでもないし、ただの便利関数だと思えば。
674 :
デフォルトの名無しさん :2007/12/27(木) 13:21:03
僕はポインターではありません
#define ABS(x) ((x)^1<<sizeof(x)-1)
#define ABS(x) ((x)&(1<<sizeof(x)-1)-1)
なんという1の補数向け
つーかVCだとabsなんてstrcpyみたいにインライン展開されるが
679 :
デフォルトの名無しさん :2007/12/27(木) 15:38:09
インクルードであれじゃない? それマクロのとか
>>680 初心者用の本買って勉強したほうがいいよ。
ahosugi
683 :
デフォルトの名無しさん :2007/12/27(木) 16:42:39
組込関数も知らんのか
>>683 マサチューセッツであれじゃない?
それマクロスのとか
マクロの空を貫いて 地球を撃ったいかづちは 我ら幼い人類に 目覚めてくれと鼻垂れた マクロスマクロス 雄々しく起った若者は 愛する人を庇いつつ 旅立つ日々を戦い開く うるらあヴみいともーろう 闇を切り裂き飛び行く先は 遠く輝く青い星 マクロスマクロスああマクロス
祝25周年!あのマクロスが帰ってくるぞSP!!
>>672 Win16の頃はそれなりの価値があったと思う。
少しでもコードサイズが小さくなる事が重要だったし。
あたしの歌を聴け
>>641 それを使うには、リンカオプション /LEARGEADDRESSAWAREなどで、
ポインタに32ビット全て使っていいよってフラグを立てないといけない。
そのフラグが立っていない場合は、従来通りユーザアドレス空間2GiB。
もちろん
>>639 のようなことをする輩のため。
ちなみにDLLはそういう選択ができないので、
ポインタの最上位ビットを使うことは、問答無用で禁止。
690 :
639 :2007/12/28(金) 01:18:43
(´・∀・`)ホニャァー
へぇー
そんなものねー
Win64はわしが作った AA略
w
シェルエクステンションもここでいいのかな? IExtractImageを実装したんだけど、2000で動かすと時々フォルダ内の全ファイルに同じ サムネイルが出るようになる不具合はどう対処したらいいんでしょう。 MSDNのサンプル実装で起きるし、フラグ類いろいろ変えたりマルチスレッド対応にしたり しても改善せず・・・
それはオーバーレイアイコンじゃないか。
StackWalk() で現在のスレッドのスタックトレースを得るにはどうすればよいのでしょうか? 他のプロセスや他のスレッドのスタックトレースは取れたのですが、自分自身のスタックトレースは GetCurrentProcess() or OpenProcess(PROCESS_ALL_ACCESS, true, GetCurrentProcessId()) GetCurrentThread() or OpenThread(THREAD_ALL_ACCESS, true, GetCurrentThreadId()) の何れの組み合わせでもダメでした。 よろしくお願いします。
http://www.codeguru.com/cpp/w-p/system/threading/article.php/c10317__2/ によるとだな、
>Walking the callstack of the current thread
>On x86 systems (prior to XP), there is no direct supported function (略)
>The recommended way is to throw an exception and catch it.(略)
>If you want to use the documented way, you need to define
>CURRENT_THREAD_VIA_EXCEPTION for the project. (略)
>Starting with XP, and on x64 and IA64 systems, there is a
>documented function to retrieve the context of the current thread:
>RtlCaptureContext.
UIのコードと処理のコードを別々にすることによって得られるメリットを教えて欲しいです。
UI変えても動く
>>701 これでどうかな?
// StackWalk用にCONTEXT構造体の値をセット
CONTEXT currentThreadContext = { CONTEXT_FULL, 0 };
GetThreadContext(GetCurrentThread(), ¤tThreadContext);
currentThreadContext.Esp = currentThreadContext.Ebp;
currentThreadContext.Ebp = *(DWORD*)(ULONG_PTR)(currentThreadContext.Ebp + 0);
currentThreadContext.Eip = *(DWORD*)(ULONG_PTR)(currentThreadContext.Ebp + 4);
currentThreadContext.Ebp = *(DWORD*)(ULONG_PTR)(currentThreadContext.Ebp + 0);
STACKFRAME64 stackFrame = { 0 };
stackFrame.AddrPC.Offset = currentThreadContext.Eip;
stackFrame.AddrPC.Mode = AddrModeFlat;
stackFrame.AddrFrame.Offset = currentThreadContext.Ebp;
stackFrame.AddrFrame.Mode = AddrModeFlat;
stackFrame.AddrStack.Offset = currentThreadContext.Esp;
stackFrame.AddrStack.Mode = AddrModeFlat;
StackWalk64(
IMAGE_FILE_MACHINE_I386,
GetCurrentProcess(),
GetCurrentThread(),
&stackFrame,
¤tThreadContext,
NULL,
SymFunctionTableAccess64,
SymGetModuleBase64,
NULL
);
ありゃ、& が化けちまった。 ?tThreadContext を ¤tThreadContext に読み替えて頂戴。
707 :
デフォルトの名無しさん :2007/12/29(土) 00:09:10
他のアプリケーションでクリックされたツールバーボタンに設定されているツールチップを取得するにはどうすればいいですか? フックして色々取得しようとしたのですがうまくいきませんでした
他のアプリケーションの実装によるだろ・・
インターネットへの接続にプロクシが設定してある環境で、 手っ取り早くインターネット上のHTTPサーバと通信するAPIとかってありますか? プロクシのアドレスを取得してwinsockするしかないのかな
710 :
707 :2007/12/29(土) 00:19:01
>>708 ワードパッドとかみたいな、普通のツールバーでいいのですが...
>>710 TBN_GETINFOTIPでも見てろハゲ
713 :
710 :2007/12/29(土) 00:29:59
>>712 ハゲではありません
嘘を書かないでください
>>713 ならば貴様の頭を晒してみろ
本当はハゲかも知れない
>>713 ごめんごめん、確かズラだったよな。
ハゲとズラは区別するべきなのを忘れてた。
nif規制解除記念カキコ
どうして列挙体とかネームスペース使ってちゃんと整理しないの?
Cにいつからネームスペースが導入されたのかと。
つくるしかない
>>711 サンクス。
INTERNET_OPEN_TYPE_PRECONFIGフラグ付けたらいけた。
proxyのアドレス取得もproxyの経由もHTTP通信も全部やってくれてすげえ楽。
こんなに楽に実装できてしまうなんてAPI様々ですね。
>>709 InternetOpen
InternetOpenUrl
InternetReadFileでおk
確か、これで、IEの設定に自動的に合わせて通信してくれたと思う
Sockを使う場合はレジストリのCurrentVersion\InternetSettings\ProxyServerからIEのプロキシ設定を読み込んで、それを使えばいいと思う
ってもう解決済みだったのか...orz
指定のURLのファイルを保存するような便利な関数ありませんか?
ごめん調べてたら分かりそう
URL Monikorsの出番? 何か便利そうだなあと思いつつ、一度も使った事無いけど。
見ないでもわかる 窓からPCを捨てる
・マージしているインスタンスがなければ、ウインドウ起動して、n秒間マージ処理を受け付ける ・どっかのインスタンスがマージ中なら、そいつに追加して終了。 マージ期間をさらにn秒のばす みたいなヒューリスティックな動作はどうよ。
>>724 URLDownloadTo(Cache)File
>>727 メディアプレーヤーは多重起動防止してるから違うだろう。
リンク先の人は、多重起動を防止せずに、そういう動作をさせたいと言っている。
メディアプレイヤーの多重起動部分をクラックして多重起動できるようにすればいい
SDKのリストビューで、ヘッダコントロールをリストビューのクライアントの外に移動させたいのですが、 MoveWindowやSetWindowPosで移動させようとしても本来の位置から動きません。 移動させるにはどうしたらいいですか
>>727 前回のexe呼び出しからの経過時間で判断すればいいんじゃないか
ファイル複数開いたときはごく短時間のうちに次々とexeが呼ばれる
ファイルを単独で開いたときは前回のexe呼び出しからの経過時間が長い
cmdのtitleコマンドに相当するAPIってなんですか? コンソールアプリのウィンドウキャプションを設定したいです。
736 :
デフォルトの名無しさん :2007/12/29(土) 16:02:57
CreateFileMappingとMapViewOfFileを使うことによりプロセス間で固定長のメモリを 共有することはできますが、あとからサイズを増やすことのできるメモリ共有はありますか? GlobalAllocというAPIで、できそうな気もしなくもないのですが MSDNにこのAPIの使用はお勧めしないと書かれてました
いったん全部開放すれ
つか、可変長のメモリなんざ共有するなんて、どんな用途だ?
739 :
736 :2007/12/29(土) 17:45:50
>>737 美しくない。。。
>>738 ちょwwwおまおま級プロセス間通信
正直手段が目的化してることは否めない
プロセス間通信ならWM_COPYDATAでも使え あとは必要に応じて受け渡せ
Windows3.1ならポインタ渡すだけで共用できて楽しかったな。
>>741 CreateFileMappingで多めに確保してるだけじゃね? どこでメモリサイズ増やしてるん?
>>739 なんつーか、設計やり直した方がいいんじゃねーか?
9xの頃は共有ヒープって隠し機能があったな
出来ない・知らないならそう答えればすむ事を長々と・・・
人にはプライドというものが・・・
それが2chクオリティー
>>724 じゃないがURLDownloadToFileなんて便利な関数があったのかと使ってみたら
下記のようなエラーがでて使えない…
だれかタスケテ
URLDownloadToFile(NULL,"
http://www.google.co.jp/ ","index.html", 0, NULL);
↑こう書いたら ↓こんなエラーが
1>WinAPI.obj : error LNK2019: 未解決の外部シンボル
_URLDownloadToFileA@20 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,
unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。
>>749 tp://msdn2.microsoft.com/en-us/library/ms775123.aspx
Import library Urlmon.lib
と、書いてあるが、Urlmon.lib はインポートしてるの?
>>750 ありがとう。インポートしてなかった
リンクしたらいけました。これは恥ずかしい
>>731 すでに自分のプロセスが起動していた場合、
そっちに引数を渡して即座に終了って設計で、
多重起動していたらどっちに渡せばいいんだって思ったが。
MSのVisual StudioのIDEだって同じことをしているんだよな。
ランダムで決めるとか、もっとも最近、ウインドウがアクティブだったプロセスを選ぶとか、
いろいろと決め方はあるだろうけど。
>>727 シェルエクステンションでメニューを追加するのが一番いいと思う。エクスプローラの挙動を変えようとしているんだもん。
ここってWindowsプログラムの設計上のアドバイスもおkなの?
それとも設計上アレなのはさておき、技術的な質問に対する実装の回答を行うべき(求めるべき)場所なの?
>>753 の言ってることは解るけど、なんか回答としては釈然としない
まあ
>>727 自体はこのスレに向かって投げられた質問で無いけどさ
別に設計上だろうが思想上だろうがオKだろ。 ただ抽象度が上がると質問も回答も難しくなるというだけの話で。
そりゃあそうか。別にそれで「スレの趣旨と違いますっ!」って荒れるのも見てないし そーいうもんかもね。
関連付けのDDEかDroptargetか、adobe readerみたいにexeで受けてからddeか なにかでやるか
ROTに登録という手も
いまさらddeというのもなんだからrotがいいね
よく考えたら、「送る」のメニューにその対象プログラム登録するだけでいいよね・・・。
よく考えなくても、それに、リンク先にも書いてあった
度々出てくるCurSelって何の略?
current selection
HDC hdc; PAINTSTRUCT ps; hdc = BeginPaint(hwnd, &ps); (hdcを使って描画処理) EndPaint(hwnd, &ps); 入門書で描画のところがこんな風になっていたのですが、 BeginPaintの戻り値はpsに格納されたhdcと同じだ、とありました。 ということは、 PAINTSTRUCT ps; BeginPaint(hwnd, &ps); (ps.hdcを使って描画処理) EndPaint(hwnd, &ps); でいいんじゃないかな、と思ってやってみたところできてしまいました。 これは、一度別の変数に代入したのは初心者にわかりやすく、ってことなのでしょうか。 それとも後々、下のやり方だと困る(ps.hdcが変更されて元のhdcが必要になるような?)事があるんでしょうか?
Win16の頃からある関数だし、 戻り値はレジスタ渡しだからコードをちっちゃくできるとかそういうところじゃないか?
if( BeginPaint(hwnd, &ps) ){ ... EndPaint(...); } みたいにできるからじゃね?
>>767 それだとBOOL返せばいいし、
そうなっているものも多いから、主張としては弱いよ。
int a; (a = 5) == 5
単に ps.hdc より hdc の方がタイプ数が少なくてすむからじゃね?
771 :
デフォルトの名無しさん :2007/12/30(日) 19:20:40
前スレで既出で解決済の話題をいつまでも続けてんじゃねーよ糞共
772 :
デフォルトの名無しさん :2007/12/30(日) 20:22:05
よくituneのアートワークを自動登録するアプリとかあるけど ituneのAPIって公開されてるの?
>>772 WIN32APIには該当するものがありません。
>>772 されてるよ
ドキュメントつきのSDKあるし。
Winの場合COMインターフェースなだけだが
775 :
デフォルトの名無しさん :2007/12/30(日) 21:22:36
だから前スレ見れよ糞共
ボタンがいくつか並んでおり、 そのひとつが押された状態になっています。 ほかは普通の状態なのですが、 押されたボタンかどうかを判断するための APIはあるのでしょうか? IsWindowEnabledだと思ったのですが、 どれもtrueを返します。 テスト上押されたボタンの子ウィンドウハンドルは Winspectorで得てます。
>>776 せめてMSDNぐらい検索してから質問したらどうなんだ?
わからないなら黙っててください><
ボタンが押された状態のことを なんというのでしょうか? それがわかればなんとか しらべられそうなのですが。 そのボタンはほかのソフトです。
>>779 せめてMSDNぐらい検索してから質問したらどうなんだ?
わからないなら黙ってろってんだろ><
IsWindowEnabledだと2z4f6m0ueq@\
IsDlgButtonChecked でもないですよね 0が帰ってきます。
BM_GETSTATE、と神の啓示がありました( -人-)
0と4が返ってきました。 いけそうかも。お世話様です。
& 0100
789 :
デフォルトの名無しさん :2007/12/31(月) 01:55:47
起動中の他のアプリが終了された事を検知する方法ってありますか? 待機関数とか使わないで、フックみたいに終了した時に呼んでほしいのですが。 WM_DESTROYをフックで拾ったら終了前から6,7個拾ってきて使い物になりませんでした。
プロセスを見張る
OpenProcessして、 RegisterWaitForSingleObjectでコールバックもらったら。
>>792 さん
>>793 さんありがとうございます。
結局、WM_DESTROYを受け取った時に、GetWindowThreadProcessIdが失敗するかどうかで判断できました。
795 :
デフォルトの名無しさん :2008/01/01(火) 02:23:38
for文内の変数iをfor文内のSendDlgItemMessageを使いエディットコントロールに送信したのですが、 文字化けを起こしてしまいます。 なぜ文字化けが起こるんですかね?
知るかボケ iに聞け
iは文字列なのか?
798 :
デフォルトの名無しさん :2008/01/01(火) 03:29:17
引数か?
数値と文字の違いもわからないでダイアログ出してコントロール弄ってるのか・・・
800 :
デフォルトの名無しさん :2008/01/01(火) 03:34:55
はて? またはObjectなのか…
引数です。
引導 がいいんじゃね
> iに聞け 私に聞け・・・?
ウィンドウが非アクティブな状態でも、キーボードショートカットが効くアプリを作りたい。 で、キーフック用のDLLからウィンドウにPostMessageでWM_SYSKEYDOWN、WM_KEYDOWNを 投げてるんだが、キーボードアクセラレータが反応しない。 自前でWM_COMMANDに変換して投げるしかないのかな。 将来的にキーカスタマイズ機能をつける予定だから、自前で変換するとなると若干めんどい。
もうホットキーでいいんじゃね
806 :
デフォルトの名無しさん :2008/01/01(火) 15:29:58
これなんですが、 for(int i = 0; i<9999; i++) { SendDlgItemMessage(hwnd,IDC_EDIT1,EM_REPLACESEL,0,(LPARAM)((LPSTR)&i)); }
i + '0'
こりゃひどいなwwwww
初wwww
新春初笑い会場はここですかwww
>>806 >(LPSTR)&i
100%分かってないだろうが、この意味を説明できるか?
これはどんな文字列になると思う? ってか、これが文字列になると思うか?
そこを答えてみ。
そろそろ釣り宣言の予感
文字列になるか は愚問だな
文字列にはなるな。 リトルエンディアンなら。 意図した通りの文字列にはならんが。
ここの質問に集ってる 上からものを言うやし をみてるのおもしろいな音符
日本語でお(略
よければヒント下さい。
APIスレなので、wsprintfということで。
>>818 何のヒントだ? 自宅警備員が親からお年玉をせびる方法のヒントか?
新年早々本当にありがとうございます。 …ありがとうございます!!
単に数字を1つ表示させたいだけなら、API的にはSetDlgItemIntだな。
i.toStringでいいじゃん
VC#からAPIを叩く話ですか?
827 :
デフォルトの名無しさん :2008/01/01(火) 20:49:10
VCはtoString使えないの? だっせー
というか、プリミティブとして文字列が無い言語だからなー toStringというメンバ関数があったとして、いったい何を 返せば良いものか・・・。
std::string でええやん。 言語的に std::bad_alloc とか std::bad_cast とか投げられたりすることもあるわけで。
というか、C++が、プリミティブ型に対して パーシャルクラスを定義可能にすれば解決する話かもね
てすと
もうboost::lexical_castでいいよ
またboost厨か
ここに同じ症状に悩んだ奴がいるかどうかわからんのだけど 開発関連アプリの話ってことでここに書いてみる VMware入れてる環境上でWH_CALLWNDPROCRETのグローバルフック使うと、VMware上で動いてる 仮想OSのマウスの動作がおかしくならない?クリックが妙に遅延するとか。 これ回避する方法ないんだろうか・・・
VMware使わなけりゃいいんじゃね
んだなや
838 :
デフォルトの名無しさん :2008/01/02(水) 13:52:00
質問です、お願いします。 (1)クリックを押すとメッセージがキューにポストされる (2)連打したのでもう一個メッセージがキューにポストされる (3)(1)でポストされたメッセージがメッセージループで取り込まれて 処理開始。 (4)(1)のメッセージの処理終了 (5)(2)でポストされたメッセージの処理開始… (2)のようにクリックしてもメッセージキューには入らず、 (4)の後は待機して、クリック待ちにしたいのですが どのようにすればよいですか? ご教授のほどお願いしますm(__)m
>>838 (4) の処理終了直後に全てのメッセージを破棄じゃ駄目か?
840 :
デフォルトの名無しさん :2008/01/02(水) 14:54:48
その破棄の方法、関数を教えてください、素人ですいません
>>840 while(PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE))
;
せめて、マウス・キーボード関係のメッセージに限定しれ・・・
>>838 処理時間がかかるのかな?
処理中もメッセージループが滞らないようにして、メッセージが処理されるようにする。処理中のメッセージは無視する。
ボタンだったら、disableにしておくとか?
844 :
デフォルトの名無しさん :2008/01/02(水) 15:36:07
最近、職場で「出戻り寄生派遣」という言葉が囁かれています。 派遣契約を切られたにもかかわらず「次の派遣先でも切られてしまって生活できません」 などと 言って泣き落としで現場マネージャーにすら一切話がないまま再派遣契約した人のことです。 今月初め、半年前に切った派遣が出社してきてマネージャーも含めみんなびっくりしました。 影でコソコソ偉い人に泣きついて再契約したそうです。同じ部署の人には黙って・・・ そんなことまでして自宅の近くの派遣先にこだわって人間として恥ずかしくないのですか。 仕事に必要な技術がなく勉強する気もないのを逆手にとって 「私のような人の視点で仕事をすることも大切だと思います」と挨拶された時には みんな凍りついていました。派遣でスキルアップとか言ってる癖に以前と同じように 技術を勉強する気はなく「それは私の仕事ではありません」の一点張り、 派遣で収入アップとか言ってる癖に時給は前回と同じで喜んで再契約。 結局、なんの努力もせずに派遣で安直に収入を得たいだけじゃないですか。 身分不相応な商品のローンを払うために派遣だと当然足りない収入は親にも寄生して、 いつ切られるんじゃないかとビクビクしながら人事権のある人間とだけ仲良くし、 契約終了を通知されれば泣き落とし。悲惨な人生ですね。 氏んだほうがいいんじゃないですか。
845 :
841 :2008/01/02(水) 15:37:20
メッセージ範囲は自分で調べて フィルタの範囲指定はしておいてね♥
処理が終わった後で自分に特定のメッセージをポストすれば、 そのメッセージが来るまでのは無駄なクリックと判断できね?
847 :
838 :2008/01/02(水) 16:32:05
while(PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)) を処理後に書き込み ましたが、エラーがでます;;
msgが宣言されていません、というエラーだとエスパーしてみる。 MSG msg;もつけとけ。
849 :
838 :2008/01/02(水) 17:22:29
848>> コンパイルは成功しています、 プログラム実行中に ハンドルされていない例外が発生しましたと表示されてしまいます。 詳しく書かずすいませんでしたm(__)m
いや、まだ全然詳しく書いてないし
>>849 メッセージを吸い込みすぎではないかと。
最後にセミコロンが無いのが気になるけど。 というかホントにそこの文で例外発生してるわけ?
デバッガ使おうぜ〜
どっかの研究所の真紅といい よく作るなこういうの
>>852 セミコロン無いせいで次の行が何度も実行されてたりして
857 :
838 :2008/01/02(水) 21:41:34
ちょっと長いですけど、ここにプログラム書き込んでいいですか??
長いならアップローダー使うべし
XPで 多量の文字を読み込もうとするとウィンドウ全体がおかしくなるのですが ダイアログのエディットコントロールには文字数制限などがあるのでしょうか?
9xは32767の制限があってMFCもそれに引きずられてたこともあった気がするな
861 :
838 :2008/01/02(水) 21:53:28
XPでもEM_SETLIMITTEXTで設定しないと初期状態では32767だったと思う。
コンパイラをだますためだけにキャストをしてはいけないという見本。 msgの型はMSGである必要があるわけで、ウインドウプロシージャの 引数、UINT msgとは関係ない。 よって結論は>848
昨日も別の奴が頭悪いキャストしてたよな
そもそもUINT msgなんて名前付けるからこういう事になるんだよ
866 :
838 :2008/01/02(水) 23:35:54
ありがとうございました☆MSG msgをちゃんと宣言して、コンパイルしたら ちゃんととおりました!(^^)!本当にありがとうございます。 みなさんホントにありがとうございますm(__)m
書きたいけど荒れるから書きません
ああこいつ理解してないな と思った。
SendMessage(GetDlgItem(hWndDlg,IDC_EDIT1),EM_LIMITTEXT,0xFFFFFFE,0); これで出来なかったのですが、 何か違いますか?
>>869 特に変だとは思わん
という訳でバッファの方でも疑え
出来ました。 ありがとうございます!
872 :
デフォルトの名無しさん :2008/01/03(木) 06:43:01
文字を拡大してみると、白と黒のドットで出来ている事がわかりますよね。 ある文字列があって、その左からxピクセル目、上からyピクセル目の色を取得する方法ってないでしょうか?
873 :
872 :2008/01/03(木) 06:46:41
わかりにくいかもしれないので、やりたいことを具体的に言うと、 例えば"し"という文字列を対象に各ピクセルの色を調べて、白なら□、黒なら■を表示するようにします。 そして出力を □□□□□□□□ □■□□□□□□ □■□□□□□□ □■□□□□□□ □■□□□□□□ □■□□□□■□ □□■□□■□□ □□□■■□□□ □□□□□□□□ のようにしたいです。開発環境は WinXP、C言語、Win32API使用、Visual Studio(borlandもあります)です。
白でも黒でもない時はどうするんだ? アンチエイリアスとか
875 :
872 :2008/01/03(木) 07:20:37
>>874 自分で作成したエディットコントロールに入力した文字を入力の対象とするので
大丈夫だと思いますが、環境によってはアンチエイリアスされたりするんですかね?
その場合は、RGB(0x88, 0x88, 0x88)あたりを閾値として白黒化したいと思います。
GetTextExtentPoint32で描画文字列の幅と高さを取って実際に描画して走査すれば
エディット? 普通は(メモリ)DCに描いてGetPixelで拾っていくだけ で、どの辺がわからんの?
>>875 メイリオなんて白黒化したら見れた物じゃないぞ?
879 :
872 :2008/01/03(木) 07:36:16
あぁなるほど。実際にTextOutなりDrawTextなりでウィンドウに文字を描画して、
GetTextExtentPoint32で描画文字列の幅と高さを取得(長方形の領域)。
で、取得した領域内の背景の色を各ピクセル毎に取得していけば実装できるって事ですね。
てことは、一度描画しないと出来ないんですかね?てか普通にエディットコントロール内の文字で
↑と同様の事を行えば可能・・・そうですね。
>>878 SelectObjectでフォントを指定して設定してやろうと思うので、多分大丈夫です・・・。
コントロール上でやると上にウィンドウが乗っかったらアウトだけど、いいのか?
エディットから直接読むのは、画面から読み込むのと同じ意味なるよ。 画面に描画されてないと読めない。
882 :
872 :2008/01/03(木) 09:14:44
>>880 ん?それはTextOutでウィンドウに直接描画しても同じくアウトなのでは?
どっちにしても、対処方法考えないと・・・。
読み取り時だけ、SetWindowLongでTOPMOSTスタイルにするとか・・・かな。
どっちにしろ今すぐには作れないので、設計だけは頭の中で今しっかり考えておこう・・・
オフスクリーンに描けばええやん
884 :
872 :2008/01/03(木) 09:47:19
オフスクリーン、ググってみましたが、どうなんでしょうかね。 環境によっては未使用のメモリ領域がなかったりする可能性ないですかね? ここら辺まで来るとスレ違いかな?スレ違いだったら華麗にスルーして下さい。
2GBもメモリが載っているPCで、たかだか数百バイトのメモリを気にするのか?
886 :
872 :2008/01/03(木) 10:54:48
スクリーンに割り当てられるメモリは上限が決められてるのかと・・・。 最大の解像度とビット数にしたら、オフスクリーンのメモリは0になると勘違いしてました・・・///
自分で作成したエディットコントロールに入力した文字を入力の対象とするので 大丈夫だと思いますが、根拠はありません。
プログレスバーの色を変更することって出来ませんか?
ここは質問箱だから。
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
APIの使い方は、MFCとかのソースをたどっていくといいかも。
893 :
デフォルトの名無しさん :2008/01/03(木) 20:40:09
プログレスバーのバーにビットマップを使う事等は出来ますか?
自分で描くしかないと思われ
最初からbitmap貼り付けといて プログレスバーの色でmask解除
896 :
デフォルトの名無しさん :2008/01/04(金) 01:12:35
>>395 プログレスバーの背景色はどうすれば透過出来るんですか?
>>896 .netならbackcolorにtransparent設定すればいいじゃん
出来るか知らんけど
URLDownloadToFile(NULL,"
http://www.google.co.jp/ ","google.html",0,NULL);
だとちゃんと保存できないのは何で?
Google以外のサイトだとちゃんと保存できるのにGoogleさんだとS_OKが返ってこない…