Win32API質問箱 Build48

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。

過去スレ、関連リンクは>>2-5くらい。

■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(http://msdn.microsoft.com/library/)の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
2デフォルトの名無しさん:2006/12/15(金) 17:42:46
3デフォルトの名無しさん:2006/12/15(金) 17:43:20
32 ttp://pc8.2ch.net/test/read.cgi/tech/1117271829/
31 ttp://pc8.2ch.net/test/read.cgi/tech/1114762194/
30 ttp://pc8.2ch.net/test/read.cgi/tech/1112345886/
29 ttp://pc8.2ch.net/test/read.cgi/tech/1110281860/
28 ttp://pc5.2ch.net/test/read.cgi/tech/1108199304/
27 ttp://pc5.2ch.net/test/read.cgi/tech/1106103119/
26 ttp://pc5.2ch.net/test/read.cgi/tech/1104109858/
25 ttp://pc5.2ch.net/test/read.cgi/tech/1101393155/
24 ttp://pc5.2ch.net/test/read.cgi/tech/1098967135/
23 ttp://pc5.2ch.net/test/read.cgi/tech/1095534704/
22 ttp://pc5.2ch.net/test/read.cgi/tech/1092524669/
21 ttp://pc5.2ch.net/test/read.cgi/tech/1090422324/
20 ttp://pc5.2ch.net/test/read.cgi/tech/1088140233/
19 ttp://pc5.2ch.net/test/read.cgi/tech/1084697545/
18 ttp://pc5.2ch.net/test/read.cgi/tech/1081702990/
17 ttp://pc5.2ch.net/test/read.cgi/tech/1077470361/
16 ttp://pc2.2ch.net/test/read.cgi/tech/1073830065/
15 ttp://pc2.2ch.net/test/read.cgi/tech/1069339866/
14 ttp://pc5.2ch.net/tech/kako/1065/10653/1065328397.html
13 ttp://pc5.2ch.net/tech/kako/1059/10595/1059549320.html
12 ttp://pc5.2ch.net/tech/kako/1056/10560/1056033645.html
11 ttp://pc5.2ch.net/tech/kako/1052/10526/1052651750.html
10 ttp://pc5.2ch.net/tech/kako/1047/10478/1047819779.html
9 ttp://pc5.2ch.net/tech/kako/1044/10449/1044929160.html
8 ttp://pc5.2ch.net/tech/kako/1040/10409/1040964626.html
7 ttp://pc3.2ch.net/tech/kako/1036/10366/1036654893.html
6 ttp://pc3.2ch.net/tech/kako/1032/10325/1032548635.html
5 ttp://pc3.2ch.net/tech/kako/1028/10285/1028580373.html
4 ttp://pc3.2ch.net/tech/kako/1023/10233/1023361418.html
3 ttp://pc.2ch.net/tech/kako/1017/10170/1017072275.html
2 ttp://pc.2ch.net/tech/kako/1006/10067/1006783012.html
1 ttp://pc.2ch.net/tech/kako/991/991576947.html
4デフォルトの名無しさん:2006/12/15(金) 17:44:20
5デフォルトの名無しさん:2006/12/15(金) 17:45:21
MSDN日本語版は誤訳があったり、一部欠けていたりするなど不完全なため、英語版推奨。
http://msdn.microsoft.com/library/
http://msdn2.microsoft.com/en-us/library/

おまけ;Windows SDK for Windows Vista RC1の文書。
http://windowssdk.msdn.microsoft.com/en-us/library/

MSDN ライブラリ 2006年8月版
http://www.microsoft.com/downloads/details.aspx?FamilyID=6671F8DA-B0CB-41DE-AD93-798FC71D344D&displaylang=ja
6デフォルトの名無しさん:2006/12/15(金) 18:04:27
windowssdk.msdn.microsoft.comは、もうmsdn2へ転送されるようになっている。
7デフォルトの名無しさん:2006/12/15(金) 20:50:59
C#相談室より、半誘導されてこちらにて質問させていただきます。

現在、キーボードやマウスによるキー入力を
どのデバイスから送られて来たのか判断した後、
場合によっては入力を握りつぶしたいと考えております。

デバイスを判断し、キーを取得するだけですと
WM_INPUTにてRawInputを使用することにより実現できたのですが、
キーを握りつぶすことが私の試行錯誤した上ではできませんでした。

キーを握りつぶそうとWH_KEYBOARD_LLをフックし、
WH_KEYBOARD_LLの時点でキーを握りつぶすとメッセージの順序の関係上だと思うのですが
WM_INPUTも呼ばれなくなってしまい、デバイスの識別ができないでおります。

他の処理も考え付かず、途方にくれている状態です。
WH_KEYBOARD_LLがWM_INPUTより先に呼ばれているならそこでデバイスを
識別できないかとも考えたのですが、私の調べた限りではできませんでした。

どうか皆様のお力を少しでもよいので貸していただけないでしょうか。
よろしくお願いいたします。
8デフォルトの名無しさん:2006/12/15(金) 21:10:05
999 名前:デフォルトの名無しさん 本日のレス 投稿日:2006/12/15(金) 21:01:08
1000なら1ヶ月ぶりに休みが取れる…

甘かったな・・・・もう1ヶ月がんがれ。
9デフォルトの名無しさん:2006/12/15(金) 21:45:03
>>7
WH_KEYBOARD_LLを仕込んでもマウスイベントは来ないよね?
マウス用にWH_MOUSE_LLも仕込めば良いんじゃないの?
10デフォルトの名無しさん:2006/12/15(金) 21:58:12
>どのデバイスから送られて来た

そんなにたくさんのデバイスがあるの?
マウスが16個とか?
11デフォルトの名無しさん:2006/12/15(金) 21:58:17
ヒープやスタックの開始アドレスを教えてくれるAPIはありますか?
127:2006/12/15(金) 22:02:57
>>7
キーボードを例にとって、検証したので、
マウスの場合は載せておりませんでした。

>>10
はい、そのような状況下を仮定しております。

基本的に、マウスの件よりもキーボードのほうを重視しており、
マウスは同時に実装できればいいとオマケ程度に思っております。
不足していて申し訳ありません
13デフォルトの名無しさん:2006/12/15(金) 23:15:49
>>11
スタックはAPIではなくバッドノウハウで取得できる。
ヒープはシラネ。
14デフォルトの名無しさん:2006/12/15(金) 23:37:31
>>7
RegisterRawInputDevicesで
適当なwindowにWM_INPUTを飛ばしてやれば?
15デフォルトの名無しさん:2006/12/16(土) 00:57:51
>>14
というのはどういうことなのでしょうか?
WM_INPUTを飛ばすということは、すべてキーフックで握りつぶして
その後WM_INPUTを自分で送り、そこでデバイスの判別をして
場合によりまたキーを送るといった感じなのでしょうか。
ただその場合もWM_INPUTを送る際にデバイスが分かってないと意味がないので
結果目的は達せないのでは?それとも方法があるのかな・・

もしかすると自分の見解が違うのかもしれませんが、
その場合申し訳ないです。もう少し詳しく聞かせていただければ幸いです
16デフォルトの名無しさん:2006/12/16(土) 01:28:56
つか何をしたいのかよくわからん。
WM_INPUTの引数でデバイスの判別できるなら
メッセージハンドラでやりたいことすればいいんでねぇ?てこと。
あと適当なwindow→自前のwindowというべきだったかな。
17デフォルトの名無しさん:2006/12/16(土) 01:35:19
握りつぶしたいんだろ?
でも WM_INPUT を握りつぶしてもキー入力は止められない、さあどうしよう、と。

RawInput からは外れるがフィルタドライバとかでどうにかならんかな?
C# じゃ多分書けないだろうけど。
18デフォルトの名無しさん:2006/12/16(土) 01:45:35
あぁそうか。フィルタドライバはデバイスを限定するために必要って事か。
となるとC丼じゃ間違いなく無理だな。DDKの仕事だ。
19デフォルトの名無しさん:2006/12/16(土) 11:35:21
Win32APIで、μ秒単位の割り込みを発生させるにはどうやったいいんでしょう?
20デフォルトの名無しさん:2006/12/16(土) 11:38:49
無理
21デフォルトの名無しさん:2006/12/16(土) 11:39:36
ドライバ書く。
ってWin32 APIと違うか。
22デフォルトの名無しさん:2006/12/16(土) 12:13:52
ドライバも開発キットが無料でDLできたり、
日本語の書籍も少しだけ出てたりして敷居が下がったな。


っていうけど英語が苦手な俺にはクリスマスとかバレンタイン並みに遠く感じる世界だった('A`)
23デフォルトの名無しさん:2006/12/16(土) 12:17:16
技術的な敷居は下がったけどx64で署名が強要されたりする方面の敷居は高くなったな
24デフォルトの名無しさん:2006/12/16(土) 14:08:08
RegisterClassEx()の引数のWNDCLASSEX構造体の中身ってアプリケーションが終了するまで
保持しなきゃいけないの?

今複数のクラスを登録するつもりで一つのWNDCLASSEX変数の値を一部書き換えてはRegisterClassEx()、
一部書き換えてはRegisterClassEx()するコード書いたら、先に登録したはずのクラス名が見つからんとか
言われてしまった。んで各クラス数ぶんだけ変数領域別にしたら正常に動作。
MSDNにはそれっぽい事は見つからなかったので教えて下され
25デフォルトの名無しさん:2006/12/16(土) 16:02:29
>>24
違う原因としか思えない
26デフォルトの名無しさん:2006/12/16(土) 16:45:11
WNDCLASSEXをローカル変数にしたコードが無問題なので原因は別
27デフォルトの名無しさん:2006/12/16(土) 18:07:24
クラス名っていうから文字列データの話じゃなかろうか。

普通に考えればコピーされているはずだが。
28デフォルトの名無しさん:2006/12/16(土) 18:16:37
前スレ >>963
HKEY_CLASSES_ROOT
より
HKEY_CURRENT_USER\Software\Classes
のほうが優先されるから気をつけて。
29デフォルトの名無しさん:2006/12/16(土) 18:22:16
>>11
GetSystemInfo
30デフォルトの名無しさん:2006/12/16(土) 18:23:28
>>28
それは違う。正しくは
HKEY_LOCAL_MACHINE\Software\Classes
より
HKEY_CURRENT_USER\Software\Classes
が優先される。そもそも
HKEY_CLASSES_ROOT
は優先順位を考慮して両方をマージした結果になるので他を見る必要はない。
317:2006/12/16(土) 19:30:48
やはりフィルタドライバの作成になるのでしょうか・・
何度かフィルタドライバの話も出ており、興味はあったのですが
なかなか踏み込めずにいたのでこれを機会になんとか頑張ってみたいと思います。
お答えいただいた皆様ありがとうございました。
32デフォルトの名無しさん:2006/12/16(土) 20:13:22
教えてください。

リソースのメニューバーにあるボタンが押下された場合
ハンドルを取得するにはどうすればいいんでしょうか?

CheckBox = SendMessage(???, BM_GETCHECK, 0, 0L);
でチェックボックスの状態を調べたいんですが
リソースで作成されたメニューのコントロールのハンドルがわかりませぬ。

3332:2006/12/16(土) 20:28:11
EnableMenuItemを使って自己解決しました。
34デフォルトの名無しさん:2006/12/16(土) 22:50:51
ビットマップ画像中のゴミ(白のバックに黒ピクセルが点在してる)を検出して
白く塗すプログラムを組んでいます。
3500×3500くらいまでの画像なら問題なく実行するのですが、4000×7000くらい以上では
処理が行われなくなります。(少しの間矢印ポインタが砂時計になるだけ)
メモリは確保できてるのでオーバーフローはないと思うのですが、他に考えられそうな
原因があればご助言ください。
そこから改善を詰めていきたいと思います。
よろしくお願いします。
35デフォルトの名無しさん:2006/12/16(土) 23:12:04
お前が書いたコードにバグがある。
36デフォルトの名無しさん:2006/12/16(土) 23:33:43
エラーコードくらい確認したんだろうな。
37デフォルトの名無しさん:2006/12/16(土) 23:51:00
ダイアログにアイコンつけたいんですがリソースに記述するのか
別のやり方でアイコンを貼り付けるのかわかりません。

PROCESSDLG DIALOGEX 0, 0, 300, 125
STYLE WS_POPUP | WS_CAPTION | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU
CAPTION "ダイアログ"
ICON IDI_ICON /* これじゃダメなのか!? */
FONT 9, "MS Pゴシック"
BEGIN
DEFPUSHBUTTON テスト", IDC_BOOT, 50, 50, 50, 14
END

お願いします。
3834:2006/12/17(日) 00:14:25
>>35>>36
調べてみたところ、「このコマンドを実行するのに十分な記憶域がありません。」とのことでした。
メモリまわりの処理を見直してみることにします。
ありがとうございました。
3934:2006/12/17(日) 00:32:36
原因が分かりました!!
ちゃんと処理するようになりました!!
>>36さんが指摘してくださったエラーコード取得のおかげです!!
ほんとうにありがとうございました!!
40デフォルトの名無しさん:2006/12/17(日) 00:56:12
たまに成功してるのにエラーコード設定するAPIがあるんだよな
しかもMSDNに記述してなかったり… ほんとWin32APIは泥沼だぜ(´・ω・`)

>>37
ダイアログ自体なら
SendMessage(hwnd, WM_SETICON, ICON_SMALL, hIcon);
スタティックへのイメージ貼り付けなら
SendDlgItemMessage(hwnd, IDC_xxx, STM_SETICON, hIcon, 0);
41デフォルトの名無しさん:2006/12/17(日) 01:05:56
>>40
あー、気づけよ俺orz

ありがとうございます。
42デフォルトの名無しさん:2006/12/17(日) 03:16:18
>>19
調べれば沢山見つかると思うけど、
QueryPerformanceFrequency
QueryPerformanceCounter
あたりで、計測すれば1msec以下の周期は作る事ができる。
43デフォルトの名無しさん:2006/12/17(日) 10:07:32
環境:vs2005EE C/C++

GDI+を使ってみようと思い、下記猫でも〜のを参考に
ttp://www.kumei.ne.jp/c_lang/sdk4/sdk_335.htm

メインのcppに #include <gdiplus.h> using namespace Gdiplus; を追加し
プロジェクトにGdiplus.libを追加し 
〜とやって、雛形のみを作成し、起動させるだけのテストをしてみたのですが

コンパイルしたところ
gdimagepulsimaging.h の67行目の IImageBytes : public IUnknown が問題らしく

c:\program files\microsoft platform sdk\include\gdiplusimaging.h(67) :
error C2440: '初期化中' : 'const char [37]' から 'int' に変換できません。この変換が可能なコンテキストはありません。
c:\program files\microsoft platform sdk\include\gdiplusimaging.h(67) :
error C2146: 構文エラー : ';' が、識別子 'IImageBytes' の前に必要です。
c:\program files\microsoft platform sdk\include\gdiplusimaging.h(67) :
error C2470: 'IImageBytes' : 関数定義のようですが、パラメータ リストがありません。外見上の本体をスキップします。
c:\program files\microsoft platform sdk\include\gdiplusimaging.h(67) :
error C2059: 構文エラー : 'public'
c:\program files\microsoft platform sdk\include\gdiplusimaging.h(246) :
error C2146: 構文エラー : ';' が、識別子 'id' の前に必要です。
c:\program files\microsoft platform sdk\include\gdiplusimaging.h(246) :
error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
c:\program files\microsoft platform sdk\include\gdiplusimaging.h(246) :
error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
c:\program files\microsoft platform sdk\include\gdiplusheaders.h(384) :
error C2143: 構文エラー : ')' が '*' の前にありません。
c:\program files\microsoft platform sdk\include\gdiplusheaders.h(384) :
error C2143: 構文エラー : ';' が '*' の前にありません。
…と以下エラーが100以上出てきてしまいました。
44デフォルトの名無しさん:2006/12/17(日) 10:15:29
↑一行目のエラーが抜けてました

c:\program files\microsoft platform sdk\include\gdiplusimaging.h(67) :
error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません


これは何かまだしなくてはいけない事があるのでしょうか
それとも、IImageBytes : public IUnknown の前に型指定子を書き足した方が良いんでしょうか

実行ソース:
Gdiplus.libを追加

#include <gdiplus.h>
#include <gdiplus.h>
using namespace Gdiplus;

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
// グローバル文字列を初期化しています。

GdiplusStartup(&gdiToken, &gdiSI, NULL);
// アプリケーションの初期化を実行します:

// メイン メッセージ ループ:

GdiplusShutdown(gdiToken);
return (int) msg.wParam;
}

〜:処理
45デフォルトの名無しさん:2006/12/17(日) 10:17:11

#include <gdiplus.h>
#include <gdiplus.h>
はコピペ失敗

#include <gdiplus.h> 一つになってます。
あと、int APIENTRY _tWinMain以外は手を付けていないので省略しました。
46デフォルトの名無しさん:2006/12/17(日) 10:44:47
<gdiplus.h>より先に<ole2.h>をインクルードしろ。
WIN32_LEAN_AND_MEAN抜きで<windows.h>をインクルードするのも良い。
47デフォルトの名無しさん:2006/12/17(日) 10:45:57
すみません、自己解決しました。

#include <comsvcs.h> を
#include <gdiplus.h> の前に入れたら通りました。
48デフォルトの名無しさん:2006/12/17(日) 10:46:38
>>46
ありがとうございます。
49デフォルトの名無しさん:2006/12/17(日) 11:13:14
>>40
APIが成功した場合、特に明記がない場合GetLastErrorの値は不定だったと思う。
つまり、明記されている条件以外のGetLastError値に意味はない。
50デフォルトの名無しさん:2006/12/17(日) 11:46:41
タスクトレイにアイコンを表示させたいのですがうまくいきません。
タスクトレイにはアイコンのスペースだけが空いて絵が表示されないです。

リソーススクリプトには
MYICONICONDISCARDABLE"icon.ico"
とし

関数で

#define MYTRAY_MESSAGE (WM_APP + 1)
NOTIFYICONDATA ni;

int MyInitNotifyIcon(HWND hWnd)
{
memset(&ni, 0, sizeof(NOTIFYICONDATA));

ni.cbSize = sizeof(NOTIFYICONDATA);
ni.hWnd = hWnd;
ni.uID = 0;
ni.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
ni.hIcon = (HICON)LoadImage(hInst, "MYICON", IMAGE_ICON, 0, 0, 0);
ni.uCallbackMessage = MYTRAY_MESSAGE;
strcpy(ni.szTip, "  ");
Shell_NotifyIcon(NIM_ADD, &ni);
return 0;
}


icon.icoは作業用のフォルダに入れています。
5150:2006/12/17(日) 11:49:12
訂正

リソーススクリプト

MYICON   ICON    DISCARDABLE   "icon.ico"
52デフォルトの名無しさん:2006/12/17(日) 12:17:57
>>40が言う、MSDNに記述してないAPIを聞いておきたい。
53デフォルトの名無しさん:2006/12/17(日) 12:55:39
テスト &ni
54デフォルトの名無しさん:2006/12/17(日) 12:56:44
>>52
SC_HANDLE h = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT); // ここで997
SetLastError(NO_ERROR);
CloseServiceHandle(h); // ここでも997
おもしろくもないけど2kでどうぞ
XPじゃなんともないから極度に環境に起因してるのかも知れんけど、起こりうる一例ということで

うちの2kでエラーコードログとったらどこもかしこも997ですげえ欝だった
55デフォルトの名無しさん:2006/12/17(日) 12:58:35
∋ = &ni か
56デフォルトの名無しさん:2006/12/17(日) 13:11:56
アイコンのサイズが合ってないんじゃね?
57デフォルトの名無しさん:2006/12/17(日) 13:24:31
リソースファイルが作れてないとか?

つか、>>53>>55の意味が分からん
58デフォルトの名無しさん:2006/12/17(日) 13:36:53
特殊文字のテスト
59デフォルトの名無しさん:2006/12/17(日) 14:19:42
6054:2006/12/17(日) 14:28:10
ああ俺52の意味履き違えてるね
MessageBoxTimeoutとか?
6150:2006/12/17(日) 14:31:20
>>56
アイコンはほかのソフトとかで使われているものでためしています。

>>57
リソースファイルはダイアロボックスも書いているのですが
ダイアロボックスは問題なく起動しています。
>>51で書込みをしたようにアイコンの定義は書いてあります。
62デフォルトの名無しさん:2006/12/17(日) 14:39:24
>>54
>>49
APIが成功したらGetLastErrorも成功値を返すとは記述されてない。
63デフォルトの名無しさん:2006/12/17(日) 15:04:33
16x16に32x32のアイコン入れても無駄だって
64デフォルトの名無しさん:2006/12/17(日) 17:04:20
作業用のフォルダ・・・
65デフォルトの名無しさん:2006/12/17(日) 17:15:50
ni.hIcon = (HICON)GetClassLong( hWnd, GCL_HICONSM );
アプリアイコンとタスクトレイ用のアイコンが変わらないなら此でもok
66デフォルトの名無しさん:2006/12/17(日) 17:18:20
あ、二行目は忘れてくれ
67デフォルトの名無しさん:2006/12/17(日) 17:32:27
SendMessage(Kanojo, WM_LOVE, wParam, lParam);

と、何度も彼女にメッセージを送ってみたのですが届きません。
何者かにメッセージフックされてるのでしょうか?
原因を教えて下さい ><
68デフォルトの名無しさん:2006/12/17(日) 17:41:17
>>67
そのMsgは破棄されて次の処理に移ってると思われる。
多分、こんなSQLが発行されているかと。
insert into Kanojo.Manko values('HokanoOtoko','DekaiChinpo')
もうCommitされているのでRollBack不可らしい。
Update,Delete文発行してもTriggerではじかれるので無理みたい。






今年のクリスマスはあきらめれ。
69デフォルトの名無しさん:2006/12/17(日) 17:42:56
#ifdef WM_LOVE
#undef WM_LOVE
#endif
#define WM_LOVE WM_KILLFOCUS
70デフォルトの名無しさん:2006/12/17(日) 18:07:56
ツマンネ
7167:2006/12/17(日) 18:12:10
>>68 ありがとう ><
72デフォルトの名無しさん:2006/12/17(日) 18:34:03
>>50 そのままで出来るはず。
新規にプロジェクトを作成して、もう一度 やってみてはどうだろう?
73デフォルトの名無しさん:2006/12/17(日) 18:50:53
Visual Studioでメニューの  デバッグ->デバッグなしで開始  からコンソルアプリを起動すると
アプリが終了するとPress any key to continueとでるのを真似したいのですがどうすればいいか分かりません

CreateProcessでCREATE_NEW_CONSOLEを指定してコンソールが表示されて実行されるのですが終了すると
自動的に閉じられてしまいます

コンソ-ルアプリ側のソースを変更しないで実現する方法はありますか?
74デフォルトの名無しさん:2006/12/17(日) 19:09:55
api使わなくてもCの初歩でできるでしょ
75デフォルトの名無しさん:2006/12/17(日) 20:17:08
大サービスだ。こんな感じだろ。
#define _WIN32_IE 0x0400
#include <windows.h>
#include <shlwapi.h>

int main()
{
    STARTUPINFO si = {sizeof si};
    PROCESS_INFOMATION pi;
    if (!CreateProcess(0, PathGetArgs(GetCommandLine()), ..., &si, &pi))
        return 1;
    CloseHandle(pi.hThread);
    WaitForSingleObject(pi.hProcess, INFINITE);
    CloseHandle(pi.hProcess);
    TCHAR msg[] = TEXT("Press any key to continue");
    DWORD numWrite;
    WriteConsole(GetStdHandle(STD_ERROR_HANDLE), msg, sizeof msg / sizeof msg[0] - 1, &numWrite, 0);
    return 0;
}
76デフォルトの名無しさん:2006/12/17(日) 20:49:17
ゴッド
7773:2006/12/17(日) 20:51:08
>>75
ソースありがとうございます

しかしながらこれだとCreateProcess呼び出し側のコンソールにPress any key to continueが表示されると思われます
今回実現したいのはCreateProcessのときCREATE_NEW_CONSOLEを指定し対象アプリを別コンソールで実行し
そのコンソールにPress any key to continueを表示するようにしたいです. 説明不足でごめんなさい

>>74
プロセス関連で使えるC標準関数はsystemとかpopenだと思うのですが
systemの場合、以下のダミーexeをCreateProcess + CREATE_NEW_CONSOLEを呼び出すことによって実現できました
popenは現在の環境(VC7.1)にはありませんでした. ありがとうございます
int main(...) {
 std::string command(argv[1]);
 command = "\"" + command + "\"";
 system(command.c_str());
 std::cout << "Press any key to continue" << std::endl;
 char c; std::cin >> c;
}
78デフォルトの名無しさん:2006/12/17(日) 20:54:16
>>77
75のプログラムをCREATE_NEW_CONSOLEを指定してCreateProcessすればいい。
7950:2006/12/17(日) 23:48:21
>>72
新しくやってもだめでした。

>>65
それもやってみたのですが同じ現象でした。

>>63
32x32のアイコンを使っていました。
80デフォルトの名無しさん:2006/12/18(月) 00:11:37
RS-232Cシリアル通信でCTS監視有効時の
WriteFileの動作仕様を知りたいです。

・送信中ずっとCTS ON→問題なく送信される
・送信途中にCTS OFF→どうなるのでしょうか?

・1バイト送信するためには電気信号は10パルス分の時間が必要ですが、
例えば、5パルス目にCTS OFFとなった場合は、送信中の1バイト分のデータは相手に届くのでしょうか?
8180:2006/12/18(月) 00:19:05
追加です。
CTS監視有効はDCB構造体で指定しています。
(DCB.fOutxCtsFlow = TRUE; // CTS output flow control )

よろしくお願いします。
82デフォルトの名無しさん:2006/12/18(月) 01:26:25
マルチスレッドうぜえええええええええええええ
もう煮詰まって無理ぽsdg;lfかjf;lcz;lg;あえが

叫んでみたかったんだ
83デフォルトの名無しさん:2006/12/18(月) 01:38:44
ストレス発散はド低脳スレでやれよ
84デフォルトの名無しさん:2006/12/18(月) 02:15:10
責任転嫁されて可哀想なマルチスレッド‥
85デフォルトの名無しさん:2006/12/18(月) 02:19:18
CreateDIBitmapを用いたBITMAPの読み込みには、GDIリソースの制限が絡む(XPではヒープ領域?)、
とのことですが、読み込みたいファイルのサイズが読み込めないほどの大きさだった場合、
どのようにすれば読み込めるようにできるでしょうか?
PC環境の変更によるものよりも、プログラム側での処置ができるとうれしいです。
86デフォルトの名無しさん:2006/12/18(月) 02:40:18
>>85
なんつーか、読み込めないものは読み込めないでしょ。
もし一部でもいいから読み込みたいってんなら、ビットマップのファイル
構造を自分で走査すればいい。必要な範囲だけ取り出してくることも
できるわけだし。
8785:2006/12/18(月) 10:21:54
>>86
了解です。
しかし、photoshopなんかの画像処理ソフトは大きい画像でも平気で読み込んでしまうのは
なぜなんでしょうか??
88デフォルトの名無しさん:2006/12/18(月) 10:28:14
>>85
自分はプログラムは 98機で未だにやっているが、写真が 3008x2000になって
テスト出来なくて困った。jpeg解凍してサイズが大きくて98機の場合、一辺が
1500未満になるまで縮めるようにしたよ。StretchDIBits()が効かなくて初め
はなんだろうと思ったね。写真をアイコンにするために一気に 64x64 とかも
出来なかった。そのせいで画像縮小も勉強した。手間のかかることよ。
89デフォルトの名無しさん:2006/12/18(月) 10:31:04
>>87
ビットマップのファイル構造を自分で走査してるから
9085:2006/12/18(月) 10:49:07
>>88
それはたいへんですね・・・。
WinFXで解決してほしいですね。
>>89
なるほど、それをすれば解決できそうですね。
ありがとうございました。
91デフォルトの名無しさん:2006/12/18(月) 18:01:13
元WinFX現.Net3.0では、WindowsXP,2003,Vistaのみの対応となるので、
ある意味解決してる(w
92デフォルトの名無しさん:2006/12/18(月) 18:15:25
もう98はええやろ・・・
93デフォルトの名無しさん:2006/12/18(月) 18:35:29
>92
ウチでは現役だぞ…
94デフォルトの名無しさん:2006/12/18(月) 18:49:28
だから何?
95デフォルトの名無しさん:2006/12/18(月) 20:31:53
AdvancedWindows買ったぜwwwwwwwww
これで俺も最強のプログラマだな。な?
96デフォルトの名無しさん:2006/12/18(月) 20:34:12
本棚の飾りですか?
97デフォルトの名無しさん:2006/12/18(月) 20:38:02
DIBSectionを使え、ということらしい。
98デフォルトの名無しさん:2006/12/18(月) 20:39:26
>>96
ええそうです。
99デフォルトの名無しさん:2006/12/18(月) 20:53:15
>>95
俺も半月前に買ったくちだぜw 
.NET3使って何ぼな時代に1万(1000page)の本はテンションあがるよなww
100デフォルトの名無しさん:2006/12/18(月) 23:11:03
注目!!!!

http://www.microsoft.com/japan/msdn/vstudio/downloads/sp/vs2005/sp1/

Visual Studio 2005 SP1きたお
101デフォルトの名無しさん:2006/12/18(月) 23:12:52
windows updateで前から出来てなかったっけ?
102デフォルトの名無しさん:2006/12/18(月) 23:52:34
スレ違い
103デフォルトの名無しさん:2006/12/18(月) 23:52:38
サウンドを鳴らす事はできたのですが
これを2倍速で音の高さを変えないで鳴らすって事ができません。

どうすれば良いのでしょうか?
104デフォルトの名無しさん:2006/12/18(月) 23:57:08
かんがえかただけ…

再生データの並びを仮に
1,2,3,4,5,6,7,8,9とする。
高速再生するときは
13579とあいだをはぶいて再生。


実際はここまで単純でなく、演算して何とかつなげる
105デフォルトの名無しさん:2006/12/19(火) 00:08:06

すれ違い
106デフォルトの名無しさん:2006/12/19(火) 00:10:37
>103
そりゃなかなか難しい。話速変換とかで調べてみな。
107デフォルトの名無しさん:2006/12/19(火) 00:29:54
>>104
それだとオクターブ高くなるんじゃね?
108103:2006/12/19(火) 00:33:45
>>104,106
ありがとうございます。
とりあえずAPIへ送るデータを加工してやってみます。
109104:2006/12/19(火) 00:36:39
>>107
説明が適当すぎたね。
実際は 123456789だと表現しづらい…じゃあそんな表現するなよ俺!

123456789のそれぞれの数字はは実際のバイトじゃなくてデータの塊なのです。
各数字をたとえば0.1秒の音声データブロックと考えてください。

1秒のデータを0.5秒で再生するには間のデータを間引いてつなげるのです。

11095:2006/12/19(火) 00:56:24
>>99
俺の心理を読む奴がいるとはwwwwwwwww

買う=金欠になる事をわかっていながら頭を抱えて悩んだ末に
決死の覚悟で購入した俺はある種半狂乱状態だったんだwwwwwww

高いんだよwwwwwwwwwwww
111デフォルトの名無しさん:2006/12/19(火) 04:05:06
SSL通信したいんですが
112デフォルトの名無しさん:2006/12/19(火) 07:40:17
許可します
113デフォルトの名無しさん:2006/12/19(火) 07:53:55
リストビューで質問があります。
リストビューに大量のアイテムデータを表示させると、やっぱりメモリはへりつづけていくものでしょうか?
パフォーマンスモニタでメモリをチェックしているとへっていくばかりなので・・・
よろしくお願いします。
114デフォルトの名無しさん:2006/12/19(火) 08:42:22
多かったらスクロールだろうから「表示」自体では一定以上はメモリ使わない。
115デフォルトの名無しさん:2006/12/19(火) 14:47:04
くだすれC言語(初心者用)から誘導を受けてきました。
BCB6でソフトウェアキーボードを作ってみようと思うんですが、
keybd_eventのことについて全く知識がなく、検索かけてみたんですが、
あまり詳しく載っている所がありません。
加えて、文字を打ち込みたい箇所をアクティブにする操作も分からないので、
どなたか詳しく紹介されてあるページか、操作そのものを教えていただけると幸いです。。。。
116デフォルトの名無しさん:2006/12/19(火) 15:01:25
>>115
keybd_eventは使うな
SendInputを使え
117デフォルトの名無しさん:2006/12/19(火) 15:03:40
VOID EventKey(CONST DWORD dwKey)
{
INT i;
INPUT inputKey[2];

for(i = 0; i < 2; i++)
{
inputKey[i].type = INPUT_KEYBOARD;
inputKey[i].ki.wVk = (WORD)dwKey;
inputKey[i].ki.wScan = (WORD)MapVirtualKey((UINT)dwKey, 0);
inputKey[i].ki.time = 0;
if((i % 2) == 0)
{
inputKey[i].ki.dwFlags = 0;
}
else
{
inputKey[i].ki.dwFlags = KEYEVENTF_KEYUP;
}
inputKey[i].ki.dwExtraInfo = 0;
}

SendInput(2, &inputKey[0], sizeof(INPUT));

return;
}
11850:2006/12/19(火) 15:05:58
アイコン表示されるようになりました。
常駐プログラムを作成使用と考えているのですが
winmainにダミーの親ウインドウを作り
MyInitNotifyIcon関数(タスクトレイでのアイコン表示)
を呼び出しています。しかし、アイコンは最初表示するのですが
すぐに消えてしまいます。
何かいい方法はありますか?
119デフォルトの名無しさん:2006/12/19(火) 15:15:23
keybd_eventに対するSendInputの利点って、
連続で送信する場合に、間に割り込まれることがないってこと?

キーを一つだけ押したいって場合には、どちらも差はないのかな?
120デフォルトの名無しさん:2006/12/19(火) 15:25:22
>>119
> Windows NT/2000/XP:This function has been superseded. Use SendInput instead.
121115:2006/12/19(火) 20:08:16
>116-117
大体理解できました。
SendInputを用いて取り組んで見ます。
ありがとうございます。
122デフォルトの名無しさん:2006/12/19(火) 21:09:32
>>114
どうも〜
123デフォルトの名無しさん:2006/12/19(火) 23:18:26
ウィンドウのサイズ変更について質問させてください。
ウィンドウスタイルでWS_POPUPを指定して作ったウィンドウで、
マウス操作でサイズを変更できるようにするために、WM_NCHITTESTでHTLEFT等
を返すようにして対応しました。この状態では旨く動きます。

ところが、WS_SYSMENUを追加するとサイズ変更ができなくなりました。
カーソルも矢印に変化しません。

どなたか、この理由か回避方法を教えてください。
指定しているウィンドウスタイルはWS_POPUPとWS_SYSMENUのみです。
124デフォルトの名無しさん:2006/12/19(火) 23:46:36
不思議な現象を見つけました。

以下のプログラムx.exeでは'Enter'キーで子プロセス
msgbox.exeが実行され、戻ってくるまでの間
ウィンドウをディスエーブルします。

で、すぐにmsgbox.exeを(OKボタンを押して)
終了させた場合にはx.exeはフォーカスを失います。

でもOKボタンを押すのを少し待っていると、
x.exeがグレーアウトし、その後にOKボタンを押すと
x.exeはフォーカスを失いません。

これって、どういう事なんでしょうか?

WinXP SP2です。

<<x.c>>
#include <windows.h>

void execute(HWND hwnd){
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory(&si, sizeof(si));
    EnableWindow(hwnd, FALSE);
    CreateProcessA(NULL, "C:\\DATA\\PROG\\WIN32\\ディスエーブル\\msgbox.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
    WaitForSingleObject(pi.hProcess, INFINITE);
    EnableWindow(hwnd, TRUE);
}
125デフォルトの名無しさん:2006/12/19(火) 23:54:39
そのコードだとEnableWindow()が実際に処理される前に子プロセスが動くからだろ。
126デフォルトの名無しさん:2006/12/19(火) 23:59:52
EnableWindowって非同期で動いたっけ?
127124:2006/12/20(水) 00:15:36
#pragma argsused
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE b, LPSTR c, int d){
    WNDCLASSA wc;
    HWND hWndMain;
    MSG msg;

    ZeroMemory(&wc, sizeof(wc));
    wc.lpfnWndProc = DefWindowProcA;
    wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
    wc.lpszClassName = "MyClass";
    RegisterClassA(&wc);
    hWndMain = CreateWindowExA(0, "MyClass", "", WS_VISIBLE, 0, 0, 100, 100, NULL, NULL, hInstance, NULL);
    for(;;){
        if (!IsWindow(hWndMain)){
            break;
        }
        GetMessageA(&msg, NULL, 0, -1);
        TranslateMessage(&msg);
        DispatchMessageA(&msg);
        if (msg.message == WM_KEYDOWN){
            if (msg.wParam == VK_RETURN){
128デフォルトの名無しさん:2006/12/20(水) 00:16:09
>>95,99
こんな高い本、会社で買ったなあ…。
自分で買ったほうが真面目に読むのかもしれないだけど。
129124:2006/12/20(水) 00:17:57
                execute(hWndMain);
            }
        }
    }
    return 0;
}


<<msgbox.c>>
#include <windows.h>

#pragma argsused
int WINAPI WinMain(HINSTANCE a, HINSTANCE b, LPSTR c, int d){
    MessageBoxA(NULL, "Hello", "msgbox.exe", MB_OK);
    return 0;
}

改行が多すぎますエラーでなかなかうまく書けない・・・
130デフォルトの名無しさん:2006/12/20(水) 00:28:28
>>119
利点っていうかSendInputに取って代わられたから
将来keybd_eventAPIがなくなる可能性があるからだろ
131124:2006/12/20(水) 00:37:56
>>125
今、調べてみます。
132デフォルトの名無しさん:2006/12/20(水) 01:19:56
>>123
単にWS_THICKFRAMEつけりゃいいんじゃねーの?
133デフォルトの名無しさん:2006/12/20(水) 03:04:22
CreateProcessでコンソールアプリを実行して、
パイプで標準出力と標準エラーに出る文字を拾ってきたいのですが、
子プロセスが終了するまでReadFileのところで止まってしまいます。
出力途中の文字列を拾ってくるにはどうしたらいいんでしょうか。
134デフォルトの名無しさん:2006/12/20(水) 07:26:19
・PeekNamedPipe使って、何バイト読めるかを事前調査し、それ以上読まない
・Overlapped構造体を指定してReadFile
のお好きな方をどうぞ。
135デフォルトの名無しさん:2006/12/20(水) 10:48:04
>>123
そのシステムメニューのサイズ変更は有効になってる?
136デフォルトの名無しさん:2006/12/20(水) 10:52:21
>>123
WM_NCLBUTTONDOWはサイズ変更に入る場合システムメニューの状態を調べます。
システムメニューにサイズ変更をつけるか、GetSystemMenuでリセットしましょう。
>>124
x.exeがアクティブにならないのが正しいです。
メッセージループが止まって数秒後には応答なし状態になります。
そうなるとシステムがウィンドウの面倒を見るような気がします。
x.exeにWindowProcを作りその中でWM_KEYDOWNを処理すべきです。
137デフォルトの名無しさん:2006/12/20(水) 20:16:42
>>130
逆に古いOSでは使えないのは、欠点(時と場合によっては致命的)。
138デフォルトの名無しさん:2006/12/20(水) 20:36:36
前の人が作ったプログラム
_beginthreadの戻り値のハンドルをまったくクローズしていず、
かつ、スレッド内でnewしたものを全くdeleteしていないのですが。。。
やっぱ明示的に閉じたりdeleteしたほうがいいですよね?
139デフォルトの名無しさん:2006/12/20(水) 20:40:54
当たり前だ。
ATL::CHandleやboost::scoped_ptr/arrayなどは良し。
140デフォルトの名無しさん:2006/12/20(水) 21:12:49
>>138
> _beginthread

_beginthreadexを使え。理由はググれ。

> スレッド内でnewしたものを全くdeleteしていない

リークであればdeleteが必要。
でもなるべくauto_ptrなどで自動化しろ。
141デフォルトの名無しさん:2006/12/20(水) 21:23:10
そうか、_beginthreadのハンドルは閉じる必要がなかったな。すっかり忘れていた。
142デフォルトの名無しさん:2006/12/20(水) 21:26:36
>>140
他の人が作ったものなんで。。。

>>141
いや、exは勝手に閉じてくれるけど、無印は明示的に閉じないといかんようです
143デフォルトの名無しさん:2006/12/20(水) 21:39:44
_beginthread および _endthread を使用するときには、
Win32 CloseHandle API を呼び出してスレッド ハンドルを明示的に終了しないでください。
144123:2006/12/20(水) 21:56:44
>>132
デザイン的な理由でフレームを付けたくないのです。

>>135
>>138
すいません。自分の表現がマズかったです。
ShowWindow 等で行う、最大化・最小化は動作します。
そうではなく、ウィンドウの端をマウスで持ってウィンドウのサイズを
任意の大きさに変えることができないのです。

WS_THICKFRAMEが指定せず縁がないので、もともと動作しないものですが、
WM_NCHITTESTの戻り値を、こちらで縁上にあると指定することで同様の動作を
実現していました。

ところがWM_SYSMENUを追加すると、他は何も変更していないのに動かなくなりました。
WM_NCHITTEST上の数値などは変化していないので、戻り値がHTLEFT等の縁上であると
指定しても、ウィンドウズ側が旨く動作してくれないようなのです。
145デフォルトの名無しさん:2006/12/20(水) 21:57:29
うろ覚えですまんけど
_beginthread系は
crtを動的にリンクしない方がいいとか
なかったっけ
146デフォルトの名無しさん:2006/12/20(水) 22:03:16
CreateThreadは使うなっていうけどなんで?
147デフォルトの名無しさん:2006/12/20(水) 22:07:26
ダイアログボックスにエディットボックスをつけているのですが
ダイアログボックスが表示した後にエディットボックスに書ける
ようにしたいのですがどのようにすれぼいいでしょうか?
148デフォルトの名無しさん:2006/12/20(水) 22:09:19
>>146
crtの初期化がされないから
149デフォルトの名無しさん:2006/12/20(水) 22:10:19
>>146
それもAdvanced Windowsに書いてあったような気がするが、たしかこんな感じ。

_beginthreadexで作ったスレッドは、CRTの初期化・終了処理がスレッドの開始・終了時に確実に行われる。
しかしCreateThreadはそれが行われない。しかしそのスレッド内でCRTの関数を呼べば、
そのときにCRTのスレッド初期化処理が自動的に行われるが、スレッドの終了処理が行われないので、メモリリークする。
ただしCRTを動的リンクしていれば、DllMainでスレッドの終了を検地できるのでリークはしないものの、
動的リンクしたとき限定であるのでお勧めできない。
150デフォルトの名無しさん:2006/12/20(水) 22:16:09
CRTがそもそもわからないや
もうだめだ
おしまいだ
しぬしかない
151デフォルトの名無しさん:2006/12/20(水) 22:16:44
>>147
フォーカスの話か?
SetFocus
152デフォルトの名無しさん:2006/12/20(水) 22:21:01
>>150
MSVCRT
153デフォルトの名無しさん:2006/12/20(水) 22:23:23
ググッてわかる程度の質問するなよ
154デフォルトの名無しさん:2006/12/20(水) 22:25:22
そういえばCRTってなんの略?
common runtimeとかC runtimeとかって思ってたけどググってもぱっとしないから間違ってる?
そもそもRunTimeってのが違うか(´・ω・`)
155デフォルトの名無しさん:2006/12/20(水) 22:26:27
カソードレイチューブの略だよ
156デフォルトの名無しさん:2006/12/20(水) 22:37:05
>>155
調べたらおっしゃるとおりC runtimeでした スレ汚しすみません
157デフォルトの名無しさん:2006/12/20(水) 23:15:41
>>143
逆だったスマソ
158デフォルトの名無しさん:2006/12/20(水) 23:19:21
_beginthreadが戻り値を持てないってのは何で?
__cdeclと関係ある?
159デフォルトの名無しさん:2006/12/20(水) 23:26:15
一度そう決めてリリースしたから。

リリースしちゃったらコロコロ変えないのがMS流。
どこぞの糞とは違う。
160デフォルトの名無しさん:2006/12/20(水) 23:29:41
変なの
ちなみに_beginthreadに渡す関数が__cdeclで
_beginthreadexの場合は_stdcallなのは何で???
161デフォルトの名無しさん:2006/12/21(木) 00:16:16
>>160
_beginthreadに渡してた関数をそのまま渡すとエラーになるようにする為とか?
162デフォルトの名無しさん:2006/12/21(木) 00:20:38
>>160
CRTは原則cdeclを使っているので_beginthreadの引数の関数へのポインタもcdeclにしたのだと思う。
_beginthreadexはCreateThreadの引数に合わせて引数の関数へのポインタはstdcallにしたのだと思う。
163デフォルトの名無しさん:2006/12/21(木) 01:08:16
>>161, 162
なるほど納得しました

スレッドの中で確保したメモリをdeleteしないとどうなるか試したのですが、
スレッド終了すると一応開放されるみたいですね。
1000個くらいスレッド作って試しましたが、
deleteしてもしなくてもプロセスの使用メモリ量は変わりませんでした。
ハンドルは、exだと残ったまま、無印はクローズされるのも確認できました。
(スレッド作成前後で若干の差はありますが。。)
まあ、単純なプログラムだからうまく開放されたのかもしれませんが。
164デフォルトの名無しさん:2006/12/21(木) 01:14:42
> スレッドの中で確保したメモリをdeleteしないとどうなるか試したのですが、
> スレッド終了すると一応開放されるみたいですね。

んなアホな・・・
簡単なループまわしてみろよ
165デフォルトの名無しさん:2006/12/21(木) 01:27:24
>>164
本当です。下のソースで試したのですが。。
2つの注釈をとってもとらなくても、
終了時のプロセスのメモリ使用量は変わりませんでした。
(システム全体としても変わらない感じ)
コンパイラはbcc32です

#include <process.h>
#include <stdio.h>
#include <windows.h>
#include <iostream>

unsigned __stdcall threadFunc(void* p);
using namespace std;

int main(void)
{
    cin.get();
    HANDLE h[1000-1];
    for(int i=0;i<1000;i++)
    {
        h[i]=reinterpret_cast<void*>(_beginthreadex(
        (void *)NULL,(unsigned)0,threadFunc,
        (void *)NULL,0,(unsigned*)NULL));
        //CloseHandle(h[i]);
    }
    cin.get();
    return 0;
}
166デフォルトの名無しさん:2006/12/21(木) 01:27:56
つづき
unsigned __stdcall threadFunc(void* p)
{
    char* c=new char[1024];
    sprintf(c,"test");
    
    Sleep(5000);
    //delete[] c;
    _endthreadex(0);
    return 0;
}
167デフォルトの名無しさん:2006/12/21(木) 01:32:14
頭痛が痛いぜ。

(1)全体(2つのcin.get間)を1000000回ループしてみろ
(2)new char [1024]をnew char[1024*1024]にしてみろ

168デフォルトの名無しさん:2006/12/21(木) 01:45:48
>>167
はじめ1万回まわしてみたのですが、
どうも1000回越えるとスレッドが作成できなくなります。
abnormal programなんたらとエラーが出ます。

new char[1024*500] で試しました(1024だとエラー)

初期状態:メモリ使用量1.3MB 仮想メモリ500K
deleteしないときのメモリ使用量21M→5M 仮想メモリ520M→ 500M
したときメモリ使用量21M→6.8M 仮想メモリ520M→ 5.7M

これは相当変わりましたね。やっぱdeleteしないと全ては開放されないんですね
(しても何か残ってる気はしますが)
169デフォルトの名無しさん:2006/12/21(木) 01:50:18
すみません 下記が正しいです

初期状態:メモリ使用量1.3MB 仮想メモリ500K 
deleteしないときのメモリ使用量21M→11M 仮想メモリ520M→ 500M 
したときメモリ使用量21M→6.8M 仮想メモリ520M→ 5.7M 
170デフォルトの名無しさん:2006/12/21(木) 02:06:15
>>167
師匠と呼ばせてくれ
171デフォルトの名無しさん:2006/12/21(木) 02:13:03
なんで共有のヒープに作ってんのに
一部とはいえ解放されるんだ?
172デフォルトの名無しさん:2006/12/21(木) 02:31:50
解放はされてない
実メモリの割り当てが減っただけ
173デフォルトの名無しさん:2006/12/21(木) 04:43:22
馬鹿ばっかりだな。だから役に立たない本が売れるのか。
174デフォルトの名無しさん:2006/12/21(木) 07:13:06
ポインタを格納している変数へのポインタ(void**)って
reinterpret_castとか使ってキャストできませんかね?

例えば

::CreateDIBSection(::GetDC(0), info, DIB_RGB_COLORS, (void**)&bits, 0, 0);

という記述を

::CreateDIBSection(::GetDC(0), info, DIB_RGB_COLORS,
    reinterpret_cast<void**>(&bits), 0, 0);

のように書きたいんですが、

error C2440: 'reinterpret_cast' : 'void *const *__w64 ' から 'void **' に変換できません。

と言われてしまいます。

前者はちゃんと動くんですが、他のところはC++のキャストで統一してるんで
ここだけWin32API呼び出しのためだけにCのキャストを使うのは気持ち悪い・・・

スレ違いだったらごめんなさい
175デフォルトの名無しさん:2006/12/21(木) 08:46:20
const_castでconst剥がしが必要なのかな。
176デフォルトの名無しさん:2006/12/21(木) 09:57:50
>>173
同意
177174:2006/12/21(木) 11:07:07
すいません、自己解決しました。

::CreateDIBSection(::GetDC(0), info, DIB_RGB_COLORS,
    reinterpret_cast<void**>(bits), 0, 0);

でいけるようです。
178デフォルトの名無しさん:2006/12/21(木) 11:59:05
コンパイルが通っても動作的にダメだろ、それじゃ。
179136:2006/12/21(木) 13:21:26
>>123
試した結果、前言を取り消します。
WM_NCLBUTTONDOWNでSYSMENUがある場合は何かをチェックした後で
WM_SYSCOMMANDを送っていました。
SC_SIZEのフラグだけかと思ったのですが、
ウィンドウスタイルもチェックしているようです。

で、WM_NCLBUTTONDOWNで直接SC_SIZE + 方向ビットを送れば良いです。
後、WM_SETCURSORも細工必要です。
180123:2006/12/21(木) 16:08:23
>>179
まだ実装はしていないですが、できそうです。
ありがぞうございました!

自分は、端にカーソルがあったらWM_SETCURSORでカーソルを変更
次にドラッグされたらWM_SYSCOMMANDにSC_SIZEや方向ビットを送ることで
サイズを変更するという流れで対応させました。
181デフォルトの名無しさん:2006/12/21(木) 23:09:00
リッチエディットを作成する際に、"RICHEDIT" ではうまくいくのですが、
RICHEDIT_CLASS を作成すると、英数字のフォントが太くなってしまいます。
日本語はいつもの表示がされます。
MSゴシックに変えてみたりしたのですが、うまくいきません。
どうすれば、いつものフォントになるのでしょうか?
環境はVS2005Expressです

以下嫌なフォントのリッチエディット作成するソース

HMODULE hRtLib;
HWND hEdit;

/* メッセージクラッカ */
BOOL OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct)
{
hRtLib = LoadLibrary(_T("Riched20.dll"));
hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, RICHEDIT_CLASS,
_T(""), WS_CHILD | WS_VISIBLE | WS_BORDER
| ES_MULTILINE | WS_HSCROLL | WS_VSCROLL
| ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_NOHIDESEL,
0, 0, 200, 200,
hwnd, (HMENU)10, lpCreateStruct->hInstance, NULL);

return (TRUE);
}
182デフォルトの名無しさん:2006/12/21(木) 23:44:33
メインスレッドで生成したhWndに対して、別スレッドからPostMessage()すると、
そのメッセージはメインスレッドで受け取られる?
それともPostしたスレッド??
183デフォルトの名無しさん:2006/12/21(木) 23:48:55
めいそすっどれ
184デフォルトの名無しさん:2006/12/22(金) 00:11:31
うーん、普通に考えたら、それが当たり前ですよね・・・
なんか別スレッドからPostMessageして
受け取ったウィンドウでMessageBox表示すると
MessageBoxが表示されずにモーダル状態になって
ウィンドウが固まっちゃう現象に悩んでます・・・
185デフォルトの名無しさん:2006/12/22(金) 00:16:20
デッドロックしてるんだろ。排他処理している部分を見直す!
186デフォルトの名無しさん:2006/12/22(金) 00:28:25
>>134
FILE_FLAG_OVERLAPPED付きでCreatePipeできるの?
187デフォルトの名無しさん:2006/12/22(金) 00:50:09
数百バイトのヘッダに数ギガバイトのデータがくっ付いたバイナリファイルがあります。
ここからヘッダを素早く取り除く方法はありますか?
188デフォルトの名無しさん:2006/12/22(金) 00:53:01
ない
189181:2006/12/22(金) 01:55:24
調べが足りませんでした。
問題の英数のフォント名 Arial で検索したところ、解決しました。

LONG LangOptions;
LangOptions = SendMessage(hEdit, EM_GETLANGOPTIONS, 0, 0);
LangOptions &= ~IMF_DUALFONT;
SendMessage(hEdit, EM_SETLANGOPTIONS, 0, (LPARAM)LangOptions);

これで期待通りの動作をしてくれました。
190デフォルトの名無しさん:2006/12/22(金) 05:35:08
すみません質問があります。
SHELL32.DLLにスマートメディアなどの(ドライブ関係)アイコンがはいっているみたいなのですが、
はいっていませんでした。
ドライブ関係のアイコンどこにあるか教えてください。
VAIO WIndowsXPを使用しています
191デフォルトの名無しさん:2006/12/22(金) 07:40:15
リソースにバージョンがありますが、
このリソースに書いた情報を、プログラムから読むにはどうしたらいいんでしょうか?
192デフォルトの名無しさん:2006/12/22(金) 10:28:33
バージョン限定でいいなら GetFileVersionInfo()
193デフォルトの名無しさん:2006/12/22(金) 16:54:39
>>190
SHELL32.DLLに入っている。
194デフォルトの名無しさん:2006/12/22(金) 18:38:19
>>184
Postされた側スレッドがメッセージキュー処理できる状態になるまで
Postした側のスレッドはブロックされるよ。

WindowMessage を喰う WNDPROC 内で WaitFor..Object とか CRITICALSECTION で
排他かけると、その罠にかかることがあるから注意汁

Win32API質問箱 Build46
http://pc8.2ch.net/test/read.cgi/tech/1159158014/374-379
195デフォルトの名無しさん:2006/12/22(金) 18:49:36
>>194
postは大丈夫だよ
196デフォルトの名無しさん:2006/12/22(金) 18:51:04
>>195
すまねえ… post だと投げる側は即座に処理戻ってこれるな。
197デフォルトの名無しさん:2006/12/22(金) 19:16:27
SetWindowText() なんかも最終的には SendMessage に還元されるから
排他処理には気をつかう…
198デフォルトの名無しさん:2006/12/22(金) 20:58:42
SendMessageCallbackやSendNotifyMessageなど、
PostとSendの間くらいのものもある。
199デフォルトの名無しさん:2006/12/22(金) 23:52:12
メニューの選択肢に'&'という文字を出すにはどうすればいいんですか?
200デフォルトの名無しさん:2006/12/22(金) 23:59:29
>>199
&&で&
201デフォルトの名無しさん:2006/12/23(土) 01:15:44
zip の圧縮、伸張をするにはどうすればよかですか?
202デフォルトの名無しさん:2006/12/23(土) 01:36:49
>>201
unzip32.dll
203デフォルトの名無しさん:2006/12/23(土) 01:44:57
MCIでmpg動画を再生したいのですが、音声だけ流れて映像がでてきません。何がいけないのでしょうか。
static MCI_PLAY_PARMS mpp;
static MCI_ANIM_OPEN_PARMS mop;
mop.dwCallback = (DWORD)hw;
mop.lpstrElementName = OPENING_MOVIE;
mop.dwStyle = WS_CHILD | WS_VISIBLE;
mop.hWndParent = hw;

iErr = mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT |
MCI_ANIM_OPEN_PARENT | MCI_ANIM_OPEN_WS,
(DWORD)&mop
);
if(iErr){
mciGetErrorString(iErr,err,lstrlen(err));
MessageBox(hw,err,NULL,MB_OK);
return -1;
}

mpp.dwCallback = (DWORD)hw;
mciSendCommand(mop.wDeviceID, MCI_PLAY, 0, (DWORD)&mpp);
204デフォルトの名無しさん:2006/12/23(土) 01:47:02
hwはメインウィンドウのHWND、OPENING_MOVIEはmpg動画ファイルのアドレスのマクロです
205デフォルトの名無しさん:2006/12/23(土) 03:16:43
>>193
だけど、エクスプローラで表示しているかっこいいドライブアイコン
はなかったです、古いドライブアイコンならありますた。
206デフォルトの名無しさん:2006/12/23(土) 03:26:09
>>205
ショートカットの「アイコンの変更」でshell32.dllのアイコンを覗いてみろ。
207デフォルトの名無しさん:2006/12/23(土) 04:02:42
あー、店頭でVAIO覗いてみたことがあるけど、
確か見たことも無いアイコンが使われていた記憶がある
もしかしてVAIO独自のを用意しているのがあるんじゃないかな?

ショートカット作成→アイコン変更でみれるか忘れたが、
見れないようならIconSetXPとかで見れるはず
208デフォルトの名無しさん:2006/12/23(土) 06:55:23
>>206 >>207
ありがとうございました(^0^)。IconSetXPで見るとありました。
どうやらWIN95時代のアイコン一覧のフリーソフトつかってたから
全部のアイコン一覧がでてこなかったかも??

で、GetDriveType()ではフラッシュとかメモリースティックとかまで
わからないけど、みんなどうやって判別するんですか?
209デフォルトの名無しさん:2006/12/23(土) 10:47:49
ひとつのウインドウに複数のホットキーを登録することはできるのでしょうか?
210デフォルトの名無しさん:2006/12/23(土) 12:28:30
ローカルに超簡易HTTPサーバーを建てるプログラムを作りたいのですが
どこから手を付けて良いの変わりません・・・
機能的には、ポート指定ができて、そのサーバーのdocumentroot配下の
テキストファイルがブラウザから見られる程度で良いのですが・・・
211デフォルトの名無しさん:2006/12/23(土) 12:30:21
スレ違い
212デフォルトの名無しさん:2006/12/23(土) 12:47:03
>>210
C#のサンプルにそういうのがあったと思うよ
あとスレ違い
213デフォルトの名無しさん:2006/12/23(土) 12:58:37
>>210
どこぞのウィルスに感染するといいと思うよ
あとスレ違い
214デフォルトの名無しさん:2006/12/23(土) 12:59:43
GetPrivateProfileIntで

0x004000AA

とかのアドレスを取得したいんですが
AAの16進が文字列として認識されて取得できません。

こういう場合どうすればいいんでしょうか

;ini例
[ADDRESS]
Addr=004000AA
215デフォルトの名無しさん:2006/12/23(土) 13:11:11
レジストリに書き込んだやつに聞けよ
216デフォルトの名無しさん:2006/12/23(土) 13:11:35
GetPrivateProfileStringで取得してstrtolで変換
217214:2006/12/23(土) 13:12:27
ありがとうございます。
218デフォルトの名無しさん:2006/12/23(土) 13:14:39
API風にいうとStrToIntExじゃね?普通
219デフォルトの名無しさん:2006/12/23(土) 13:15:00
8進か
220デフォルトの名無しさん:2006/12/23(土) 13:19:03
16進だろw
221デフォルトの名無しさん:2006/12/23(土) 13:29:20
>>218
0xが付いてないと(つまり>>214の形式だと)16進数は変換できなくね?
strtolなら第三引数で指定できる。まあ確かにスレ違いだけど
GetPrivateProfileStringも紹介してるってことで勘弁してちょ
222デフォルトの名無しさん:2006/12/23(土) 13:33:55
レジストリに書き込んだやつがアホ
223デフォルトの名無しさん:2006/12/23(土) 13:48:54
2度も書いてるけど>>214へのレス?
GetPrivateProfileIntはiniから読み取るAPIだけどレジストリと何の関係があるの?
224デフォルトの名無しさん:2006/12/23(土) 14:18:55
個人的にレジストリ使うの嫌だけどな俺は
ヘビーユーザの立場から見るとレジストリ弄られるのは気持ち良くない
だったらini管理に俺はするんだが
225デフォルトの名無しさん:2006/12/23(土) 14:24:59
日本語が不自由なら帰れよ
226デフォルトの名無しさん:2006/12/23(土) 14:27:50
>>224
だからレジストリの話なんて誰もしてないだろって
227デフォルトの名無しさん:2006/12/23(土) 14:29:18
逆にこう考えるんだ

2つの話題が交錯しているだけ、と
228デフォルトの名無しさん:2006/12/23(土) 14:34:05
GetPrivateProfileInt の検索結果 約 17,300 件中 1 - 10 件目 (0.12 秒)

GetPrivateProfileIntGetPrivateProfileInt 関数は、大文字と小文字を区別しません。
lpAppName と lpKeyName の各パラメータが指す文字列では、大文字と小文字の ...
このような状況では、GetPrivateProfileInt 関数は .ini ファイルではなくレジストリから情報を取得します。 ...
msdn.microsoft.com/library/ja/jpsysinf/html/_win32_getprivateprofileint.asp?frame=true - 17k -
キャッシュ - 関連ページ
229デフォルトの名無しさん:2006/12/23(土) 14:55:42
>>228
>>214
>;ini例
230デフォルトの名無しさん:2006/12/23(土) 15:05:07
そんなくだらないことに執着するのは、アホといわれてよっぽどくやしかったんだな
231デフォルトの名無しさん:2006/12/23(土) 15:06:24
Addr=0x004000AAだったら、GetPrivateProfileIntで直接読めるよ。
232デフォルトの名無しさん:2006/12/23(土) 15:23:13
簡単なテキスト処理すら自分でできないやつが多いな
233デフォルトの名無しさん:2006/12/23(土) 15:25:02
再利用した方が読む側もわかりやすいだろ?
無能ニートは糞ひって寝てろ
234デフォルトの名無しさん:2006/12/23(土) 15:31:49
自称ヘビーユーザーはお帰りください
235デフォルトの名無しさん:2006/12/23(土) 15:32:00
GetPrivateProfileIntで直接読めるようになってればいいだけだな
236233:2006/12/23(土) 16:37:31
ごめん。
言い過ぎた。
237デフォルトの名無しさん:2006/12/23(土) 17:38:14
mciで音声再生するデバイスをプライマリ以外に選べますでしょうか?

DirectSoundだとDirectSoundEnumerateで繋がってるサウンドカードの
一覧が取得できるのですが、mciではやり方が見つけられませんでした。

知ってる方居たらお願いします。
238201:2006/12/23(土) 20:00:38
WinXP以降ではシステムでZIPの伸張・圧縮がサポートされているかと思い、
それに伴うAPI]が提供されているかと考えていたのですが、、、、
そうでもないのでしょうか?

APIがあるなら 伸張する関数名 。
APIがないなら ない とお答え頂ければ幸いです。
239デフォルトの名無しさん:2006/12/23(土) 20:11:50
”無い”を証明するのは不可能に等しい by 悪魔の証明
240デフォルトの名無しさん:2006/12/23(土) 20:16:50
zipfldr.dll
RouteTheCall
241デフォルトの名無しさん:2006/12/23(土) 23:15:05
>>238
ない。
242デフォルトの名無しさん:2006/12/23(土) 23:21:16
>>238
何かかっこいい名前のライブラリだったような気がするけど、
忘れた。
その代わりと言っちゃなんだが、シェル方面からアプローチしたら
行けるんじゃないか?
243242:2006/12/23(土) 23:27:59
あ、>>240が書いてくれてるじゃん。
244デフォルトの名無しさん:2006/12/23(土) 23:41:25
zipfldr.dllはCOMコンポーネントなので普通に使えるはずだろう
245デフォルトの名無しさん:2006/12/23(土) 23:44:53
(´-`).。oO(つーか無難にzlibとか使えよ・・・・・・・・・)
246デフォルトの名無しさん:2006/12/24(日) 00:05:29
確かにzlibとか選択肢はあるけど、セキュリティホールが出た場合
WindowsUpdateと言う手段が無いだろ。
流石にお客に「自前でzlib調達してなんとかしる」なんて言えねー。
247デフォルトの名無しさん:2006/12/24(日) 00:40:47
zlibとかをアプリに同梱すれば何の問題もないだろ
248デフォルトの名無しさん:2006/12/24(日) 00:54:24
VisualStudio の入力候補リストみたいに、
ウィンドウ外にも描画されるリストはどのように作成するのでしょうか?
普通に親ウィンドウを指定してリストを作成すると、
ウィンドウ内に描画され、はみ出た場合スクロールしなければいけなくなります。


+-------------+
|           |
|          |
|  +-----+   |
|  |リスト |   |
+-------------+
今のままでは、スクロールしなければいけいない


+-------------+
|          |
|          |
|  +-----+   |
|  |リスト |   |
+--|     |---+
  .|     |
  +------+
VSはウィンドウの外にリストが表示される
249デフォルトの名無しさん:2006/12/24(日) 01:08:53
>>248
分からんけどVSは独自にウィンドウ出してるだけじゃないかなあ。
何使ってるかSPYで調べてみたらいいんじゃない。
250デフォルトの名無しさん:2006/12/24(日) 01:10:53
只の Owned Window では無いの?
251デフォルトの名無しさん:2006/12/24(日) 01:13:58
>>248
VsCompletorPaneっていうクラス名のウィンドウを出してる。確認してみよ。
252デフォルトの名無しさん:2006/12/24(日) 01:51:47
>>238
シェル名前空間を通せば普通のフォルダと同じように扱える。
http://pc8.2ch.net/test/read.cgi/tech/1124559962/252-253
253248:2006/12/24(日) 01:59:34
いろいろ試してみます。
ありがとうございました。
254199:2006/12/24(日) 02:36:41
ありがとうございました。
255デフォルトの名無しさん:2006/12/24(日) 02:44:18
スレッドが実行中かどうか調べられるAPIありますか?

SuspendThreadやResumeThreadの戻り値であるサスペンドカウントを
スレッドの状態を変えることなく調べたいです
256201:2006/12/24(日) 04:09:58
zipfldr.dll は使い方がよくわからなかったので
zlib を使うことにしました。
お答え頂いた方々、ありがとうございました。
257デフォルトの名無しさん:2006/12/24(日) 04:14:38
>>255
WaitForSingleObject
258デフォルトの名無しさん:2006/12/24(日) 04:27:47
>>257
WaitForSingleObjectはスレッドが終了したかどうかの判定には使えるけど
実行中か一時停止中(SuspendThreadなどによる)かの判定には使えない希ガス
259デフォルトの名無しさん:2006/12/24(日) 08:57:25
260デフォルトの名無しさん:2006/12/24(日) 12:04:02
( ´,_ゝ`)プッ ねーのかよ
261デフォルトの名無しさん:2006/12/24(日) 12:20:26
そうすると.netのSystem.Threading.Thread.ThreadStateはどうやって提供されてるんだ?
秘蔵のAPIってやつ?
262デフォルトの名無しさん:2006/12/24(日) 12:27:45
>>261
自分でカウントしてんじゃねーの?
263デフォルトの名無しさん:2006/12/24(日) 14:00:29
CSliderCtrlでスライダーのページエリア(?)をクリックするとページサイズだけそちらに移動しますよね?
そうじゃなくてクリックした位置にジャンプして欲しいのですが、どのようにやったらよいか教えていただけますか?
よろしくお願いします
264255:2006/12/24(日) 14:36:41
GetThreadContextって関数の説明に

You cannot get a valid context for a running thread.
Use the SuspendThread function to suspend the thread before calling GetThreadContext.

って書いてあってこれを利用したらいけるかと思ったらSuspendThread呼び出さなくても成功しちゃってるorz
265デフォルトの名無しさん:2006/12/24(日) 14:52:00
1CPUだったら必ず成功する気がせんでもない
266デフォルトの名無しさん:2006/12/24(日) 15:00:04
アプリケーション自身がアクティブかどうかって、どうやって判断するんだっけ・・・
267デフォルトの名無しさん:2006/12/24(日) 16:01:20
BOOL __stdcall AmIActive?(void)
268デフォルトの名無しさん:2006/12/24(日) 16:15:39
>>263
やったことないが、pageup/downが来たらマウスの位置調べてthumbtrack投げなおすとかどう?
269デフォルトの名無しさん:2006/12/24(日) 16:38:41
>>266
(1)フォアグラウンドウィンドウが自プロセスのものかどうかを見る
(2)WM_ACTIVATEAPPだかなんだかを拾う
のどちらかじゃねえかな
他に簡単な手があったら教えて
270266:2006/12/24(日) 16:46:03
これでできたっぽいっす
GetActiveWindow() == GetTopLevelWindow(hWnd)
271デフォルトの名無しさん:2006/12/24(日) 16:49:32
いまだに__stdcallの意味が理解できない俺
272デフォルトの名無しさん:2006/12/24(日) 17:32:45
おれも
273デフォルトの名無しさん:2006/12/24(日) 17:59:57
じゃあ __pascal と __cdecl はわかるのか
274271:2006/12/24(日) 18:26:54
わからないぜw
ただpascalは16ビット時代のなんちゃらって記憶がかすかに
cdeclはランタイムライブラリ?

わかんねwwwwwwww
275271:2006/12/24(日) 18:27:29
クリスマスに俺何してんだろうなorz
276デフォルトの名無しさん:2006/12/24(日) 18:44:13
>>274
引数の積み方と後処理をどっちでやるか、という話
277255:2006/12/24(日) 18:51:14
GetThreadTimesって関数見つけたんですけどSleep(0)くらいじゃ変化なしorz
bool is_run(HANDLE h) {
 FILETIME create, exit, kernel1, kernel2, user;
 GetThreadTimes(h, &create, &exit, &kernel1, &user);
 Sleep(0);
 GetThreadTimes(h, &create, &exit, &kernel2, &user);
 returnkernel1.dwLowDateTime != kernel2.dwLowDateTime ||
     kernel1.dwHighDateTime!=kernel2.dwHighDateTime;
}
278デフォルトの名無しさん:2006/12/24(日) 19:01:56
手段が目的に変わりつつある予感。
サスペンドカウントを調べたい理由って何?
279255:2006/12/24(日) 19:07:11
>>278
プロセスのHANDLEをラップしたクラスを作ってます
280デフォルトの名無しさん:2006/12/24(日) 19:22:55
>>279
理由になってねー
281デフォルトの名無しさん:2006/12/24(日) 20:49:27
>>279
だからなんでそんなのを作ってんだよって話なわけだが。
282255:2006/12/24(日) 20:50:51
ビールスを作ってます
283デフォルトの名無しさん:2006/12/24(日) 21:00:21
>>264
ヒント: valid
284デフォルトの名無しさん:2006/12/25(月) 01:43:19
>271
呼出規約でぐぐれ
パラメータの渡し方とスタックのクリーンアップの責任の所在
285デフォルトの名無しさん:2006/12/25(月) 02:08:36
>>268
ありがとうございます。
やってみます。
286デフォルトの名無しさん:2006/12/25(月) 02:29:35
>271
シグネチャの不一致を利用した地味で効果的な嫌がらせ
287デフォルトの名無しさん:2006/12/25(月) 02:35:04
ごちゃごちゃ言ってるとNearポインタ&Farポインタ復活さすぞ!
288デフォルトの名無しさん:2006/12/25(月) 02:46:49
ごめんなさいもうしないので許して
289デフォルトの名無しさん:2006/12/25(月) 13:07:01
変声機を作りたいのですが、どなたかそれに関しての良いAPIを知っていますでしょうか。
290デフォルトの名無しさん:2006/12/25(月) 13:54:46
APIつーか、SDKのサンプルに無かったっけ
291デフォルトの名無しさん:2006/12/25(月) 14:40:24
なんちゃってエクスプローラを作るのですが、
普通のエクスプローラの様に、

デスクトップ
 マイ ドキュメント
 マイ コンピュータ
  A:
  C:
  H:
  コントロール パネル
 マイ ネットワーク
 ゴミ箱
  :

のリストを列挙する関数とかあります?
あるなら、その関数名を教えてください・・・
292デフォルトの名無しさん:2006/12/25(月) 15:31:32
SHGetDesktopFolder
名前の通りデスクトップ(へのインタフェース)を返す。
293デフォルトの名無しさん:2006/12/25(月) 17:33:23
294291:2006/12/25(月) 18:26:27
>>292
>>293
どうもありがとうございます!
調査していきます。
295デフォルトの名無しさん:2006/12/25(月) 23:45:16
x64では呼び出し規約が統一されてめでたい限り。
というかもともとx86以外は1つしかないんだけど(x86のみ過去とのしがらみで
ごちゃごちゃあった)
296124:2006/12/26(火) 00:58:00
ええと、ヘンなコードだったかもしれないですが
EnableWindowはそれほど関係なかったみたいです。

x.cをこういうのにしてみたら、結局同じような現象が起きます。
ただ、戻ってきてもディスエーブルされなくなりましたが・・・
WaitForSingleObjectの間にシステムから
ウィンドウプロシージャが呼び出されてるのか、と思って
チェック用のBeepを入れてみたんですが鳴りません。

少し時間を置いた時にディスエーブルになる、
というが何とも不思議・・・

システムが2つのウィンドウが同時にイネーブルにならないように
定期的にチェックしているのだろうか?

<<x.c>>
#include <windows.h>

void execute(HWND hwnd){
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory(&si, sizeof(si));
    CreateProcessA(NULL, "C:\\DATA\\PROG\\WIN32\\ディスエーブル\\msgbox.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
    WaitForSingleObject(pi.hProcess, INFINITE);
}

LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
    LRESULT lr;
    Beep(200, 100);
    lr = DefWindowProcA(hWnd, uMsg, wParam, lParam);
    return lr;
297124:2006/12/26(火) 00:59:07
124
#pragma argsused
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE b, LPSTR c, int d){
    WNDCLASSA wc;
    HWND hWndMain;
    MSG msg;

    ZeroMemory(&wc, sizeof(wc));
    wc.lpfnWndProc = MyWindowProc;
    wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
    wc.lpszClassName = "MyClass";
    RegisterClassA(&wc);
    hWndMain = CreateWindowExA(0, "MyClass", "", WS_VISIBLE | WS_SYSMENU, 0, 0, 100, 100, NULL, NULL, hInstance, NULL);
    for(;;){
        if (!IsWindow(hWndMain)){
            break;
        }
        GetMessageA(&msg, NULL, 0, -1);
        TranslateMessage(&msg);
        DispatchMessageA(&msg);
        if (msg.message == WM_KEYDOWN){
            if (msg.wParam == VK_RETURN){
                execute(hWndMain);
            }
        }
    }
    return 0;
}
298デフォルトの名無しさん:2006/12/26(火) 01:04:26
>ディスエーブル
>イネーブル

それはギャグで言っているのか。
299デフォルトの名無しさん:2006/12/26(火) 01:06:52
ほんとはなんて読むの?
300デフォルトの名無しさん:2006/12/26(火) 01:07:29
エナブレ
ディサブレ
301デフォルトの名無しさん:2006/12/26(火) 01:24:05
ディスエーブル、イネーブルであってるぞ?
302デフォルトの名無しさん:2006/12/26(火) 01:26:52
カタカナに直すより原語表記か和訳の方が*俺*は見やすい。
303デフォルトの名無しさん:2006/12/26(火) 01:32:42
メッセージループを止めた状態をディスエイブルとは呼ばない。
304デフォルトの名無しさん:2006/12/26(火) 02:42:16
タスクマネジャで状態を監視し、応答なしの場合、
他のアプリケーションウィンドウをかぶせてぐりぐりしてみる。
 -->フレームが再描画描されるならゴーストが出来ている
305デフォルトの名無しさん:2006/12/26(火) 03:43:41
いねぼー
ディせーぼー
306デフォルトの名無しさん:2006/12/26(火) 05:55:57
最近、マウスをダブルクリックするとパソコンから猫の鳴き声
みたいなのが聞こえてきます(キッキッみたいな感じ)
猫の鳴き声を消すAPI教えてください
307デフォルトの名無しさん:2006/12/26(火) 07:29:49
ニャー
308デフォルトの名無しさん:2006/12/26(火) 09:33:52
ディセーブルキャットサウンド(フォールス);
309デフォルトの名無しさん:2006/12/26(火) 10:21:56
>>306
ExitWindowsEx(EWX_POWEROFF, 0)
310デフォルトの名無しさん:2006/12/26(火) 10:47:58
KillCats( lpCATS );
311デフォルトの名無しさん:2006/12/26(火) 11:12:55
case WM_KILLCATS:
/* :P */
return (0);
312デフォルトの名無しさん:2006/12/26(火) 11:15:58
>>308
ディセーーーーブルをファルセだと有効になるにゃん
313デフォルトの名無しさん:2006/12/26(火) 14:33:11
CDからCD-TEXTを読み出す方法を教えてください
Win32APIでできませんか?
314デフォルトの名無しさん:2006/12/26(火) 14:37:18
できる
315デフォルトの名無しさん:2006/12/26(火) 15:07:17
どうやって?
316デフォルトの名無しさん:2006/12/26(火) 15:37:19
ググレ
317デフォルトの名無しさん:2006/12/26(火) 15:44:33
質問するとこなんだから、知ってるんなら答えてやればいいじゃん
俺ぁ知らんけど
318デフォルトの名無しさん:2006/12/26(火) 17:03:44
319デフォルトの名無しさん:2006/12/26(火) 17:22:07
普通に↓とかでは。
fopen("E\hoge.txt", "r");
320デフォルトの名無しさん:2006/12/26(火) 17:23:20
>>319
ちょwwwCD-TEXTの意味わかってるかwww
気になったからググって見たが「CD-TEXT API」だのじゃそれらしい情報も見当たらんなぁ
321デフォルトの名無しさん:2006/12/26(火) 17:38:45
red book
322デフォルトの名無しさん:2006/12/26(火) 17:39:15
ドライブによって読めたり読めなかったりするとこみると
ASPIドライバ直接呼ぶんじゃね?
323デフォルトの名無しさん:2006/12/26(火) 17:42:23
ぶっちゃけ>>1に書いてある通りにすれば20秒で見つかる件について
324デフォルトの名無しさん:2006/12/26(火) 17:45:19
なんだよAPIドライバってw
325デフォルトの名無しさん:2006/12/26(火) 17:47:52
326デフォルトの名無しさん:2006/12/26(火) 17:52:11
327デフォルトの名無しさん:2006/12/26(火) 17:53:00
328デフォルトの名無しさん:2006/12/26(火) 18:03:32
329デフォルトの名無しさん:2006/12/26(火) 18:04:39
>>313
DeviceIoControlを使え。

それ以上はWin32apiでは無いので。
330デフォルトの名無しさん:2006/12/26(火) 18:05:44
何でもクラス化するのが好きな俺ですがウィンドウシステムを
サブクラス化するときにSetWindowLongにメンバ関数をいれる
ことが出来なくなってしまいました。?
331デフォルトの名無しさん:2006/12/26(火) 18:12:32
エスパーの方出番です
332デフォルトの名無しさん:2006/12/26(火) 18:14:15
>>324には今年一番ワロタ

>>331
無理www
333エスパー:2006/12/26(火) 18:30:41
>>330
???
staticメンバ関数(静的メンバ関数)にしてみれば?
http://techtips.belution.com/ja/vc/0009/
334デフォルトの名無しさん:2006/12/26(火) 18:38:57
使用しているPCが。Windows日本語版かどうかを判別することはできますでしょうか?
VC++6.0です。
335デフォルトの名無しさん:2006/12/26(火) 19:08:38
>>334
何を要求しているかわからないけど、
GetSystemDefaultLangIDとかじゃだめ?

LCIDを求めるんじゃなく?
336330:2006/12/26(火) 20:15:45
>>333
それです!。
私の文が読みにくかったけど答えてくれてありがとうございます!!。
337デフォルトの名無しさん:2006/12/26(火) 21:42:38
SDKのプログラミングでグリッドコントロール(読み取り専用でよい)を使うにはどうすればいいですか?
リストビューを使うのでしょうか?

XP、VC6
338デフォルトの名無しさん:2006/12/26(火) 21:53:14
はい
339デフォルトの名無しさん:2006/12/26(火) 21:56:19
他にはそういったコントロールは用意されていないのでしょうか?
340デフォルトの名無しさん:2006/12/26(火) 21:58:04
1. リストビュー
2. Excelワークシート
3. 自作
341デフォルトの名無しさん:2006/12/26(火) 22:01:09
やはりリストビューですか。自作できるほどのスキルはありませんし。
MSFlexGridというのはVB用ですか?
342デフォルトの名無しさん:2006/12/26(火) 22:06:38
技術的にはVC++でも使えるはず。
ライセンスがどうなっているか俺は知らないから、適当に調べてくれ。
343デフォルトの名無しさん:2006/12/26(火) 22:17:56
ダイアログエディタでMsFlexGridを貼り付けるところまでは出来ました。
実行すると表示されませんけど。
344デフォルトの名無しさん:2006/12/26(火) 22:30:32
やっぱりリストビューでなんとか頑張ります
345デフォルトの名無しさん:2006/12/26(火) 22:48:45
>>344
MFCスレで、CListCtrlをレポート形式で扱う方法を質問したほうがいいかもね。
346デフォルトの名無しさん:2006/12/26(火) 22:51:27
>>345
>>337
>SDKのプログラミングで
347デフォルトの名無しさん:2006/12/26(火) 23:14:03
MFC(笑)
348デフォルトの名無しさん:2006/12/27(水) 00:37:02
VS2005でのMFCへの対応を見ると笑われてもしょうがない気がするけど
作るのに最低一ヶ月は要するようなWindowsアプリを作る場合、みんな
どのライブラリ使ってるの?
349デフォルトの名無しさん:2006/12/27(水) 00:40:56
>>348
UIなら、WTLを使ってます。MFCは今更使わないです。
350デフォルトの名無しさん:2006/12/27(水) 01:01:13
おれ描画能力とかいらんアプリしかつくんないからC#でつくる。
351デフォルトの名無しさん:2006/12/27(水) 02:06:21
open source に dot netですか。
ぐぐってちょっとソース見た限りMFCと似てる気がするけど、ちょっとWTLで遊んでみるね。
ありがとう >349-350
352デフォルトの名無しさん:2006/12/27(水) 09:19:33
GDI+で日本語のOpenTypeフォントは使えないんですか?
まさか流石にそんなことないと思いますが、自分の環境だと使えなかったので、質問してみます。
353334:2006/12/27(水) 11:04:57
>>335
言語IDを取得できました。
ありがとうございました。
354デフォルトの名無しさん:2006/12/27(水) 11:20:54
>>352
Font名を指定するタイプのコンストラクタを使うと
でたらめのフォントを作って平然としてるっぽい。

LOGFONTを受け取る方のコンストラクタに、GDIで作った
Fontから取り出したLOGFONT構造体を渡してみたら
TrueTypeじゃないというエラーになった。
駄目なのかもね。
355デフォルトの名無しさん:2006/12/27(水) 11:40:14
>>352
FontFamily::GetFamilies でも OpenTypeのフォントは出てこないな。
356306:2006/12/27(水) 11:49:17
>>307-3012
ありがとうございました。ドライバーで本体を分解したところ
子猫がでてきました。解決しました
357デフォルトの名無しさん:2006/12/27(水) 12:00:33
>>3012に期待
358デフォルトの名無しさん:2006/12/27(水) 12:02:12
>>3012期待してるぞ
359デフォルトの名無しさん:2006/12/27(水) 12:15:39
(´Д`;)無理
3603012:2006/12/27(水) 13:08:19
呼んだ?
361デフォルトの名無しさん:2006/12/27(水) 14:19:32
先生方に質問です!

デスクトップなどから(マウスクリックなど普通の方法で)アプリケーションを起動するとき、
WinXPだとAPIフックで、explorer.exeからCreateProcess(W)が呼ばれているのが検知できますが、
Win2Kだと同じコードでも監視に引っかかりません。

madCodeHookライブラリのサンプルではWinExecとCreateProcessで監視に成功しているようなので、
呼ばれていないわけではないと思うのですが、
Win2Kでプロセスの起動を監視するのはXpとは違う細工が必要なんでしょうか?
(2kはVMPlayer上ですけど権限は両方adminで、MessageBoxなどはちゃんと検知出来てます)
362デフォルトの名無しさん:2006/12/27(水) 15:49:06
APIってバッファのサイズを指定しないといけないのが
いっぱいありますけど、あれはなんで必要なんでしょうか?
自分で関数作るときにはやったことないんですが。
363デフォルトの名無しさん:2006/12/27(水) 15:52:10
ばっふぁおーばーふろーしたらこまるでしょ
364デフォルトの名無しさん:2006/12/27(水) 15:58:46
パターン1 引数に大きさを渡すやつ
 APIを呼ぶ言語が C/C++ とは限らないから。

パターン2 構造体に構造体の大きさを必要とするメンバを持つやつ
 構造体サイズでバージョン分けするトリックをかますため。
365デフォルトの名無しさん:2006/12/27(水) 16:04:09
配列.lengthが使えるって便利だよな
366デフォルトの名無しさん:2006/12/27(水) 16:32:09
その場合、配列.num[i]とかやらなくても大丈夫?
367デフォルトの名無しさん:2006/12/27(水) 17:20:27
>>364
1の場合は、むしろCのため。
C++ならどうにでもできるが、どうにもしていない(== Cとして使っている)やつも多いと思う。
368364:2006/12/27(水) 17:25:14
>>367
ごめん そのとおりだわ。

APIは呼ばれる言語が確定的でないから、できる限り低級な言語で呼び出せるように設計されている
+ばっふぁおーばーふろー対策
ってことだね
369デフォルトの名無しさん:2006/12/27(水) 19:21:47
べんきょうになるなぁ
370デフォルトの名無しさん:2006/12/27(水) 19:48:31
質問させてください。
Overlappedを使った(非同期?重複?)なI/Oを使う場合、
メモリ上にどんどんリクエストがキューイングされていって、
バックグラウンドで逐次実行されている、みたいな感じで理解しているのですが、
これで正しいのでしょうか?
処理の完了を気にせず、ボコボコ連続でWriteFile()なんかをしても
OSが後で仕事しといてくれる、みたいな。
371デフォルトの名無しさん:2006/12/27(水) 21:43:28
>>370
おりはそう認識してる。

DebugViewでトレースできるんだっけ?
372デフォルトの名無しさん:2006/12/27(水) 22:13:26
> でたらめのフォントを作って平然としてるっぽい。
CreateFontの仕様そのまんまなのか
> 処理の完了を気にせず、ボコボコ連続でWriteFile()なんかをしても
前の完了は待たないとエラーが起きたとか一部しか書けなかった場合に
まずいんじゃ?
373デフォルトの名無しさん:2006/12/27(水) 22:32:11
ものすごーく初歩的なことだろうと思うのですが、
ダイアログにIDOKという名前のボタンがあって
これのハンドルを取得するにはどうすればいいんでしょうか?

VC++ & SDK
374デフォルトの名無しさん:2006/12/27(水) 22:47:15
375デフォルトの名無しさん:2006/12/27(水) 22:54:23
>>374
異国の言葉で書かれていて読めません
376デフォルトの名無しさん:2006/12/27(水) 22:58:33
>>375
だからなに?
377デフォルトの名無しさん:2006/12/27(水) 23:05:58
英語読めない奴はプログラマ辞めちまえ
378デフォルトの名無しさん:2006/12/27(水) 23:09:53
>>371
レスどうもです。トレースの話は初耳かもしれません。

>>372
確かにそうなんですが、そもそも「リクエストを溜めてくれるのか」が
いまいちハッキリしなかったもので…

どうせなら非同期処理を頼んだ時の成否で判断、ぐらい楽したいですね。
渡した送信バッファ消しちゃったりした時にえらいことになるんでしょうけど。
379デフォルトの名無しさん:2006/12/28(木) 01:39:11
>>352
OpenTypeフォントにもアウトライン情報がTrueTypeベースな物とPostScriptベースな物があり、
GDI+でサポートされるのは前者だけのようだ。
Office2003あたりについてくるHG正楷書-Proとかが前者のフォント (Office 2000に付いてくるのは
ただのTrueTypeフォントなので話が違う)

ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/fontext_1wmq.asp
にも「ClearType antialiasing は TrueTypeフォントかTrueTypeアウトラインなOpenTypeフォントでしか
効かない」と書かれてるし、「WindowsはOpenTypeをサポートしてます」と言ってる割に、
全然ダメなんじゃねーのという感じだな。たぶんGDIのGetGlyphOutlineも使えないんだろう。

>>354
>でたらめのフォントを作って平然としてるっぽい。

ttp://msdn2.microsoft.com/en-us/library/system.drawing.font.aspx
「Remarks」参照。
380デフォルトの名無しさん:2006/12/28(木) 02:40:32
APIフックってLoadLibrary関連とGetProcAddressのフックしないとできないんでしょうか?
381デフォルトの名無しさん:2006/12/28(木) 02:43:48
日本語でおk
382デフォルトの名無しさん:2006/12/28(木) 06:42:41
>>378
> どうせなら非同期処理を頼んだ時の成否で判断、ぐらい楽したいですね。
エラーが起きたかどうかの判断には時間がかかるかもしれないから
頼んだ時点ではすべて判定できないよ
383デフォルトの名無しさん:2006/12/28(木) 06:48:22
なんでGetProcAddressをフックする必要があるのか。
APIフックっていうのは本来のAPIの処理を横取りする手法の事。
IAT書き換えとかDLLExportTableの書き換えとかラッパプログラミングとか
APIフックを実現するための方法はいくらでもある。
384373:2006/12/28(木) 09:26:16
"コントロールのハンドル"で検索して答えを見つけました

キタ━(゚∀゚)━ ← GetDlgItem(ダイアログのハンドル, IDOKとか);

385デフォルトの名無しさん:2006/12/28(木) 09:26:25
advanced 嫁と>>1が申しております

単純に、フックを回避してコールされるのを防ぐだけって書いてあるだろうが
386デフォルトの名無しさん:2006/12/28(木) 10:25:51
流れをぶった切ってスマソ

EnumWindowsで取得したハンドルのプロセス、また実行パスを
取得する方法はありますか?

宜しくお願いします。
387デフォルトの名無しさん:2006/12/28(木) 10:39:11
>>380
GetProcAddressのフックの必要性を判断できない程度の能力しか無いなら
APIフックなんて危険だから使わない方がいいよ
388デフォルトの名無しさん:2006/12/28(木) 10:43:04
>>386
GetWindowThreadProcessId
GetWindowModuleFileName
389デフォルトの名無しさん:2006/12/28(木) 10:49:14
>>388
ありがd。

その二つで試しているのですが、取得できるものとできないものがあり
こまっていますた。

もう少し、ぐぐってみます。
390デフォルトの名無しさん:2006/12/28(木) 11:24:21
MSがA/Wのマクロ化だけじゃなくてchar/wchar_tもサポートしてくれてたら
ちょっとだけ楽だよなぁと思う年の瀬

#ifdef UNICODE
LoadLibrary(arg) LoadLibraryW(TEXT(arg))
#else
LoadLibrary(arg) LoadLibraryA(TEXT(arg))
#endif
391デフォルトの名無しさん:2006/12/28(木) 11:28:06
おまえは何がやりたいんだ?
392デフォルトの名無しさん:2006/12/28(木) 11:34:39
多分 API と STL の共存で std::string 周辺の UNICODE マクロ対応あたりかと…
393デフォルトの名無しさん:2006/12/28(木) 11:43:17
#ifdef UNICODE
typedef std::wstring string;
#else
typedef std::string string;
#endif

じゃだめなのか?
394デフォルトの名無しさん:2006/12/28(木) 11:45:15
inline HMODULE LoadLibrary(LPCSTR p) { return ::LoadLibraryA(p); }
inline HMODULE LoadLibrary(LPCWSTR p) { return ::LoadLibraryW(p); }

こんなんなってくれてるとありがたいんだが。
395デフォルトの名無しさん:2006/12/28(木) 11:55:16
要はwindows.hppなんかが欲しいのか。

うっかりLoadLibrary("hoge")とLoadLibrary(L"hoge")が
混在する可能性もあってお勧めできないな。

NT系は内部WCSだから、ANSI/MBCS版のAPI呼ぶと
中で文字型変換されるからオーバーヘッドが発生するし。

結局TEXTマクロ使うのが一番いいと俺は思う。
396デフォルトの名無しさん:2006/12/28(木) 14:27:07
>>361
Windows 2000 の SP3 以降(だったっけ?)だと、
互換モードの機能で Explorer の IAT がすでに aclayers.dll の関数に
上書きされてたりする場合があったようななかったような…
397デフォルトの名無しさん:2006/12/28(木) 15:47:38
SP2だお
398デフォルトの名無しさん:2006/12/28(木) 15:59:39
>>396
いま確認したら激しくアタリです

仮想マシンで開発環境なんて動かせねえし(ライセンス問題もあるし)
どうあがいても年内に解決できる問題ではありません orz
ほんとうにありがとうございました
399デフォルトの名無しさん:2006/12/28(木) 16:09:44
と思ったけどjmpの書き換えでなんとかなるっぽい(たぶん
ともあれ、どうもです
400デフォルトの名無しさん:2006/12/28(木) 16:26:23
LoadLibrary(_T("hoge.dll"));

と書くことに
何の不満があるのか分らない。

こうすりゃ、A/W どっちでも適応できるべ。
401400:2006/12/28(木) 16:27:57
リロードしてなかった。すまん。
402デフォルトの名無しさん:2006/12/28(木) 17:25:06

template<typename Char> void foo(const Char* p)
{
・・・
// Charがcharの場合はA版、wchar_tの場合はW版のAPIを呼びたい
・・・
}

こんなとき>>394みたいなのを用意しないといけないのが面倒くさいよね。
403デフォルトの名無しさん:2006/12/28(木) 18:17:45
もうAは要らんやろ・・・
404デフォルトの名無しさん:2006/12/28(木) 18:21:08
工工エエエ(´д`)エエエ工工
405デフォルトの名無しさん:2006/12/28(木) 19:31:53
フックを勉強しているのですが、下記の例ではIEの最小化ボタンを押下すると
イベントが始まります、これをCtrl+Fが押下された時にフックをかけるように
するにはどのように書いたらいいでしょうか?

// フックするプロシジャー
LRESULT CALLBACK MyCallWndProc(int nCode,WPARAM wParam,LPARAM lParam)
{
 CWPSTRUCT* lp = (CWPSTRUCT*)lParam;
if( nCode == HC_ACTION ){
  switch (lp->message){
   case WM_SYSCOMMAND:
    if ( lp->wParam == SC_MINIMIZE ){
     MessageBox( NULL , "IEを最小化するメッセージの送出2","確認" , MB_OK | MB_TOPMOST );
     lp->wParam = 0;
     lp->message = WM_CLOSE;
    }
    break;
  }
 }
 if ( lp->message == WM_SYSCOMMAND && lp->wParam == SC_MINIMIZE ) lp->message = WM_CLOSE;
 return CallNextHookEx(g_hHookWnd, nCode, wParam, lParam); //次のフックを呼ぶ
}
406デフォルトの名無しさん:2006/12/28(木) 19:34:19
実際Windows CEではとっくの昔に全廃したし。
>>389
GetWindowModuleFileNameはNT系では他プロセスが作成したウィンドウには使えない
GetWindowThreadProcessIdが失敗することはないはず。
407デフォルトの名無しさん:2006/12/28(木) 20:01:50
んで、マドンナのrainのPV

http://www.youtube.com/watch?v=KHFxj84aTEk

登場人物に注目ww
408407:2006/12/28(木) 20:02:49
スレ間違い
気にしないで
409デフォルトの名無しさん:2006/12/28(木) 20:03:37
Win32 :FARPROC GetProcAddress( HMODULE hModule, LPCSTR lpProcName);
WinCE:FARPROC GetProcAddress( HMODULE hModule, LPCWSTR lpProcName);
410デフォルトの名無しさん:2006/12/28(木) 20:28:17
空気読まずに書きこ

NT
EnumProcesses->EnumProcessModules
9X
CreateToolhelp32Snapshot->Module32First->Module32Next
の使い分けとか?

だめかなぁ
411デフォルトの名無しさん:2006/12/28(木) 20:29:04
おまけ
WinCE version 3.0 and later:FARPROC GetProcAddressA( HMODULE hModule, LPCSTR lpProcName);
412デフォルトの名無しさん:2006/12/28(木) 20:37:17
>>393
typedef std::basic_string<TCHAR> string;じゃだめなのか?

>>404
MSLU
413デフォルトの名無しさん:2006/12/28(木) 20:43:11
複数のスクロールバーがある場合
どのバーを動かしたのかを調べるにはどうしたらよいのでしょうか??
よろしくお願いします。
414デフォルトの名無しさん:2006/12/28(木) 20:47:48
どんな環境での話か書いてくれよ。
WindowsならWindowsとかさ。
415デフォルトの名無しさん:2006/12/28(木) 20:52:36
>>414
スレタイ嫁。
416デフォルトの名無しさん:2006/12/28(木) 21:07:26
>>405です
お願いします、これだとコンパイルは通るのですが無反応なのですが・・・・・・
どうしたらいいでしょうか、よろしくオナガイシマス
// フックするプロシジャー
LRESULT CALLBACK MyCallWndProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(( GetKeyState( VK_CONTROL ) & 0x80 ) > 0)
{
  MessageBeep(0xffffffff); //ビープ
}
return CallNextHookEx(g_hHookWnd, nCode, wParam, lParam); //次のフックを呼ぶ
}
417413:2006/12/28(木) 21:08:20
どうもすいません。
環境はWindowsでVisualStudioを使ってC++で書いてます。
418デフォルトの名無しさん:2006/12/28(木) 21:12:36
>>416
×MessageBeep(0xffffffff); //ビープ
○MessageBox( NULL , "IEを最小化するメッセージの送出2","確認" , MB_OK | MB_TOPMOST );
です、スマソ
419デフォルトの名無しさん:2006/12/28(木) 21:15:03
ただ単にキーボードフック(WH_KEYBOARD)にすればいいだけじゃないの?
420デフォルトの名無しさん:2006/12/28(木) 21:25:19
WH_GETMESSAGEのほうが汎用性あるだろ
421デフォルトの名無しさん:2006/12/28(木) 21:46:42
>>416
>GetKeyState( VK_CONTROL ) & 0x80

GetKeyStateの返り値は16bitでわ?
422421:2006/12/28(木) 21:52:55
それと省いているみたいだけど、FキーのメッセージをチェックしてからCtrlキーのチェックだよね…
423デフォルトの名無しさん:2006/12/28(木) 22:09:14
405=416=418です
よろしくです
>>421
MSDNを見ますと返り値はintなので16ビットだとおもいますが、まずいですか?
>>422
逆で、CtrlをチェックしてからFキーのチェックです
424デフォルトの名無しさん:2006/12/28(木) 22:09:47
またフックの話題かよ

そんなにおまえらは何をフックしたいんだ
425デフォルトの名無しさん:2006/12/28(木) 22:18:11
個人的にはかわいい娘か、技術系の会話のできるかわいい娘をf(ry
426デフォルトの名無しさん:2006/12/28(木) 22:22:29
intが16bitっていつの時代の人間だ?
427デフォルトの名無しさん:2006/12/28(木) 22:25:08
>>426
あそうか
32ビットですね
428デフォルトの名無しさん:2006/12/28(木) 22:41:00
429デフォルトの名無しさん:2006/12/28(木) 22:47:36
>>417
WM_VSCROLLかWM_HSCROLLのhwndScrollBarはスクロールバーのウィンドウハンドル。
それをGetDlgCtrlID関数を利用してIDに変換。
なお、IDはCreateWindowのhmenu。
430デフォルトの名無しさん:2006/12/28(木) 23:37:18
>( GetKeyState( VK_CONTROL ) & 0x80 ) > 0
本気でこれで Ctrl と F が押下されているかの判定になると思っているのか。
431デフォルトの名無しさん:2006/12/28(木) 23:47:11
フックが苦手なんですが、どうすれば強烈なフックが撃てますか?
432デフォルトの名無しさん:2006/12/28(木) 23:54:46
>>431
腕だけでなく、腰を捻ってチカラを貯めこんで打つべし
433デフォルトの名無しさん:2006/12/29(金) 01:36:37
これならばと思い試していますが今だに解決できません、コンパイルでエラーが出れば
いいのですが・・・・
下記のコードで悪いところを指摘してもらえませんか、タノンマス
// フックするプロシジャー
LRESULT CALLBACK MyCallWndProc(int nCode,WPARAM wParam,LPARAM lParam)
{
 CWPSTRUCT* lp = (CWPSTRUCT*)lParam;
if( nCode == HC_ACTION ){
  switch (lp->message){
   case WM_KEYDOWN:
    if( wParam == 0x46 ) // このメッセージがFキーのものか
    {
     if( GetKeyState( VK_CONTROL ) & 0x46 ) // Ctrlキーが押されているか
     {
      MessageBox( NULL ,CTRL+Fだ "ゴ━━━━(# ゚Д゚)━━━━ルァ!","確認" , MB_OK | MB_TOPMOST );
      lp->wParam = 0;
      return 0;
      //lp->message = WM_CLOSE;
     }
    }
    break;
  }
 }
 return CallNextHookEx(g_hHookWnd, nCode, wParam, lParam); //次のフックを呼ぶ
}
434デフォルトの名無しさん:2006/12/29(金) 01:56:27
>GetKeyState( VK_CONTROL ) & 0x46
GetKeyState の説明をもう一度読み直せ。
435デフォルトの名無しさん:2006/12/29(金) 01:58:58
しばしば VirtualProtectEx を実行してもアクセス保護が変更されない気がします

戻り値は1が返されてOldProtectは0なのに、直後にVirtualQueryExで調べると
PAGE_EXECUTE_WRITECOPYを返してきて矛盾しちゃってます
436デフォルトの名無しさん:2006/12/29(金) 02:30:43
>>433です
>>GetKeyState の説明をもう一度読み直せ。
if( wParam == 0x46 )
 {
   if( GetKeyState( VK_CONTROL ) & 0x80 )
読んでこうしてみましたが・・・・・なぜ悪いのか
それからここの書き方は間違っていませんでしょうか?
CWPSTRUCT* lp = (CWPSTRUCT*)lParam;
437デフォルトの名無しさん:2006/12/29(金) 02:45:52
>>436
0x80(>>433では0x46だが) は何処から出てきたんだ?
438デフォルトの名無しさん:2006/12/29(金) 02:46:58
>>437
433は間違えていました、0x46はASCIIのFのことです
439デフォルトの名無しさん:2006/12/29(金) 02:53:26
>>438
>GetKeyState( VK_CONTROL ) & 0x80
ここはCtrlキーの判定だろ。
Fキーは関係無い。
GetKeyStateの *戻り値* の説明を読んで来い。
440デフォルトの名無しさん:2006/12/29(金) 02:54:27
WH_CALLWNDPROC でWM_KEYDOWN 拾えたんだっけ?
441デフォルトの名無しさん:2006/12/29(金) 02:58:51
たぶん「最上位ビットが 1 」なSHORTは2進数で1000000000000000 16進数で0x8000て感じで
GetKeyState( VK_CONTROL ) & 0x80 て書いたんだとおもた
442デフォルトの名無しさん:2006/12/29(金) 03:00:19
>>439
確かにそうなのですがここ↓を参考にしているのですが・・・・
ttp://www.geocities.jp/ky_webid/win32c/026.html
443デフォルトの名無しさん:2006/12/29(金) 03:00:34
何でそんなに遠回しに教えるんだ?
普通に回答教えれば一発で解って、教える側も教わる側も気持ち良く終われるのに
444デフォルトの名無しさん:2006/12/29(金) 03:10:22
つまりこのスレ一番の馬鹿は>>430=>>437=>>439>>433は一方的な被害者って事か。
445435:2006/12/29(金) 03:14:40
いくつか解説まわってみたが
GetKeyState(VK_CONTROL) < 0
という書き方のほうが一般的みたいな感じだった

ってことで435もよろしくお願いします
446デフォルトの名無しさん:2006/12/29(金) 06:39:05
API の文字列関数に strstr の API 版が無いですが、
みなさんはどのように検索していますか?
447446:2006/12/29(金) 06:41:00
すいません、C言語に限定された話です。
448デフォルトの名無しさん:2006/12/29(金) 06:44:54
開発中に見つけた不具合
以下のようなGetIconInfoを数ミリ秒毎に呼ぶルーチンがあるのですが、

OnTimer(){
...
ICONINFO iconinfo;
GetIconInfo(hicon, &iconinfo);
}

どうもこのAPIがメモリリークを起こしているらしく、
数万回呼び出された時点でアプリケーション毎に割り当てられる
GUI領域のメモリを使い切って画面表示に不具合を発生させました。

環境はVS2005です。
APIのバグでしょうか?
449デフォルトの名無しさん:2006/12/29(金) 06:46:21
shlwapi.dllにStrStrというAPIがあるよ
450446:2006/12/29(金) 07:40:49
>>449
ありがとうございます。
451デフォルトの名無しさん:2006/12/29(金) 07:43:38
>GetIconInfo creates bitmaps for the hbmMask and hbmColor members of ICONINFO.
>The calling application must manage these bitmaps and delete them
>when they are no longer necessary.
452デフォルトの名無しさん:2006/12/29(金) 08:12:07
資料を読まない香具師ほど自分の愚かさを棚に上げて他人の所為にしたがる好例だな。
453デフォルトの名無しさん:2006/12/29(金) 09:41:58
質問があります。

WindowsXPなのですが、zip圧縮、ゴミ箱に捨てる等のオペレーションを行うと、
プログレスダイアログがあがりますがあれはAPIを使用しているのでしょうか?
454デフォルトの名無しさん:2006/12/29(金) 09:55:14
>>448
開発中に見つけた不具合wwwwwwwwwwwwwwwww

君の頭が不具合なのは良くわかった
455デフォルトの名無しさん:2006/12/29(金) 10:58:36
>>453
ゴミ箱に捨てる→SHFileOperation関数
圧縮はどうなんだろ?
456453:2006/12/29(金) 11:46:57
>>455
ありがとうございます。

もう一つ、あのダイアログだけを取得する事は可能でしょうか?
457デフォルトの名無しさん:2006/12/29(金) 11:48:44
>>456
くわしく
458448:2006/12/29(金) 11:53:24
うわ、死にてぇorz
単純な情報取得で勝手にメモリアロケートされるなんて
ハンドルを返したりするAPIだけと思い込んでました。
日本語のMSDNにも明記されてるし。ちょっと吊ってきます・・・
459453:2006/12/29(金) 11:53:31
>>457
文盲ですみません。

SHFileOperation関数を実行すると、処理が長い場合に自動で
プログレスバーが表示されます。

あのプログレスバーを取得し、タイトル、メッセージ等を変えて自分で
使用したいとおもいまして、そのようなAPIはあるのかなと。
460デフォルトの名無しさん:2006/12/29(金) 12:01:42
vistaのこともあるし、難しいんじゃね?
461デフォルトの名無しさん:2006/12/29(金) 12:28:23
スレッド2ついるのかな? 
つい昨日出鱈目にプログレス作って失敗したけど。
462デフォルトの名無しさん:2006/12/29(金) 12:32:13
SDKサンプルにaviあるからそれ貼り付ければそれらしくなる
バーも入れたいなら投げっぱなしじゃ無理なのはわかるよな
463デフォルトの名無しさん:2006/12/29(金) 12:35:53
shell32.dllのDialog1020と任意のAVI(160〜170)を組み合わせてるだけで出来るだろ。
464デフォルトの名無しさん:2006/12/29(金) 14:05:15
インターフェイスにIProgressDialogってのがあるけど、
ME以降なんで注意かも
465453:2006/12/29(金) 14:13:11
>>462
リソース使わずにAPIだけで済むのならと思い、質問しました。

>>463
ありがとうございます。検討します。

>>464
まさにこれです。
API使う時点でOSのターゲットを絞るので十分です。
ありがとうございました。
466デフォルトの名無しさん:2006/12/30(土) 02:16:13
今IMEで入力中の文字に外部から細工を施したいプログラムを作ろうとしております。
IMEで入力中の文字列を取るには
ImmGetCompositionStringにGCS_COMPSTRを引数に渡せばいいことは分かったのですが、
その前にIMEのコンテキストを得るための
ImmGetContext
の引数のウィンドウハンドルをどうしたら良いのか分からなくて困っています。
現在アクティブなウィンドウの入力を操作したいので、
ForegroundWindowの子ウィンドウのいずれかを指定すればよいのですが、
その中で現在IMEが入力しようとしている子ウィンドウの判定の仕方をどなたか教えて頂けないでしょうか。
よろしくお願い致します。
467デフォルトの名無しさん:2006/12/30(土) 05:20:38
ImmEnumInputContext
468デフォルトの名無しさん:2006/12/30(土) 07:03:13
>>465
もはや聞く耳持ちそうにないけど
公開されてないダイアログリソースがいつまでもあると思うな
http://blogs.msdn.com/oldnewthing/archive/2005/10/26/485133.aspx
469デフォルトの名無しさん:2006/12/30(土) 13:54:56
GetFocusでよくね
470デフォルトの名無しさん:2006/12/30(土) 14:12:49
>>468
読めないっつーの
471デフォルトの名無しさん:2006/12/30(土) 17:19:48
>>470
フォントサイズ小さくしてない?
私の環境なら最小じゃなければ読めるよ。
472デフォルトの名無しさん:2006/12/30(土) 17:24:59
日本語じゃない情報はゴミ
473デフォルトの名無しさん:2006/12/30(土) 17:27:39
ゴミグラマ
474デフォルトの名無しさん:2006/12/30(土) 17:46:46
東京ゴミグラマ
475デフォルトの名無しさん:2006/12/31(日) 00:28:45
WIn32 APIスレで英語読めませんとか堂々と言われても。
msdn2で日本語情報が大幅に拡充されたせいかなあ
476デフォルトの名無しさん:2006/12/31(日) 08:21:54
無料配布の影響
477デフォルトの名無しさん:2006/12/31(日) 09:00:24
英語が読める読めないの問題じゃないと思うけどな。

浅はかだ。
478デフォルトの名無しさん:2006/12/31(日) 09:17:15
誰に対してどんな内容がどんな理由で浅はかなのか説明してもらおうか
479デフォルトの名無しさん:2006/12/31(日) 11:08:29
アプリの二重起動を監視するのに、FindWindow関数や、Mutex法を使うとよさげなのですが
単純にGetKeyState使った関数の呼出しで、呼出された関数が一回のキーボード押下で
二回呼出されるのは、単なるバグと考えていいですよね?
480デフォルトの名無しさん:2006/12/31(日) 11:20:53
単なる仕様です。
481デフォルトの名無しさん:2006/12/31(日) 13:59:30
日本語でおk
482デフォルトの名無しさん:2006/12/31(日) 14:05:32
1行目と2,3行目の関係がわからないんだが
483デフォルトの名無しさん:2006/12/31(日) 14:38:02
GetKeyStateは関数を呼出しません。
484デフォルトの名無しさん:2006/12/31(日) 15:40:38
>>483
スマソ、GetKeyStateの取得したキーイベントをトリガーとして、
関数を呼出すってことね
485デフォルトの名無しさん:2006/12/31(日) 15:48:18
二重起動の監視とキーの状態にどんな関係が?!
486デフォルトの名無しさん:2006/12/31(日) 16:07:16
>>484
単にあなたが2回その関数を呼出しているだけです。
拠ってその動作がバグか使用かはあなたが決めてください。
487デフォルトの名無しさん:2006/12/31(日) 17:25:54
CSSプレイヤーにチートしてない人はいないよ
488デフォルトの名無しさん:2006/12/31(日) 18:38:27
IEEとかメモ帳の検索窓のコンテキストってどうしたら取得できますか?
489デフォルトの名無しさん:2006/12/31(日) 19:32:34
除夜の鐘を鳴らすAPIを教えてください。
490デフォルトの名無しさん:2006/12/31(日) 19:41:28
Beep()
491デフォルトの名無しさん:2006/12/31(日) 20:13:09
HitBell(108);
492デフォルトの名無しさん:2007/01/01(月) 00:14:50
for(;;){
Eat(Toshikoshisoba);
}
493デフォルトの名無しさん:2007/01/01(月) 00:21:11
>>492
太るぞ…
494 【大吉】 【1163円】 :2007/01/01(月) 00:32:01
あけまして、おめでとうございます。
今年も上手に残業代を稼ぎましょう。
495デフォルトの名無しさん:2007/01/01(月) 00:33:15
try {
 for(;;)
  Eat(Toshikoshisoba);
} catch(gero_exception &e) {
 
}
496デフォルトの名無しさん:2007/01/01(月) 00:40:58
'0xdeadbabe' の命令が '0xbaadf00d' のモチを参照しました。 モチが "swallowed" になることはできませんでした。

ライフを終了するには [OK] をクリックしてください
ライフをデバッグするには [キャンセル] をクリックしてください
497デフォルトの名無しさん:2007/01/01(月) 08:57:02
別におもしろくないから
498デフォルトの名無しさん:2007/01/01(月) 10:44:31
メッセージループの基本的な仕組みについて質問です

WinMain()
{
  MessageLoop()
  {
  while( 1 )
  {
  GetMessage();

  DispatchMessage() → WndProc()
  {

  }
  }
  }
}

こんな感じのプログラムで、DispatchMessageのあたりの処理は

DispatchMessage関数呼び出し

WndProc関数呼び出し

WndProc関数終了

DispatchMessage関数終了

という流れになっているという考えであっているでしょうか?

499デフォルトの名無しさん:2007/01/01(月) 11:31:08
>>498
まあ、それでおけ。
ほかにも、いくつかあるけど。

GetMessageが0か-1を返したときは、ループを抜けること。
TranslateMessageを使うこと。
WM_CHARなどがいらないなら、使わないというのもありかもしれないが、
コモンコントロールなどは使うから、まず必要になる。
500デフォルトの名無しさん:2007/01/01(月) 11:57:49
どうもです。

>GetMessageが0か-1を返したときは、ループを抜けること。
>TranslateMessageを使うこと。

猫でも〜本で勉強しているのですが
よく見るとそのあたりのことも書いてありました。ありがとうございました
501デフォルトの名無しさん:2007/01/01(月) 12:26:17
>>500
もう一言だけ。
猫は焼き捨てること。
502デフォルトの名無しさん:2007/01/01(月) 12:39:17
ニャー
503デフォルトの名無しさん:2007/01/01(月) 13:05:28
「日本語の資料で」「お金をかけることで自分を奮起させて」「順を追って学習したい」「完全な初学者」
なら猫も悪くないと思うぜ 立ち読みした印象だけど
504デフォルトの名無しさん:2007/01/01(月) 13:27:34
全然知らないところに突撃する前のウォーミングアップにも便利だよ
505デフォルトの名無しさん:2007/01/01(月) 14:38:20
webで全部読めるのに本買う馬鹿がいるとは思わなかった
506デフォルトの名無しさん:2007/01/01(月) 14:43:12
あれをwebで全部読む馬鹿がいるとは思わなかった
507デフォルトの名無しさん:2007/01/01(月) 15:09:34
webの方の最初の章は古くなったネタがあるが、
本では改修されていたりする。
Windows の UNICODE のフォローは無いが。
508デフォルトの名無しさん:2007/01/01(月) 15:32:27
猫のサンプルソースが全部全角になってるのはコピペ対策?
509デフォルトの名無しさん:2007/01/01(月) 15:46:27
その方がかっこいいからだ!
510デフォルトの名無しさん:2007/01/01(月) 15:53:28
全角になってるとこなんてある?
全角のように見えるけど全部半角じゃね?
511デフォルトの名無しさん:2007/01/01(月) 16:37:38
あそこは字がでかすぎて読みづらいし、
余分なところまで載せてるから長くて読んでられない。
ビルドするにはいいけど
512デフォルトの名無しさん:2007/01/02(火) 06:39:57
なんでもかんでもグローバル使い杉
小さい子が真似したらどうすんだよ
513デフォルトの名無しさん:2007/01/02(火) 07:05:17
サンプルコードってのは、できるだけ簡素に書いた方がいいんだよ。
俺は単機能のサンプルくらいならソースは1ファイル構成でクラス等は
使わずにほぼCの機能だけで書く。
514デフォルトの名無しさん:2007/01/02(火) 07:06:15
グローバル便利じゃん
免許のいらない自動車ぐらい便利だと思う
515デフォルトの名無しさん:2007/01/02(火) 10:16:17
ただで清ますか、安物買って、結局2chに助けを求め、混ぜっ返され、混沌と化す。
そんな末路をたどるくらいなら、Petzold買え。
516デフォルトの名無しさん:2007/01/02(火) 11:25:02
漏れは、WIN32Apiに関連した、単語を検索すると、猫のサイトがよくヒットしてたので
時々見ていたが、こいつの本だけは絶対に買わないと決めた
Charles Petzoldの上下買うのは多少勇気がいったが買ってよかったと思う
単なるできたらいい、動けばいいといった内容ではなく、Windowsの歴史から
書いてあるので、一から順序立てて書いてあるので理解がしやすい。
また、Windows本のバイブルと言われる理由も納得できる。
長尾 高弘氏の訳もすばらしい。
517デフォルトの名無しさん:2007/01/02(火) 12:34:03
Petzoldってそんなにいいのか。
買って見ようかな。
自分はAdvanced Windowsで理解した口だけど。
518デフォルトの名無しさん:2007/01/02(火) 12:41:59
519デフォルトの名無しさん:2007/01/02(火) 15:46:06
タブコントロールを作成して、タブバーを除く領域全体に、
ボタンやエディットのウインドウを貼り付けるにはどうすればいいですか?
タブコントロールのサイズに合わせて表示したら、
タブバーの上にまで、乗せられてしまいます。
520デフォルトの名無しさん:2007/01/02(火) 17:52:41
GetKeyStateに関する質問です。

SetWindowsHookExに渡すハンドラ内で
Capsキーが{押された,離された}(Shift無し)を取得したいと考えています。

VK_OEM_ATTN(0xF0)が該当のキーコードであることまでは自力で調べられたのですが、
GetKeyStateにVK_OEM_ATTNを引数として渡すと、
キーの状態に関わらず返り値の最上位ビットは常に立っています。
(ほかのキーコードを引数にするときは期待する値が返ってくる)

GetKeyStateではVK_OEM_ATTNの状態は取得できないのでしょうか?
よろしくお願いします。
521sage:2007/01/02(火) 17:54:15
520です。。
sage忘れました。まことに申し訳ない。。。
522デフォルトの名無しさん:2007/01/02(火) 18:20:10
使い方を間違ってる
523デフォルトの名無しさん:2007/01/02(火) 18:20:32
524デフォルトの名無しさん:2007/01/02(火) 18:34:58
GetAsyncKeyStateなら取れるんじゃね?
525520:2007/01/02(火) 19:00:23
>>524
レスありがとうございます。

早速試してみたのですが、
最上位,最下位ビット共に0(ビット立たず)でした。
GetKeyStateとはまったく逆の結果が取れるんでしょうか。。
GetAsyncKeyStateに関しても他のキーコードは正しく取得できているようです。

VK_OEM_ATTNのキーコードは例外的な扱いなのでしょうか・・
526デフォルトの名無しさん:2007/01/02(火) 19:27:05
VK_CAPITALじゃないの?
527520:2007/01/02(火) 19:41:24
>>526
説明不足で誤解を招いてしまい申し訳ないです。

CtrlキーとCapsキーを「起動している間だけ入れ替える」
アプリケーションを作るのが私の目的です。

VK_CAPITALは
"Shiftキー"を押しながら"CapsLockキー"を押した時
発生するキーイベントなので目的とは違ってしまうんです。

私もはじめはVK_CAPITALかと思ってずーっとハマってました。
VK_OEM_ATTNか!なるほど!と思って進めたらこんな状態です。

528519:2007/01/02(火) 19:42:18
>>523
ありがとうございました。
529デフォルトの名無しさん:2007/01/03(水) 01:42:08
>>527
GetKeyStateで取得したい仮想キーと0x80の論理積が求まれば
幸せになれるかも^^ね、外していたらスマソ
530デフォルトの名無しさん:2007/01/03(水) 02:20:04
仮想キーコードはシステムの状態に応じてOSが作り出した仮想的なキーコードです。
キーボード上のキーと仮想キーコードは、必ずしも1対1に対応しているわけではありません。
中にはキー操作だけでは発生させることのできないキーコードもあります。
531デフォルトの名無しさん:2007/01/03(水) 02:41:10
>>520
最初の一回目だけ bit 15-7 が
0->1
になるのを確認出来た
bit 6-1 はずっと 0
bit 0 は 1->0 になった

そのあとは押しても放してもずっと変化しないみたい
プログラム終了して実行しなおしても変わらなかった

どこかで状態リセットする必要があるんじゃないかな
532デフォルトの名無しさん:2007/01/03(水) 03:37:44
GetKeyState 呼ぶ直前に
SetKeyboardState で 0 * 256 書き込んだらクリアされるみたい
一回押すと覚えてしまうみたいなので毎回 SetKeyboardState 呼ぶ必要あり
533デフォルトの名無しさん:2007/01/03(水) 03:44:09
あと、他のキーの状態分からなくなると困るので
char kbuf[256];
GetKeyboardState(kbbuf);
で現在の状態を配列に読み込んでから
kbbuf[0x0F0] = 0;
SetKeyboardState(kbbuf);
GetKeyState(0x0F0);
かな

押された状態を覚えてしまってるので
キーが放されてても拾ってしまうケースがありそう

534デフォルトの名無しさん:2007/01/03(水) 03:45:31
GetKeyboardState と SetKeyboardState の間が
アトミックじゃないのはあきらめるしかないのかな
535デフォルトの名無しさん:2007/01/03(水) 03:48:19
そもそも、入れ替えだけなら調べる必要ないだろ
536デフォルトの名無しさん:2007/01/03(水) 06:31:23
とある場所でLocalAlloc/LocalFreeというAPIを見たのですが
ググってもほとんど説明がない、これはなんですか?
537デフォルトの名無しさん:2007/01/03(水) 07:07:30
普通に msdn にあるだろうが。
538デフォルトの名無しさん:2007/01/03(水) 07:13:05
16ビットの時の名残だな
今は明確な違いは無いだろう
539デフォルトの名無しさん:2007/01/03(水) 09:22:36
>>535
だよね。WH_KEYBOARD_LLのフックプロシージャ内で、コードもわかるし、握り潰しもできるらしいし。。
あ、でもOEM_ATTNは、押下はわかるけど、開放はわからないっぽい。だとすると同時押しに対応できない?
540デフォルトの名無しさん:2007/01/03(水) 10:51:55
VK_OEM_ATTNは違うよ。マウスでガチャガチャやるだけで立つ。
WM_KEYDOWNで来るのは0xFFF0だった様な気が。スキャンコードは不変。
535に一票。
541デフォルトの名無しさん:2007/01/03(水) 11:02:03
ドライバ使えばできるよ。





マイナスドライバで引っぺがしてCAPSとCTRL入れ替えるの。
542デフォルトの名無しさん:2007/01/03(水) 11:26:56
手でいいじゃん


ぼくドラえもんさんですか?
543デフォルトの名無しさん:2007/01/03(水) 11:49:24
レジストリでいけたような
Keymapだったっけ?
544520:2007/01/03(水) 11:52:24
>>529
GetKeyStateの返り値と{0x80,0x01}の論理積で確認しています。
ささいな事でも情報をいただけるだけで助かります。

>>530
なるほど。すごく勉強になります。VCでのプログラミング経験が浅いので
そういった基礎知識が欠けているような気がします。
仮想キーコードに関して少し勉強してみます。

>>531
わざわざ確認までしていただき恐縮です。
状態リセットですか。それも一度やってみたのですが、
Ctrlとして動作させるのにプログラム側でリセットすると
非常に使いづらいCtrlキーになってしまいました。
Upのイベントを取得できるのが理想なのですが。。

>> 532-534
やはりそうなのですか。ただ上で書いたとおりプログラム側から
のリセットはタイミングが非常に難しいです。
GetKeyStateは今回の用途に向いていないんですね。
545520:2007/01/03(水) 11:52:55

>>535
おっしゃる通りです。
WH_KEYBOARD_LLでグローバルフックを仕込んでいます。
キーイベントが発生するとフックプロシージャが呼ばれるので、
そこでキーコードだけ調べればいいというお話ですよね。
しかし、VK_OEM_ATTNだけUpのイベントが取得できませんでした。
プロシージャ内にMessageBoxなどを仕込むと、
キーを押して離すと当然2つのMessageBoxが出現するのですが、
Caps(VK_OEM_ATTN)のみMessageBoxは1つ,キーダウンの時だけでした。

そこでGetKeyStateなら調べられるのではないかと思っていたのですが。。

>>539
私もみなさんの意見をいただいて今そのように考えています。
なんとか開放を知りたいですね。

>>540
マウスでガチャガチャというのはどういう意味でしょうか??
重要なヒントな気が。
よろしければ詳しく教えていただけないでしょうか。

>>541
USBメモリに入れて環境を汚染せずに使いたいと思ってます。
そうか!ドライバを持ち歩けry

>>542
そうか!これで何も持たずry
546540:2007/01/03(水) 12:37:35
以前、EDITとPUSHBUTTONをもつモードレスダイアログを作ったとき、
マウスでダイアログのアクティブ/非アクティブ/フォーカス変更を行うと
GetKeyboardState()のVK_OEM_ATTNが立ちっぱなしになった経験あり(WinXP)。
547デフォルトの名無しさん:2007/01/03(水) 12:41:20
リッチエディットはデフォルトで、 Ctrl+V で貼り付け動作を行いますが、
このとき書式はコピーしないようにするには、どうすればいいですか?
アクセラレータの無効化を考えましたが、方法がわかりませんでした。
548デフォルトの名無しさん:2007/01/03(水) 12:50:15
・YOKODORIする
-or-
・そういうnofityがくるんじゃないかと期待しつつリファレンスを眺める
549デフォルトの名無しさん:2007/01/03(水) 12:57:59
IRichEditOleCallback::QueryAcceptData でCF_TEXT だけ受けるようにするとか
550デフォルトの名無しさん:2007/01/03(水) 13:07:04
>>549
CF_UNICODEもアイシテ!
551547:2007/01/03(水) 14:10:50
WM_KEYDOWN で Ctrl+V の時は元のプロシージャを呼ばないようにしました。
ありがとうございました。
552デフォルトの名無しさん:2007/01/03(水) 14:30:06
それだとKEYDOWN以外での貼り付け操作(たとえばコンテキストメニュー)
に対応できなくないか

それともctrl+vだけ対応できてればいいのか
553デフォルトの名無しさん:2007/01/03(水) 14:35:49
RichEditには標準のコンテキストメニューは無い品。
554デフォルトの名無しさん:2007/01/03(水) 14:49:45
しかし皆さんフック好きですね一体何がしたいのやら( ̄ー ̄)ニヤリ
フックのプログラムってマジで実験するとき覚悟しないと、CTRL+ALT+DELも
効かずに強制電源OFFしないといけない羽目になる事を覚悟してね
漏れはそれでOS3回再インスコしましたww
まぁ普段からプログラムコードや大切なファイルは外付けのMOに
書いてるし再インスコもnlite使ってるから慣れたもので20分くらいで
XP様ご一行が入ってくるけどねww
気をつけてね>>520さん
555デフォルトの名無しさん:2007/01/03(水) 14:56:50
昔のコピペ?
556デフォルトの名無しさん:2007/01/03(水) 15:01:07
見ちゃいけません!
557デフォルトの名無しさん:2007/01/03(水) 16:54:37
ノックとパンチは引退。青芝フックガンガレ。
558デフォルトの名無しさん:2007/01/04(木) 00:07:23
559デフォルトの名無しさん:2007/01/04(木) 01:18:11
僕ハッカー
560デフォルトの名無しさん:2007/01/04(木) 01:19:00
僕バッカー
561デフォルトの名無しさん:2007/01/04(木) 01:26:29
バカバッカー
562デフォルトの名無しさん:2007/01/04(木) 01:29:30
>>559-561
吹いた
563デフォルトの名無しさん:2007/01/04(木) 01:54:58
暇人多いよな
564デフォルトの名無しさん:2007/01/04(木) 09:30:27
冬休みももうすぐおわりだな
565デフォルトの名無しさん:2007/01/04(木) 12:05:15
俺一生冬休み
566デフォルトの名無しさん:2007/01/04(木) 15:32:19
選択されているタブアイテムのハンドルを取得する方法はありますか?
567デフォルトの名無しさん:2007/01/04(木) 15:52:34
何のタブアイテムだよ。
現状でわかってるのはどれとどれ。
取得するのはTCM_GETITEMメッセージを送ればいい。

もしかしてC#のスレの人?
他のプロセスからだとそのままポインタ渡せないから
VirtualAllocEx とかReadProcessMemoryも必要になるので注意な。
568566:2007/01/04(木) 16:21:38
>>567
sysTabControlの選択されたタブアイテムです
選択されているインデックスは取得できたし
EnumWindowでタブアイテムのハンドルをすべて取得したんだけど
どれが選択されているかどうかがわかりません
タブアイテムのVisible状態で判断しようかと思ったんだけど
うまくいかず。もっと簡単な方法があるのでは?と思いまして

TCM_GETITEMは情報を取得するものってのは知っていましたが
どんな情報なのか?あと、パラメータの設定が難しそうなので
避けてました。ちゃんと調べて見ます
ありがとう。

ちなみに、C#スレにいたものです^^;
569デフォルトの名無しさん:2007/01/04(木) 17:07:47
>もしかしてC#のスレの人?
>ちなみに、C#スレにいたものです^^;
570デフォルトの名無しさん:2007/01/04(木) 17:59:28
>>568
ハンドルとって何したいの?
571デフォルトの名無しさん:2007/01/04(木) 18:11:20
C#ってWin32 API直接呼べるのか?
別プロセスのリストビューにGETITEM送るには、、>>567が言うとおり、
そのウインドウを所有するプロセスのアドレス空間にメモリを確保しなければならないのだが。
572デフォルトの名無しさん:2007/01/04(木) 18:17:41
>>570
盗んだバイクで走り〜出す〜
573デフォルトの名無しさん:2007/01/04(木) 18:18:44
Marshal.AllocHGlobal/FreeHGlobalでいけない?
574デフォルトの名無しさん:2007/01/04(木) 18:48:29
VirtualAllocEx() でないと無理。 GlobalAlloc の戻りハンドルはプロセス間共有できない
575デフォルトの名無しさん:2007/01/04(木) 18:53:48
>>574
>GlobalAlloc の戻りハンドルはプロセス間共有できない
これ知らずに嵌ったことがあるんだが、何のためにこんな名前になってるん?
576デフォルトの名無しさん:2007/01/04(木) 18:54:57
>>575
Win16時代は共有できてたし、その名残じゃね?
577566:2007/01/04(木) 19:10:34
>>570
選択されているタブ内のcomboboxやtextboxに文字列を送りたいんですけど
選択されているタブのハンドルがわからないと、その子ウィンドウのハンドルもわからないわけで
メッセージも送れないというわけです。
enumwindowなどでtextBoxのハンドル自体は取得できても、それが現在アクティブなタブのものなのかは
わからないので、どうすればいいのかなと。
578デフォルトの名無しさん:2007/01/04(木) 19:22:33
普通のタブコントロールって、
タブページごとのハンドルとかって無いよね?
唯一のタブ HWND Tab を親にして全部乗っけるっていう形で。
579デフォルトの名無しさん:2007/01/04(木) 19:28:34
IsWindowVisibleでしらべりゃいんじゃね?
580デフォルトの名無しさん:2007/01/04(木) 19:46:02
そもそも、よそんちのコントロールに何か書き込むなんて、何か理由があるんだろうから
それが判定のきっかけにならないかねえ
581566:2007/01/04(木) 19:46:33
>>579
それがですね、TCM_SETCURSELで選択しても
見た目は確かにタブは切り替わりますが
実際にはといいますか、visibleにはならないんですよ
visible状態なのは切り替える前のタブのままなんですよね
マウスでクリックしてやればvisibleになりますけど
まだ試してないですが、マウスのクリックイベントを送ってやればいいのかもしれないですけど・・・
やっぱブサイクですよね?
582デフォルトの名無しさん:2007/01/04(木) 20:28:15
カッコイイ!
583デフォルトの名無しさん:2007/01/04(木) 20:56:52
最近、「寄生派遣」という言葉をよく聞くようになりました。
契約終了を切り出されると「切られたら生活できません」などと
泣き落としで契約更新を迫る派遣のことです。
今月初め、半年前に辞めた派遣が出社してきてみんなびっくりしました。
影でコソコソ偉い人に泣きついて再契約したそうです。同じ部署の人には黙って・・・
そんなことまでして自宅の近くの派遣先にこだわって人間として恥ずかしくないのですか。
派遣でスキルアップ、派遣で収入アップとか言うなら一箇所にしがみつかず
複数の会社を渡り歩いてください。
ひとつの会社で派遣向けの単調な仕事をしていたらスキルアップなんてありえないでしょう。
狭いワンルームを電化製品で埋めるために派遣で足りない収入は親にも寄生して、
いつ切られるんじゃないかとビクビクしながら人事権のある人間とだけ仲良くし、
契約終了を通知されれば泣き落とし。悲惨な人生ですね。
氏んだほうがいいんじゃないですか。
584デフォルトの名無しさん:2007/01/04(木) 20:58:34
>>581
Invalidateとか?
585デフォルトの名無しさん:2007/01/04(木) 21:06:04
>>583
で、君の生きてる価値は?
586デフォルトの名無しさん:2007/01/04(木) 21:06:46 BE:569924093-2BP(0)
SendMessage(hwnd566, WM_COOOOOOOOOOOOOOOOOL, COOL_CODE, 0);
587デフォルトの名無しさん:2007/01/04(木) 21:09:29
ああ、SetCurSelはタブしか切り替えないから。
切り替えたあと>>584のようにInvalidateしてだめなら
いったん非表示にして表示させるといいよ
588デフォルトの名無しさん:2007/01/04(木) 21:09:34
すいません、質問させてください。
ウインドウクラス名からそのクラスが既に登録されているかを
調べたいんですが、FindWindowでクラス名だけ指定しても検出できませんでした。
他にうまい方法はないものでしょうか?
589デフォルトの名無しさん:2007/01/04(木) 21:17:06
GetClassInfoExが成功するかどうかを、登録されているかどうかの判断に使用したらどう?
FindWindowだと登録されているけど、そのクラスで1つもウィンドウが作られていない場合にうまくいかないと思う。
590デフォルトの名無しさん:2007/01/04(木) 21:27:20
なるほど、やはりウインドウが作成されていないとダメですか…

> GetClassInfoExが成功するかどうか
この方法で完璧にチェック出来ました。どうもありがとうございます。
591デフォルトの名無しさん:2007/01/04(木) 21:31:51
TCM_SETCURSELじゃなくて、TCM_SETCURFOCUS使えばいんじゃね?
592566:2007/01/04(木) 21:58:45
>>591
>>584
>>587
いろいろありがとう試して見ます
593デフォルトの名無しさん:2007/01/04(木) 23:26:02
指定したUNICODE文字列が数値かどうかを判断するWin32APIってありますか?
その後の_ttoi()がエラーを返してくれないのでチェックをしなくてはならないんです。
よろしくお願いします。
594デフォルトの名無しさん:2007/01/04(木) 23:28:27
MSDNよく嫁
595デフォルトの名無しさん:2007/01/04(木) 23:40:21
MSDNのどこに書いてあるのかわからないんです・・・。
数値の入っていない文字列に_ttoi()を実行すると0が返されるんですが、数値が0であった場合との区別がつかないので。
的外れな質問かも知れませんがよろしくお願いします。
596デフォルトの名無しさん:2007/01/04(木) 23:50:16
MSDNよく嫁
597デフォルトの名無しさん:2007/01/05(金) 00:01:18
_ttoi()の部分については2回読んだんですが・・・
どこを読めばよいのでしょう?
"入力がこの型の値に変換できない場合の戻り値は、0 (atoi、_atoi64、_wtoi および _wtoi64)"
こう書いてあるので数値が0のときと比較できない気がしたんです・・・
598デフォルトの名無しさん:2007/01/05(金) 00:12:46
無い希ガス。
まぁ全文字iswdigitで調べるだけだから自分で書いても。
599デフォルトの名無しさん:2007/01/05(金) 00:13:27
>>597
あのなぁ、>>594,596は不親切だから俺が結論を出してやるよ。
そんな判定をするAPIは無いってのがMSDNを読んでわからんの?
600デフォルトの名無しさん:2007/01/05(金) 00:18:23
そうですね、やはり的外れな質問すみませんでした。
自分で組むことにします。
601デフォルトの名無しさん:2007/01/05(金) 00:22:23
TrackPopupMenuEx()の使い方がよく判りません
このAPIでポップアップメニューは表示できるのですが…

一般的なアプリケーションだとポップアップメニュー範囲外をクリックする事で
メニュー選択がキャンセルとなりますが、自分で作ったアプリケーションだと
メニューが出っ放しで何か選択しない事には消えてくれない実装にしてしまっています。

範囲外をクリックする事でポップアップメニューを消す動作はどのように実現するのでしょうか
602デフォルトの名無しさん:2007/01/05(金) 00:28:10
603デフォルトの名無しさん:2007/01/05(金) 00:33:04
>>601
通知アイコンでやtってんのかな?
メニュー出すときに、SetForegroundWindow()呼んどけ
604601:2007/01/05(金) 00:47:26
>603
出来ました
マリガトウ

>602
どうせならMSDNの何処を読めばいいのか教えてくれ
605デフォルトの名無しさん:2007/01/05(金) 01:02:37
>>604
ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources/menus/menureference/menufunctions/trackpopupmenu.asp
のRemarks。
TrackPopupMenuも見てみる、という考えが思いつかないようだったらアレだが。
606デフォルトの名無しさん:2007/01/05(金) 01:09:20
MSDN日本語版では注意書き消えてるな
これじゃ仕方ない
607デフォルトの名無しさん:2007/01/05(金) 01:15:30
>>606
酷ぇw
608デフォルトの名無しさん:2007/01/05(金) 01:23:05
>>606
小学生か
それじゃ仕方ない
609デフォルトの名無しさん:2007/01/05(金) 01:30:01
こんな事で笠に着て威張る小学生>>608はカッコヨス
610608:2007/01/05(金) 02:04:35
ふーん
611デフォルトの名無しさん:2007/01/05(金) 03:17:57
>600
なんでtcstolにしなかったの?
612デフォルトの名無しさん:2007/01/05(金) 06:29:45
自作ウィンドウのタイトルバーを掴んでドラッグ(移動)中に
SetWindowPlacementでウィンドウのサイズを変更すると
マウスを止めている間は変更したサイズのままなのに
マウスを動かすと変更前のサイズに戻ってしまいます

これをドラッグ状態を維持できるできないに関わらず
なんとか変更後のサイズを維持する方法はないでしょうか?

SetWindowPlacementをする直前にドラッグ状態から
抜けさせてしまえばいいかなと思ってWM_EXITSIZEMOVE
送ってみたりしましたがダメでした
613デフォルトの名無しさん:2007/01/05(金) 15:35:59
APIで自動でエロゲを攻略してくれるソフト作れますか?
614デフォルトの名無しさん:2007/01/05(金) 15:37:26
作れます。
615デフォルトの名無しさん:2007/01/05(金) 15:59:49
GUIのテストツールとかあるから
そういうの真似れば自動でチャートまで作ってくれるエロゲ攻略ソフトが作れるかも・・・
616デフォルトの名無しさん:2007/01/05(金) 17:06:07
SendMessage(*, WM_USER, *, *);
して
case WM_USER:
SendMessage(*, WM_USER, *, *);
しても無限にSendMessageされないのなんで?
617デフォルトの名無しさん:2007/01/05(金) 17:16:47
>>616
SendMessage(*, WM_USER, *, *);
して
case 0x0400:
SendMessage(*, WM_USER, *, *);

これで動くか?
618デフォルトの名無しさん:2007/01/05(金) 17:40:13
無限ループに陥った
ためしにUINT MsgをWM_LBUTTONUPやWM_KEYDOWNにしたら40回しかループしないん
だけどなんで?
619デフォルトの名無しさん:2007/01/05(金) 17:45:26
メッセージループを通るやつと直接呼ばれるやつの差で、
メッセージキューのサイズが影響してるとか?
620デフォルトの名無しさん:2007/01/05(金) 18:16:15
>>616
> しても無限にSendMessageされないのなんで?
>
>>618
> 無限ループに陥った
621デフォルトの名無しさん:2007/01/05(金) 18:19:27
>>620
622デフォルトの名無しさん:2007/01/05(金) 18:56:41
>>593
> 指定したUNICODE文字列が数値かどうかを判断するWin32APIってありますか?

GetStringTypeA / GetStringTypeW / GetStringTypeEx
ttp://msdn.microsoft.com/library/ja/jpwinui/html/_win32_getstringtypew.asp
ttp://msdn.microsoft.com/library/ja/jpwinui/html/_win32_getstringtypeex.asp
623デフォルトの名無しさん:2007/01/05(金) 19:04:05
つうか、過去ログにもあったな

ttp://pc5.2ch.net/tech/kako/1047/10478/1047819779.html

206 名前:デフォルトの名無しさん :03/03/27 17:03
文字列が数値かどうか判定するAPIってありましたでしょうか?
VBでいうところのIsNumericです。

207 名前:デフォルトの名無しさん :03/03/27 17:16
>>206
GetStringType, GetStringTypeEx かなぁ?

208 名前:デフォルトの名無しさん :03/03/27 17:20
>>206
IsCharAlphaNumeric() && !IsCharAlpha()
ではどうか?
624デフォルトの名無しさん:2007/01/05(金) 20:48:12
PostMessage(hWnd, WM_APP, (WPARAM)new Foo, NULL);
(中略)
case WM_APP: delete (Foo*)wParam;

みたいなメッセージを100万回とかアホみたいに送り付けると
キューからあふれた分はメモリーリークするって事でOKですか?
625デフォルトの名無しさん:2007/01/05(金) 21:02:43
PostMessageの戻り値ってなんだっけ?
626デフォルトの名無しさん:2007/01/05(金) 21:17:14
>>625
成功したか否か
627デフォルトの名無しさん:2007/01/05(金) 21:19:25
>>625
BOOL
628デフォルトの名無しさん:2007/01/05(金) 21:30:45
>>625
つまり

Foo *foo = new Foo();
if (PostMessage(hWnd, WM_APP, (WPARAM)foo, NULL) == FALSE)
  delete foo;

にしろということ?
629デフォルトの名無しさん:2007/01/05(金) 21:51:10
== FALSE
がキモい
630デフォルトの名無しさん:2007/01/05(金) 22:07:55
>>628
PostMessageが成功してもすぐに処理されるわけじゃないから、deleteしちゃいかんでしょ。
631デフォルトの名無しさん:2007/01/05(金) 22:10:07
Win32APIの関数で現在見ている、見ているInternetExplrerのアドレスを取得する
関数があれば関数名を教えてください
やっぱりSocket使わないと無理なのかなぁ?
632デフォルトの名無しさん:2007/01/05(金) 22:19:18
 
633デフォルトの名無しさん:2007/01/05(金) 22:34:54
日本語でおk
634デフォルトの名無しさん:2007/01/05(金) 22:37:49
>>631
現在見ているInternetExplrerのアドレスを取得する為のWin32APIというものは存在しません。
また、Socketを使っても出来ません。
635デフォルトの名無しさん:2007/01/05(金) 22:44:03
>>631
Win32API でとなると面倒
IE、アドレス、DDEとかでググレ
636デフォルトの名無しさん:2007/01/05(金) 22:53:01
637デフォルトの名無しさん:2007/01/05(金) 22:56:52
見ている、見ている
638デフォルトの名無しさん:2007/01/05(金) 23:00:51
アドレスバーのComboboxから取れるんじゃね
639デフォルトの名無しさん:2007/01/05(金) 23:35:50
GetActiveObjectから、なんだかんだを経てIWebBrowser2へのポインタを取得すればいいだけでは?
640デフォルトの名無しさん:2007/01/05(金) 23:59:48
皆様方、新年おめでとうございます。
今年も、Win32APIが健全でありますよう、
願う者でございます。

Win32APIが末永く、Windowsの基礎であるよう、
切に願う者でございます。
641デフォルトの名無しさん:2007/01/06(土) 00:00:49
InternetExplrer2つ立ち上げてる場合の
現在見ている、見ているInternetExplrerのアドレスってどれ?
642デフォルトの名無しさん:2007/01/06(土) 00:15:05
>>639
>>631です
IWebBrowser2でいけそうですね、全然知らなかったのでマネージドかと思ったけど
MSDN見たらアンマネージドでした使えそうです
サンクス
643デフォルトの名無しさん:2007/01/06(土) 00:15:34
視線認識だな。がんばれ。
644デフォルトの名無しさん:2007/01/06(土) 00:20:37
641はグーイを作ろうとしている(なつかしっ)
645デフォルトの名無しさん:2007/01/06(土) 01:14:05
ファイル名の文字コードにEUCを使いたいのですが、movefileを使ってもうまくいきませんでした。
具体的には、"やわらか.txt"をEUCコードの文字列にすると「A4 E4 A4 EF A4 E9 A4 AB 2E 74 78 74 00」となるのですが
これを引数としてファイル名を変えると、「A4 E4 A4 81 45 E9 A4 AB 2E 74 78 74 00」と一部が勝手に変換されてしまいます。

windowsではEUCコードの文字列をファイル名に用いることは無理なのでしょうか?
646デフォルトの名無しさん:2007/01/06(土) 01:45:26
Vistaのことも考えてUnicodeにしておくのが無難
647デフォルトの名無しさん:2007/01/06(土) 01:47:26
それ、途中でUTFとして扱ってそう。
UTFでEFは確か特別な意味があった予感。
648デフォルトの名無しさん:2007/01/06(土) 01:47:48
ファイルシステムにはunicodeで格納されるんだが
何をやりたいのかがわからん
649デフォルトの名無しさん:2007/01/06(土) 02:00:30
>>645
ワイド文字列に無理矢理 EUC ぶちこんでUNICODE系のAPIを使え。
650デフォルトの名無しさん:2007/01/06(土) 04:31:04
>>645
少なくともNT系のOS(2000とかXPとか)はファイル名を内部的には
Unicodeで持っているから、EUCとか無意味。つーか無理。

95系なら可能かもな。
651デフォルトの名無しさん:2007/01/06(土) 04:46:18
9x系でもIFSレベルではUnicodeで扱われるしVFATの長いファイル名もUnicodeで
記録されるし。
652デフォルトの名無しさん:2007/01/06(土) 15:09:57
>>646-651
ありがとうございます。
どうやら無理そうですね、勉強になりました。
653デフォルトの名無しさん:2007/01/06(土) 15:28:37
ShowWindowでもタスクトレイにアイコン化されたものを
元のサイズに戻せないんだけどどうすればいい?
654デフォルトの名無しさん:2007/01/06(土) 16:02:37
OpenIconじゃね?
655デフォルトの名無しさん:2007/01/06(土) 16:18:19
>>654
それでもうまくいかないです
別のアプリだからかな?
hideになってるフォームが表示されるだけで
実体はアイコン化されたままなので描画されないんです
656デフォルトの名無しさん:2007/01/06(土) 16:24:45
もしかしてDelphiアプリケーションか?
657デフォルトの名無しさん:2007/01/06(土) 16:25:37
タスクトレイじゃ無くてタスクバーじゃないの?
ShowWindowでいいはずだけど、パラメタ間違ってない?
658デフォルトの名無しさん:2007/01/06(土) 16:28:37
元に戻す操作をした時のWM_COMMANDとかをSPY++で調べてみりゃいんじゃね?
659デフォルトの名無しさん:2007/01/06(土) 16:39:04
>>656
そうです

>>657
タスクバーって最小化されてタブ化されているとこですよね?
そうじゃなくて、時計のところのタスクトレイにアイコン化されて
フォームはhideされている状態で、タスクバーにはタブ化されてません

>>658
それもやってみていたんです。
アイコン化されたものをクリックして元に戻したりしてみたんですが
wm_commandは送られてません
syscommandで元に戻すようにしてみたり
wm_activeしてみたりいろいろしたんですけど
660デフォルトの名無しさん:2007/01/06(土) 16:41:01
Delphiは隠しウィンドウがあるからごにょごにょ
661デフォルトの名無しさん:2007/01/06(土) 16:42:56
>>659
Delphiのウィンドウは透明のアプリケーションウィンドウの子ウィンドウだから、そっちにもメッセージ送らんといかん
662デフォルトの名無しさん:2007/01/06(土) 16:56:10
>>660
>>661
ありがとう
delphiは特殊だったんですね
調べて見ます
663デフォルトの名無しさん:2007/01/06(土) 17:24:53
つーかタスクトレイは最小化したウィンドウじゃないぜ?
なんか勘違いしてないか。
まあ通知用に非表示のウィンドウを1つ持たせるのが普通だけど
そういう決まりがあるわけじゃなし
664659:2007/01/06(土) 17:42:09
TApplicaitonってものだったんですね
この数日ずっと調べてたのにSW_Restoreであっさりいけました^^;
感謝感激

>>663
アイコンはアイコンで別で構造体を定義したものを追加してるだけなんですよね
で、メインフォームはHIDEされていると。
でも、非表示ウィンドウをメインフォームとは別に用意している場合があるってのが
知らなくて苦労しました
665デフォルトの名無しさん:2007/01/06(土) 18:18:21
分からない事があったので、質問させてもらいます。
ttp://www14.big.or.jp/~ken1/tech/tech9.html
void Blit(HDC from,HDC to,int x,int y,int width,int height,int fromx,int fromy,COLORREF tran)
:
mmono=CreateCompatibleDC(from);
bmono=CreateBitmap(width,height,1,1,NULL);
SelectObject(mmono,bmono);
SetBkColor(from,tran);
BitBlt(mmono,0,0,width,height,from,fromx,fromy,SRCCOPY);
ビットマップmmono作成してこれを表示するプログラムなんですが
640×2880のビットマップをfromyに0から480ずつ足していき、
アニメーションをさせたいのです。
しかし、0の値の時しか表示しません。
Blit(hTzk,hBuf,0,0,640,480,0,btStartY,RGB(255 , 0 , 255));
お願いします。
666デフォルトの名無しさん:2007/01/06(土) 18:27:59
事故解決しますた;
表示するとき作成したビットマップを超えたY領域指定した
スンマセン
667659:2007/01/06(土) 21:28:39
いけたと思ったのにいけてなかった
そのときはアイコン化されてなかったのか?

同じコードでやっても全然反応しない
TApplicationをRestoreするとタスクバーに表示されるだけで
アイコンは残ったまま
メインフォームをrestoreしてもフォームが表示されるだけで
アイコンは残ったまま

何が悪いんだろ
668デフォルトの名無しさん:2007/01/06(土) 21:34:26
>>667
タスクトレイのアイコンはフォームの最小化とは無関係だから。
669デフォルトの名無しさん:2007/01/06(土) 21:36:27
>>667
もともとやってることが邪道

外部から無理やりにリストアされた時にタスクアイコンを消去するように組まれてないんだろ。
670659:2007/01/06(土) 21:57:43
>>668
いやまあ、それはそうなんですけど
取り出さないと機能が戻らないんですよね
フォームが再描画されないってことです

>>669
そういう場合もあるんですか・・
ってなると、タスクトレイのツールバーからアイコン情報取得して
何かしらのイベント送って、正規の手順を踏んだように見せないとだめってことかなぁ・・
671デフォルトの名無しさん:2007/01/06(土) 22:08:49
>>670
そういうことじゃない。
タスクトレイのアイコンはフォームの最小化とは無関係ってのは
フォームをRestoreした時に自動的にトレイアイコンも消えるようにはなってないって事。
トレイアイコンを消すのは自分でやるの。
672デフォルトの名無しさん:2007/01/06(土) 22:23:40
自分で簡単なタスクトレイアプリ作ってみればわかると思うよ
673デフォルトの名無しさん:2007/01/07(日) 00:06:21
自分でタスクトレイアプリを作ったことが一度もないのに
他のアプリのトレイアイコンを操ろうとするなんておこがましいと思わんかね?
674659:2007/01/07(日) 00:27:36
もしかしてこういうことをいいたいんですか?

Shell_NotifyIcon(NIM_DELETE, NID)

アイコンの追加も削除の仕方も知ってるんですけど・・

フォームとアイコンは関係ないとか言ってますけど
そりゃ表示上は別々に機能するでしょうけど
内部で連動してる場合もあるわけで
アイコンを削除したらいいって単純なことじゃないんですけど
675デフォルトの名無しさん:2007/01/07(日) 00:31:17
いや、俺も流石にこれ以上は釣られないぞ
676デフォルトの名無しさん:2007/01/07(日) 00:32:21
>内部で連動してる場合もあるわけで
ありません。完全に別のものです。
677デフォルトの名無しさん:2007/01/07(日) 00:34:43
>>674
OS/Shell/Applicationの管轄がそれぞれどこからどこまでかもう一度勉強しなおしてきてくれ。
678659:2007/01/07(日) 00:39:30
>>676
では、アイコンは勝手に削除されるわけですね?
アプリが終了しようとしまいと関係なく独立しているわけだ。なるほどね

ここでレベルの低い人を相手にしてても仕方がないので
自分で調べますよ
679デフォルトの名無しさん:2007/01/07(日) 00:50:31
>>678
>アプリが終了しようとしまいと
いいえ、フォームとトレイアイコンの関連の話です。
680デフォルトの名無しさん:2007/01/07(日) 00:54:40
アプリが終了したら、プロセスが所有するリソースは基本的にOSが回収するってだけで。
フォームとトレイアイコンの関係とは全く別問題だよね?
681659:2007/01/07(日) 00:58:09
そんな屁理屈みたいなこと言って楽しいわけ?
表示上は別物だって何度も言ってるでしょ
682デフォルトの名無しさん:2007/01/07(日) 00:59:36
もう秋田
683659:2007/01/07(日) 00:59:44
煽りだけは一丁前だけど
全然解答だせないじゃないw
初心者に毛が生えたような知識でえらそうにするなよw
684デフォルトの名無しさん:2007/01/07(日) 00:59:52
MutexとかOSが回収しない物もあったような
685デフォルトの名無しさん:2007/01/07(日) 01:02:59
自分に利が無いと判断した時点でレスは全て無視しとけ
686デフォルトの名無しさん:2007/01/07(日) 01:04:13
>>678
アイコンを管理してるのはシェルだから、アプリケーションが落ちたからといってすぐに消えるわけじゃない。
687659:2007/01/07(日) 01:08:53
どうでもいいけど、アイコン化されたアプリを
元のサイズに戻して、機能も戻す方法は教えてくれないわけ?
688デフォルトの名無しさん:2007/01/07(日) 01:18:52
>687
どっちかってぇとDelphi/BDSスレに行ったほうがいいんじゃまいか?
ただそんな態度じゃ相手にしてもらえないような気もするが。
689デフォルトの名無しさん:2007/01/07(日) 01:23:40
NOTIFYICONDATA とWM_TRAYICONMESSAGEでいけると思うがね。
あとはテメーで調べろ。
690デフォルトの名無しさん:2007/01/07(日) 01:24:28
クリックしたときに送られるWM_COMMANDのIDとかがわからないならクリックのメッセージ送ればいいだろ・・・
691659:2007/01/07(日) 01:29:47
ほんと頭にくるね
こっちはわかり易く現状言ってるのにそれに揚げ足取るなんてな
フォームとアプリとアイコンが別物だってことぐらい知ってるわ

表現上わかり易く伝えるために、フォームは表示されるけど
内部的にはアイコン化された状態だって言ってるのに

「フォームが最小化してアイコンになるわけじゃない」
とかW
>>657
パラメータってなんだよWWパラメータってW
>>658
WM_COMMANDってwwメニュー操作じゃねーんだからなw

>>689
ありがとう
それで調べてみる

>>690
わからないじゃなくて送られてないの
あとさ、クリックイベント送るっつーことは
タスクトレイ、つまりtoolbarに対してグローバルメモリ割り当てて
情報取り出してメッセージ送らなきゃならないわけ
そこまで面倒なことしなくてもいいのか知りたいから質問しただけ
692デフォルトの名無しさん:2007/01/07(日) 01:34:13
さあて>>659が必死になってまいりました
693659:2007/01/07(日) 01:36:10
>>689
つか、それアイコンの構造体じゃねーか
そんなのわかってんだよ
自アプリのアイコンを削除したいわけじゃねーの

>>690
ボタン押すのと同じと思ってないか?
694デフォルトの名無しさん:2007/01/07(日) 01:37:47
つか間違った意見であっても"出してくれる人"に頭下げられない奴はダメな気がする
695デフォルトの名無しさん:2007/01/07(日) 01:40:55
自分でできないで人に頼ってるくせにこいつは何でこんなに偉そうなんだ?wwwwwww
696659:2007/01/07(日) 01:42:03
>>694
間違っていることを伝えられるのも2ちゃんねる
煽りや虚言にお礼言っててどうすんだよ・・

>>695
わからないならだまっとけ
697659:2007/01/07(日) 01:46:27
もう一度言う。自アプリのアイコンを削除したいわけじゃない
698デフォルトの名無しさん:2007/01/07(日) 01:50:20
こいつ最低だな。
現実世界でも、自分の思い通りの回答やらアドバイスしないと罵倒しまくる奴なんだろうな。
699695:2007/01/07(日) 01:50:55
よーしDQNな俺様が解決してやる
用件定義を言え>>655でいいのか?
700デフォルトの名無しさん:2007/01/07(日) 01:51:14
人間として最低。
701695:2007/01/07(日) 01:54:05
概要はタスクバーにあるアイコンを元のサイズに戻したいってわけか
Shell_NotifyIcon(...);
ShowWindow(ウィンドウハンドル, SW_SHOW);
でいいんでね?
702695:2007/01/07(日) 01:54:41
別アプリならハンドルは取得してるはずだよな?な?
703デフォルトの名無しさん:2007/01/07(日) 01:56:46
>ShowWindowでもタスクトレイにアイコン化されたものを
>元のサイズに戻せないんだけどどうすればいい?

って事だろ。
ならば、WINDOWPOSあたりかな。

704659:2007/01/07(日) 01:58:41
>>699
そです。

>>702
取得済みです
でも、そのハンドルが正しいかはわかりません
一応spyでメインフォームだけでなく、関連するフォームの
すべてに対してSW_RESTOREを送ったけれどもだめでした
705695:2007/01/07(日) 02:01:03
タスクトレイを元に戻すのってまず最初にタスクトレイにある対象アイコンを削除してから
表示しないとダメなんじゃなかったっけ?NOTIFYICONDATA構造体で

NOTIFYICONDATA notify;

notify初期化

/* 削除 */
Shell_NotiffyIcon(NIM_DELETE, ¬ify);
ShowWindow(対象ハンドル, SW_SHOW);



でいけるんでね?
706デフォルトの名無しさん:2007/01/07(日) 02:02:57
SPY++等で、対象のアプリがNOTIFYICONDATAのuCallbackMessageとuIDに設定した値を調べて、
対象のアプリのウィンドウに、SendMessageでwParamにuID、
lParamに対象のアプリが元のサイズにもどるマウス操作のメッセージを突っ込めばいいでない?
707659:2007/01/07(日) 02:08:49
>>705
それをやればいけるのはわかっているんですけど
他プロセスのnotifyを取得するには
そうなるとVirtualAllocExでメモリ確保してReadProcessMemoryで
自プロセスメモリにコピーしてとかやらないとだめですよね?
708659:2007/01/07(日) 02:11:42
>>706
私もそれは考えました
ただ、どうもそのメッセージを送っている相手のハンドルが違っているためか
上手く取得できません
アイコンを作成するときに、どのハンドルにそのコールバックmsgを送るか指定しますよね?
つまり、そのハンドルを持っているウィンドウが隠されてたり、わからなかったりすると
うまく取得できないですよね?
709695:2007/01/07(日) 02:11:43
OpenProcessとかでマップすればなんとかならないっけ?
少なくともReadProcessMemoryなんかめんどくさい事は少なくとも俺は絶対やらない(やりたくない)
710デフォルトの名無しさん:2007/01/07(日) 02:17:59
馬鹿が知識もなしにとんちんかんなことをやろうとしてるのがわからんあいのか
711659:2007/01/07(日) 02:19:54
>>706
ちなみにuCallbackMessageとuIDのメッセージを送るのは
何を見ればわかりますか?
WM_APP
WM_ACTIVATEAPP
かなと思ったんですがどうも違うみたい
712659:2007/01/07(日) 02:21:44
>>710
バカの定義は知識がないことですか?
バカがバカと気づいていない、知識があると思い込んでいるのが
バカだと私は思いますよW
バカじゃないなら教えてくださいな
713デフォルトの名無しさん:2007/01/07(日) 02:22:57
ShowWindowでもタスクトレイにアイコン化されたものを
元のサイズに戻せないんだけどどうすればいい?
714デフォルトの名無しさん:2007/01/07(日) 02:23:36
今夜はいつもに増して乳臭い流れだな
715695:2007/01/07(日) 02:23:41
表示させる前提がタスクトレイのアイコン削除だから
頑張って削除できるようにしろとしかいいようがない。おじさん寝るよ
716695:2007/01/07(日) 02:24:45
>>712
後できればcapslockを解除汁
717デフォルトの名無しさん:2007/01/07(日) 02:26:27
バカの定義
バカがバカと気づいていない、知識があると思い込んでいる
718659:2007/01/07(日) 02:27:51
>>715
>>699

>>716
今マクロ記述してたから・・
719659:2007/01/07(日) 02:29:49
>>715
ツールバー内の何番目のアイコンがどのプログラムかなんて
調べれたら、そりゃTB_DELETEで削除はできますけど
どのアイコンがどのプログラムかなんて調べようとしたら大変で・・・

とにかくお休みなさい。
ありがとうございました
720695:2007/01/07(日) 02:31:30
>>718
残念だがおじさん他プロセスのNOTIFYICONDATAの取得
なんてやったことないからわからない。

そうかマクロか。

721デフォルトの名無しさん:2007/01/07(日) 02:50:45
689だが・・・書き忘れた事があって来たんだが・・よくわからん事になってるなぁ。

sleepかませないとうまくいかない事が多いよ。数値はマシンによって違ってくるケースもあるから
そこら辺はてきとーに。漏れは100程度にしてるが。

元の大きさに戻らないって事だろ?
って事はハンドルは取得出来てるって事だよな。
722デフォルトの名無しさん:2007/01/07(日) 02:51:56
>>711
uCallbackMessageはクリックしたときに送られるメッセージの中から推測するしかないだろうね。
そのwParamがuID。lParamにはそのアイコン上のマウスメッセージが入ってる。

WM_MOUSEMOVEって送られてきたっけ
723デフォルトの名無しさん:2007/01/07(日) 02:59:37
すまん途中で書きこんでしまった。

もしWM_MOUSEMOVE飛んでくるなら、タスクトレイ上でマウス動かしまくれば、
lParamにWM_MOUSEMOVEの値(0x0200)で大量にメッセージ来るからわかるはず…

メインウィンドウじゃないウィンドウに通知させてるかもしれないなら、
これでプロセスに属するウィンドウ調べてSPY++で補足とか。
http://www001.upp.so-net.ne.jp/yamashita/product/debug/ww.htm

SPY++って単純にウィンドウの列挙で、どのプロセスかは開かないとわかんなかったよね?
いま、手元にSPY++ないんで見当はずれのこと言ってたらスマソ。
724659:2007/01/07(日) 03:28:28
>>721
フォーム自体は元のサイズに戻るし表示もされるけど
そのアプリが描画する処理をしてくれないんです
たとえば、そのフォームのステータスバーの時間が止まったままになってるとか
で、アイコンを直接クリックすれば、描画が始まるという具合です

sleep?どのsleepの意味ですか?




>>722
監視するのはそのアプリのハンドルでいいんですよね?
タスクトレイのツールバーや、その中のアイコンボタンってことじゃないですよね?
アプリに対してはWM_*MOUSE*関連のものは一切送られてないです
WM_APP AM_ACTIVATEAPPとか、でもこれはアクティブになるウィンドウと
非アクティブに送られるものだから違うだろうし
あとは描画させるためのWM_ERASEBKGNDやらサイズ変更を促すものやら
SHOWWINDOWも送られてくるけどuIDらしきものがないんです

>>723
> lParamにWM_MOUSEMOVEの値(0x0200)で大量にメッセージ来るからわかるはず…
送られてきてないです
> メインウィンドウじゃないウィンドウに通知させてるかもしれないなら、
> これでプロセスに属するウィンドウ調べてSPY++で補足とか。
> http://www001.upp.so-net.ne.jp/yamashita/product/debug/ww.htm
ありがとう、調べて見ます
> SPY++って単純にウィンドウの列挙で、どのプロセスかは開かないとわかんなかったよね?
私はSPY++じゃなくて、WispectorSpyを使ってます
これはvisibleでない子ウィンドウは表示されないです。
725デフォルトの名無しさん:2007/01/07(日) 03:57:28
本当にここは使えないインターネットですね
726デフォルトの名無しさん:2007/01/07(日) 04:01:40
>>724
オメーそれ対象のアプリがどのタイミングでどのウィンドウに
どのメッセージを受けたときにどうやってタスクトレイから
アイコン消してるかがわからなきゃ一生無理じゃねーか

SPY系のツール使って普通に操作してタスクトレイから復元したときの
メッセージの流れ追うしか解決方法はない
隠しウィンドウが独自メッセージ送ってるかもしれんぞ?
727デフォルトの名無しさん:2007/01/07(日) 04:15:45
>>724
そのアプリ所有のウィンドウね。フォームのウィンドウに通知させてるとは限らないよ。
メッセージはWM_*MOUSE*ではなくて、ユーザ定義のメッセージね。
WM_USER + xxxとかWM_APP + xxxとかなってると思う。
そのlParamにマウスメッセージが入ってる。
ツール上だと、WM_MOUSEMOVEみたいに表記されず単に数値だから注意。


WM_MOUSEMOVE飛んでくるようだから、
WinspectorSpyのProcessタブから、そのアプリのウィンドウ全部監視して、
タスクトレイのアイコン上でマウス動かせばわかると思うよ。
(クリックして元に戻すと、いろんなメッセージ飛ぶから戻さないこと)
728659:2007/01/07(日) 04:43:44
>>727
どうも参考になります
processタブ開いたことなかったけど、こっちのが使い易いですね
調べて見ます
ありがとう
729659:2007/01/07(日) 05:41:02
>>727
言われたとおりやってみたらばっちしでした^^
メッセージを送っているウィンドウは別にありまして
それを監視したらちゃんともとのサイズに戻りました
ほんとにありがとう
730デフォルトの名無しさん:2007/01/07(日) 08:09:49
さあここで一番最初のレスを振り返ってみよう
>>660-661
731デフォルトの名無しさん:2007/01/07(日) 09:08:42
親切に教えるからつけあがるんだ
732デフォルトの名無しさん:2007/01/07(日) 09:11:50
やさしいお兄さんお姉さんが答えてくれる かも
733デフォルトの名無しさん:2007/01/07(日) 09:27:50
かわいい妹かもしれん
734デフォルトの名無しさん:2007/01/07(日) 10:36:34
>>730
ナイスつっこみ!!!
735659:2007/01/07(日) 11:02:33
終わったんで風俗逝ってきまつ
736デフォルトの名無しさん:2007/01/07(日) 11:02:42
本当に本当に本当にこのスレは馬鹿豚どもの集まりだなwww
恥ずかしすぎて見てられないwwwww
737デフォルトの名無しさん:2007/01/07(日) 11:05:20
>>736
キモイよ。
738デフォルトの名無しさん:2007/01/07(日) 11:34:10
教えてください
UNIXのメッセージに相当するWinAPIは名前付パイプであっているでしょうか?
739デフォルトの名無しさん:2007/01/07(日) 12:03:13
いいえ、名つきパイプはメッセージではありません。
740デフォルトの名無しさん:2007/01/07(日) 13:09:57
>>729
何に何をしたら思ったとおりにうごいたのん? そして、どこにつまづいたといった反省点は?
同じ道を歩むかもしれない人の為に、詳しく報告すべきじゃない?
質問したからにはどう解決したのかちゃんと書こうよ。これだけ引っ掻き回したんだしさ。
741デフォルトの名無しさん:2007/01/07(日) 13:25:31
まあ、待て
今ソープ中だ
742デフォルトの名無しさん:2007/01/07(日) 14:14:57
特定のアプリに対してだけ何かしたかったんじゃないのかね
これに汎用性のある手段は無いからな。
だったらそう書けばいいのに。

最近、単純な質問をして後から別プロセスだと情報小出しにするやつが多いが同じ人なのかね?
743デフォルトの名無しさん:2007/01/07(日) 14:20:14
同じ人種なのは確かだ
744デフォルトの名無しさん:2007/01/07(日) 15:42:24
スレ違いかもしれんがSFU使ってるやつっているか?
745デフォルトの名無しさん:2007/01/07(日) 16:17:17
「かも」じゃない。
746デフォルトの名無しさん:2007/01/07(日) 16:25:05
かと言ってUnix板とも違うし、
より妥当なところがあるなら案内してもらえるとありがたい。

で、SFU上では通常のWindows APIを呼ぶことってできるの?
747デフォルトの名無しさん:2007/01/07(日) 16:30:13
普通にコンソールアプリとかWSHのスクリプト作って呼ぶだけじゃだめなの?
748デフォルトの名無しさん:2007/01/07(日) 16:37:00
一般的にWM_PAINTメッセージでペイント描画を行うときに、何ms以内に処理を終えれば、もっさり感がないでしょうか??
もちろん、アプリケーションの種類によりますが、Notepadもどきのようなものを作っております。
よって、スクロールバーによるスクロールができればいいなと思っています。
まだ、実装していないのですが、スクロール時にWM_PAINTでの描画にもたつき、
スクロールがカクカクになるの嫌だなぁと思って、最大でも何ms以内に処理を終える目標を立てればいいのかなぁ考えています。

749デフォルトの名無しさん:2007/01/07(日) 16:55:07
そんなもん実装する前から悩まんでもいいよ。
完成した後で、もっさりが問題になってからチューニングすればいい話だし。
そもそも応答時間なんて環境依存なんだから、目標なんて設定しようがない。
750デフォルトの名無しさん:2007/01/07(日) 18:13:37
俺なら設計の段階で軽くテストしてモッサリ感がなさそうなのを確認してから作る。
設計ミス > 一応完成 > チューニング > 絶望ってのが一番凹む。
751デフォルトの名無しさん:2007/01/07(日) 18:25:07
ダブルバッファリングして遅かったら描画処理の部分を疑う程度しかやらねぇ
752659:2007/01/07(日) 19:08:43
>>740
動画エンコ用のソフトを複数使っているので
その一連の作業を自アプリだけで行おうとしたのが目的です
別々に開いたり閉じたりするのも面倒なので
複数のアプリをボタンひとつで画面に整列させてやりたかったわけです

解決方法は怪しいフォームのプロセスを監視状態にして
タスクトレイのアイコンの上にマウスポインタを移動させて
MOVEイベントが送られているフォームを見つけて
アイコンをマウスクリックで元に戻し
そのときに出てきたWM_USERのパラメータで
SENDMESSAGEを送ってやった次第です

反省点はフォームに直接ShowWindowメッセージを送れば
アイコンが元に戻ると思い込んでたのが間違いでした
すべてのフォームにrestoreメッセージを送っても反応がなかったので
頭から省いてしまっていたわけです

実際にはクリックされたというメッセージを送らなければ
アイコン削除処理をしてくれなかったわけです

どうもありがとうございました
753デフォルトの名無しさん:2007/01/07(日) 19:15:47
気持ちよかった?
754デフォルトの名無しさん:2007/01/07(日) 19:24:27
>>748です。わかりました。とりあえず、実装してみます。
今の実装では、WM_PAINT時にExtTextOutを何度も呼び出すつもりですが、ちょっとExtTextOutだけの
テストアプリを作り、試しに1000回呼び出す時間を計測したところ、それだけで50ms近くかかってたので、
うほぉ。っと思ってました。表示するテキストの内容にもよりますが、超最悪1万回とかいったらどうしよう
とか考えてた次第です。もちろん、ExtTextOutでの描画をまとめるのが筋ですが、
それをやると、ある問題が発生するので、どうぴよー。と思ってました。
とりあえず、先に実装してみます。
755デフォルトの名無しさん:2007/01/07(日) 19:35:54
うほぉ。
どうぴよー。
756デフォルトの名無しさん:2007/01/07(日) 19:40:13
仕事中ってそういう意味不明なワードが口を付くから困る
757デフォルトの名無しさん:2007/01/07(日) 19:44:49
あん

 どゥ

トろワ?
758デフォルトの名無しさん:2007/01/07(日) 19:59:42
カトル!
759デフォルトの名無しさん:2007/01/07(日) 20:06:49
やかん?
760デフォルトの名無しさん:2007/01/07(日) 20:22:17
>>757-759
warata
761デフォルトの名無しさん:2007/01/07(日) 21:28:16
>>746
サブシステムが違うので無理です。POSIX APIとネイティブAPIしか呼べない。
ネイティブAPIもWin32サブシステムでの動作を前提にしてると
思わぬ落とし穴にはまるかもしれない
762746:2007/01/07(日) 21:31:47
>>761
thx
763デフォルトの名無しさん:2007/01/07(日) 21:34:58
>>754
速いテキストエディタを作った事のある俺が答えてやろう。
Unicodeを使え。文字列を描画する場合は、1文字ずつではなく極力まとめて描画しろ。
メモリの確保破棄は発生しないように設計する。
文字幅の計算系のAPIはとても遅いので、自前で位置を計算する場合は取得結果をキャッシュする。
オフスクリーン(ビットマップ)に描画イメージを作成してから、ディスプレイに転送するとフリッカーが発生せずにさらに速い。
文字入力したときなどは変化した部分だけ描画。とにかく更新の必要のない部分は描画を行わない。

まあ、基本だね。
764デフォルトの名無しさん:2007/01/07(日) 22:38:50
HRESULTの値ってどう意味を持つのですか?
それとHRESULTが含まれるコードによくS_OKとかくっついてることが多いのだけど
BOOL値のTRUEような感じなんですかね?
ざっくりとでいいですから解説オナガイシマス
765デフォルトの名無しさん:2007/01/07(日) 23:32:09
ファイラーなどで、ファイルの一覧をListViewで表示しているものがありますが、
さらにファイルを右クリックすると、エクスプローラのコンテキストメニューが出てくる
ようになってるソフトがありますが、あれはどのようにして実現しているのでしょうか?
766デフォルトの名無しさん:2007/01/07(日) 23:33:06
ちなみに、「ファイラー」というのはWindows非標準のファイル管理ソフトやアーカイバのことを指したつもりです。
767デフォルトの名無しさん:2007/01/07(日) 23:49:03
>>764
関数の成功判定をBOOLで返した場合、失敗してもFALSEしか戻せないので
何に失敗したかの情報を戻り値に含められない。

HRESULTはS_OK以上なら成功、S_OK未満なら失敗を表すための型で
何に失敗したかなどを意味する数値が色々defineされている。
HRESULTがS_OK以外にどんな値を返すかは関数次第。

単純に成否判定をしたい場合は
SUCCEEDEDマクロ(成功ならTRUE)かFAILEDマクロ(失敗ならTRUE)を使う。
768デフォルトの名無しさん:2007/01/07(日) 23:51:13
769デフォルトの名無しさん:2007/01/07(日) 23:53:48
あ、ちなみに失敗してもその後の実行に支障がなさそうな場合とかに
「S_OK以上の失敗コード(例えばS_FALSE)」を返してくる場合もあるんで
FAILEDマクロだけで成否判定してると部分的な失敗とかを取りこぼすことがあるんで
どんな値が返ってくるのかちゃんとドキュメント嫁。
770デフォルトの名無しさん:2007/01/07(日) 23:58:44
>>763
>文字幅の計算系のAPIはとても遅いので、
横槍ですまぬが、具体的にはどの関数でしょうか?
すごく・・・興味あります。
771デフォルトの名無しさん:2007/01/08(月) 00:04:35
>>765
Shell API
772デフォルトの名無しさん:2007/01/08(月) 00:05:37
>>764
http://msdn2.microsoft.com/en-us/ms690088.aspx
HRESULTの値はようするに最上位ビットが立っていれば失敗、そうでなければ成功を表す。
あとは予約部分、Microsoft定義かどうか、種類 (FACILITY)、コードの部分に分けられる。
(機会は滅多に無いだろうけど)自分でHRESULT型の定数を作るときにはFACILITYを独自の値にする必要がある。

HRESULT型の定数の名前は、失敗の場合基本的にナントカ_E_カントカという形式だが、一般的なものはE_カントカという形式。
と言っても実際はE_カントカばかり目にする気がする。
(ナントカには種類名が入る: OLE_E_WRONGCOMPOBJとか)
もっともFAILED/SUCEEDEDマクロを主に使うので定数を直に使うこと自体少ないと思う。
成功の場合はS_ナントカ。標準ではS_OK以外にもS_FALSE(メソッドの呼出は成功したけど……)というのがある。

あとHRESULTなどをいじるマクロ。
http://msdn2.microsoft.com/en-us/ms528334.aspx
773デフォルトの名無しさん:2007/01/08(月) 00:09:12
>>770
GDIだとGetCharABCWidths, GDI+ならGdipMeasureString
774デフォルトの名無しさん:2007/01/08(月) 00:28:20
>>772
>自分でHRESULT型の定数を作るときにはFACILITYを独自の値にする必要がある。
勝手に作っちゃダメよ。
>Status codes in facilities other than FACILITY_ITF can be defined only by Microsoft.
775デフォルトの名無しさん:2007/01/08(月) 00:39:37
>>765
>>766
IContextMenu2, IShellFolder.GetUIObjectOfあたりを調べなはれ
776デフォルトの名無しさん:2007/01/08(月) 00:42:54
>>771
>>775
ありがとうございます、その辺を調べてみます。
777デフォルトの名無しさん:2007/01/08(月) 00:51:41
>>763
>>754です。Unicodeでダブルバッファリングはしてます。で、今巨大な横幅のデータを食わせてみたのですが、
やはり、横スクロールしていくと、だんだん、遅くなってきています。
横に5000文字あたりのところでついにはもっさり感が・・
今の実装は毎回横幅を取得してるので、右端の方にいけばいくほど、描画のための呼び出し回数が増えてるっぽいです。
おっしゃる通り、まとめてキャッシュする方向でいきます。今はテキストを強調表示のためパーサーにかけてるのですが、
パース後にキャッシュします。今の段階では描画より、幅の取得に手間取ってるっぽいので、
とりあえず、まとめずにキャッシュしてみます。それでも駄目ならまとめます。
ありがとうございました。





778デフォルトの名無しさん:2007/01/08(月) 00:54:09
画面を3ペインくらいに区切りたいのですが、
何で検索すれば幸せになれますか?
779デフォルトの名無しさん:2007/01/08(月) 00:54:28
nande ムダに 改行が 多いの
780デフォルトの名無しさん:2007/01/08(月) 01:01:30
>>767>>768>>769>>772>>774
>>764です
詳しい解説ありがとう
HRESULTの値の意味は関数が失敗した時の値を詳細に明示するものと理解しましたが
果たして、この関数の使い所はどういう場面でなのだろうかとふと、疑問に思いました
確かにデバッグ時、関数内のどこの処理が上手くいっていないのか等、分かるのは
便利だとは思うのですが、他にはどういう目的や場面で使われるものなのでしょうか?
781デフォルトの名無しさん:2007/01/08(月) 01:02:00
文章を推敲していると、何故か文末に改行が増えるな。
782デフォルトの名無しさん:2007/01/08(月) 01:13:12
>>780
失敗する理由が複数考えられるときは、区別できる値を返さんと、ユーザに通知もできんじゃろうが
783デフォルトの名無しさん:2007/01/08(月) 01:29:39
>>782
>>780です
やっぱりマネージドC++/CLIのtry、catch、throw見たいに例外処理とかエラーを表示するのが目的?
784770:2007/01/08(月) 01:42:31
>>773
さんくすこ
785デフォルトの名無しさん:2007/01/08(月) 04:20:34
>>783
確かにアンマネージドなC/C++より高水準の言語ではたいてい例外にマップされる
786デフォルトの名無しさん:2007/01/08(月) 06:00:30
【ネガティブ派遣根性チェック】

3つ以上、思い当たる点があればアナタの性格はひん曲がっており、ネガティブ負け組人生を歩んでいます。

□偽装派遣先の社員の意見にはたとえ間違っていても反対しない
□偽装派遣先から「いつまでもここで仕事してくださいね」と言われるようになりたい
□自社に仕事を持ち帰れるように言われるとムカつく
□自社で仕事なんてできるわけがない
□派遣/受託の差異を指摘する人間はムカつく
□偽装派遣先には仕事だけでなく自分のプライベートについても指示して欲しい
□自分の月額金額を知らない
□偽装派遣先社員より自分の生涯収入が低いのは当然だ
□偽装派遣先に尻尾を振り、いつまでも一緒に仕事をすることが大切だ
□今のプロジェクトが終わっても同じ偽装派遣先に常駐したい
787デフォルトの名無しさん:2007/01/08(月) 10:02:52
全問正解したのでなにかください
788デフォルトの名無しさん:2007/01/08(月) 10:20:59
つ VisualStudio .NET 2002
789デフォルトの名無しさん:2007/01/08(月) 11:54:33
>>787
早く自分の会社へ帰れ!!
でないと人間腐るぞ!
790デフォルトの名無しさん:2007/01/08(月) 13:09:05
え?えっ…?
何これ?デジャビュ?
791デフォルトの名無しさん:2007/01/08(月) 13:58:21
792デフォルトの名無しさん:2007/01/08(月) 16:33:56
標準のエディットボックスを右クリックして出てくるメニューに
オリジナルのメニュー項目を追加するのってどうやればいいですか?
793デフォルトの名無しさん:2007/01/08(月) 16:53:17
>>777
スクロールはBitBltかScrollWindowExを使用して更新領域を最小限に抑える。この方法で実装しないと遅いよ。
あと画面に表示されている行だけでも、位置情報をキャッシュするようにすれば再計算しなくていいので速くなる。
794デフォルトの名無しさん:2007/01/08(月) 18:27:22
>>777です。
あれから、パーサーで切り出されるトークンをフォントのスタイルと色が同じならある程度にまとめて、
それから幅を取得しにいったら、ついに前回の5000文字の壁を越えて、横方向に1万文字あたりでスクロールさせてももっさり感がなくなりました。
でも、やっぱ、幅を毎回取得してるので2万文字あたりでまたもっさり感が・・・やっぱ、キャッシュするしかなさそうですね。
はぁ。

>スクロールはBitBltかScrollWindowExを使用して更新領域を最小限に抑える。この方法で実装しないと遅いよ。
>あと画面に表示されている行だけでも、位置情報をキャッシュするようにすれば再計算しなくていいので速くなる
ScrollWindowExですか、使った事ありませんでした。スクロール時は毎回画面を再描画してるので。
調べてみます。ありがとうございます。
795デフォルトの名無しさん:2007/01/08(月) 22:52:05
すみません、もしわかる方がいらっしゃったら教えてください。
CreateProcessで起動するプロセスに対して何らかの識別コードを付加したいのですがいい方法はないでしょうか?
例えば自分のプログラムからNotepad.exeを起動したときに、他のプロセスからも自分のプログラムから起動したことを知ることができるようにする「マーク」のようなものをつけたいのです。
起動するプログラムは既にバイナリイメージなのでソースレベルで手は加えられない制約がある状態で起動元のプログラムから何とか「紐付け」をしたいのです。
何か良い方法がありますでしょうか?
796デフォルトの名無しさん:2007/01/08(月) 22:56:54
>>795
イメージなら、バイナリデータの一番最後に文字列加えても問題ない
それで認識すれば?
797デフォルトの名無しさん:2007/01/08(月) 23:01:29
>>796
レス有難うございます。
起動するプログラムは任意に変わるのと、バイナリには手を加えられないのです。
今、考えてる方法は、STARTUP_INFOのReservedメンバに識別する値を入れ、後でPIDからそのプロセスのSTARTUP_INFOを取得して識別できないかとか、
プロセス起動前に環境ブロックに独自の環境変数を設定し、それを起動するプロセスに継承させたあとに、なんらかの方法で目的のプロセスの環境ブロックを読み出す(そうゆうAPIはないのでハッキングする)とかを考えています。
もっとスマートでよい方法がありそうなのですが…
798デフォルトの名無しさん:2007/01/08(月) 23:14:23
>>797
データをテキストに書き込んで、別のプロセスで読み込めばいいだけじゃん
799デフォルトの名無しさん:2007/01/08(月) 23:16:33
DLL injectしてPIDなどでユニークな共有メモリ作成してタグを作ったらどうだろうか
800デフォルトの名無しさん:2007/01/08(月) 23:24:11
>>798
レス有難うございます。
起動元プログラムからデータをファイルやメモリを経由して他のプロセスから読み取る方法ですと、
例えば、もし起動したプログラムが終了してそのPIDが無効になった後に、新たに起動されたプログラムのPIDがユニークになる保証がないため、誤認識してしまう恐れがあります。
>>799
レス有難うございます。
CreateRemoteThreadなどで起動先のプロセス空間にDLLを注入にしてしまえばいいのですが、
識別用の32ビットのコードを知るためだけにDLLを注入するのはやや大変かと思ってすこし腰が引いています
でも、やっぱり起動先プロセスにDLLを打ち込まないと無理そうならやるしかないか…

801デフォルトの名無しさん:2007/01/08(月) 23:36:34
>>797
起動したプログラムの保持と、その終了を監視する第3のプログラムを裏で動かしとけば?
802デフォルトの名無しさん:2007/01/08(月) 23:50:33
>>801
レス有難うございます。ちょっと説明が長くなってもうしわけありません。

実はこの起動元プログラムとは、プロセス群を監視し、プロセスに異常終了した場合に再起動を行うプログラムなのです。
そしてこのプロセス監視プログラムはJobオブジェクトを作成し一連のプロセス群を一括管理していています。

今、問題となっているのは「もしこのプロセス監視プログラムが異常終了してしまった場合」に
プロセス監視プログラムを再立ち上げなおした後に、既に存在しているJobオブジェクト内で動作しているプロセスの一覧をチェックして、
プロセス監視プログラム内の情報と整合性をあわせる必要があるために各プロセスにユニークコードを埋め込んでおきたいのです。

レスを頂いた「その終了を監視する第3のプログラムを動かす」というのは対処方法としてはいいのですが、
もしその第3のプログラムにも異常が発生した場合には全く同じ問題がおきます。
本来、プロセス監視プログラムから起動されたプロセスを一意に識別さえできれば、
解決できる問題なのでその方向で解決したいと考えています。
803デフォルトの名無しさん:2007/01/09(火) 00:28:05
監視プロセスを監視するプロセスを準備したり、2プロセスで監視など、多重化するほうがいいんでない?
804デフォルトの名無しさん:2007/01/09(火) 00:35:44
>>802
>>799の案だけど、DuplicateHandle使えばDLL injectしなくても共有メモリ放り込めるかも。
MSDN読んだだけで試してないけど。
805デフォルトの名無しさん:2007/01/09(火) 00:36:32
オレも監視プロセスを複数にした方がいいと思う
2プロセスなら片方落ちても再起動した後でメッセージとかのプロセス間通信で同期とれるしな
806デフォルトの名無しさん:2007/01/09(火) 00:38:46
複数プレイか!
807デフォルトの名無しさん:2007/01/09(火) 00:44:16
>>803,805
レス有難うございます。
確かに多重化したほうが堅牢でいいのですが、本質的な問題が解決されてないことが気になります。
>>804
参考情報、有難うございます。
DLLを注入する方法は何通りかあるようなので、今後、解決策が見つからないようであれば試したいと思います。
808デフォルトの名無しさん:2007/01/09(火) 03:05:13
>>807
PIDだけじゃ一意であることを保証できないのが問題なら、
プロセスの生成日時とかと併用じゃダメっすかね?

win32的にどう取得するのかわからんけど、
WMIのWin32_ProcessにCreationDateというのがあるみたいだ。
WMIのこともよくわからんけど。。。

まあ、これで理論上完全に保証できるかっていうと無理だけど。
809801:2007/01/09(火) 10:01:10
>>802
(1) 子プロセスを起動
(2) 子プロセスごとのユニークな名前でCreateFile(..,CREATE_NEW,..,FILE_FLAG_DELETE_ON_CLOSE...)
(3) DuplicateHandleで(2)のハンドルを子プロセスに継承
(4) 親側の元ハンドルは閉じる
これで、子プロセスが落ちると自動的にファイルが削除される。
ファイルの置き場所と命名規則を決めておけば、どのプロセスが生きているかわかる。

個人的な感想としては、
>もしその第3のプログラムにも異常が発生した場合には全く同じ問題がおきます。
まで問題となるような状況で”Windowsで(は)大丈夫?”と聞きたくなる。

810デフォルトの名無しさん:2007/01/09(火) 10:32:31
mutex
811デフォルトの名無しさん:2007/01/09(火) 10:41:32
>>809
レスどうも有難うございます。なるほど、これはいいかもしれないです!
今さっきまで、NtQueryInformationProcessで子プロセスのPEBのアドレスを取得し、
子プロセスのメモリ空間から環境ブロックをReadProcessMemoryする方法ができないかを考えていましたが、
FILE_FLAG_DELETE_ON_CLOSEの仕様を確認してよければCreateFileの方法のほうがずっとスマートなのでこちらの方法にしようかと思います。
809さん、本当に有難うございました。
Spec Fixまでまだ時間があるので他の方法も一応検討をしてみます。

>まで問題となるような状況で”Windowsで(は)大丈夫?”と聞きたくなる
色々しがらみがありまして…
フェイルオーバークラスタリングで別マシンでも並行稼動させるのと、
Jobでクォータ管理してOSへダメージが波及しないようにしようかと思います。
812デフォルトの名無しさん:2007/01/09(火) 12:53:40
ち・ちんぽ
813デフォルトの名無しさん:2007/01/09(火) 14:55:09
はじめまして。
僕は今チャットウィンドウを作っていて、
文字を打ち込むためのエディットボックスなどはCreateWindow関数を用いて作りました。
そのため、位置などは、数字を打ち込んで確かめて調整していかなければなりません。

もっと、視覚的にメインウィンドウをレイアウトしたいのですが、
この方法しかないのでしょうか?
親ウィンドウをリソースエディタでダイアログボックスとして作ってもいいのでしょうか?
どなたか返答お願いします。
814デフォルトの名無しさん:2007/01/09(火) 14:57:46
>>813
素直にIDEの付いてる言語にしなさい
815デフォルトの名無しさん:2007/01/09(火) 15:02:24
>>813
>親ウィンドウをリソースエディタでダイアログボックスとして作ってもいいのでしょうか?
それはあなたが作ってるアプリの仕様次第。好きにしたらいい。
816デフォルトの名無しさん:2007/01/09(火) 15:19:31
>>813
最初にきちんときめちゃえばいいじゃん。
817デフォルトの名無しさん:2007/01/09(火) 15:27:55
>>813
初心者はまず見た目から作ろうとするけど
まずは何をするのかを考え
それに必要なデータなどを格納するオブジェクトを宣言し
そして初めて外見を作っていく
こうするとスムーズにプログラミングできる
外見を作りながらやると、後で機能を増やしたいとか
仕様を変更したいとかなると面倒なことになり
また1から作り直すことになる

頭の中だけで考えず、ヘタでもいいので絵に描いたり
何ができるか箇条書きすることを薦める
818デフォルトの名無しさん:2007/01/09(火) 15:31:03
>>813
ダイアログをメインウィンドウにしたアプリケーションを
俗に「ダイアログベースアプリケーション」と言って
Windowsではよく使われる手法。何の問題もないよ。
819デフォルトの名無しさん:2007/01/09(火) 15:42:32
>>813
>そのため、位置などは、数字を打ち込んで確かめて調整していかなければなりません。
フォントが変わると(同じフォントでもOSが変わったりユーザー設定が変わったりすると)正しい
位置が変わる。だからプログラム中で固定値の指定はNG。
面倒だけどGetSystemMetrics()などで取得した値から計算で位置等を決めるように。

ダイアログをメインウィンドウにするのはOK。
820デフォルトの名無しさん:2007/01/09(火) 18:03:28
文字変換で迷って伊いますBSTRの指すアドレスに文字列が入っているんだけど
どのように取り出してMessageBoxで見ることが出来ますか?
教えてくださいオナガイシマス
821デフォルトの名無しさん:2007/01/09(火) 18:04:34
>>813の人気に嫉妬
822デフォルトの名無しさん:2007/01/09(火) 18:04:41
今まで、レジストリ関係のソフトと、
画像処理系と、ゲームしか作ったことがないのですが、
httpを利用して、情報を取得したいと思ってます。
既存のwebページから読み込むということです。
そこら辺の知識は皆無なのですが、何で検索すれば、
大まかな概要と、手順を見つけることができますか。
823デフォルトの名無しさん:2007/01/09(火) 18:05:19
>>821
の嫉妬心に嫉妬
824デフォルトの名無しさん:2007/01/09(火) 18:09:14
>>820
ググれ
825デフォルトの名無しさん:2007/01/09(火) 18:09:35
>>822
開発環境くらい書けボケ
あとスレ違い
826デフォルトの名無しさん:2007/01/09(火) 18:12:56
>>822
RFC2616だな。 ttp://www.studyinghttp.net/
APIスレ というのであれば WinSock
827デフォルトの名無しさん:2007/01/09(火) 18:25:40
>>825
開発環境関係あるんですか。
VC2005EEです。

>>826
ありがとうございます。
828デフォルトの名無しさん:2007/01/09(火) 18:31:03
>>827
環境によって出来合いのものを利用できたりするからな
829デフォルトの名無しさん:2007/01/09(火) 18:37:17
>>820です
3日具具って
BSTR pfoo;
char choge[ 256 ];
::ZeroMemory( choge, 256 );
int n = WideCharToMultiByte( CP_ACP, 0, pfoo, SysStringLen( pfoo ), choge, sizeof( choge ) - 1, 0, 0 );
MessageBox( NULL , ( LPTSTR )pfoo, "Kitty on your lap.", MB_OK | MB_TOPMOST );
このようにしたのですが結果が出ません(何も表示されません)
よろしくお願いします。
830デフォルトの名無しさん:2007/01/09(火) 18:43:27
>>829
なぜpfooをMessageBoxに渡しているのだ?
831デフォルトの名無しさん:2007/01/09(火) 18:45:36
>>822
多分InternetReadFileExとかで用が足りるんだろうけどな
832デフォルトの名無しさん:2007/01/09(火) 18:45:40
BSTR=WideCharだってわかってるなら
MessageBoxW使えばいいだけじゃないのか
833826:2007/01/09(火) 18:48:07
>>831
すまね。 WinINet の存在を知らなかった…
834デフォルトの名無しさん:2007/01/09(火) 18:52:43
>>831
たぶんこれで足ります。
835813です。:2007/01/09(火) 22:33:44
いろいろ言ってくれて助かりました。
ありがとうございます。
836デフォルトの名無しさん:2007/01/09(火) 22:45:42
WinAPI32の初心者です。
リストビューにアイコンを表示したいのですが、
どうもうまくいきません(1日中やってました)
実行しますと、アイコンが表示される場所が空白になっています。
アイコンのサイズもしっかり確認しました。
ソースはこちらです↓

LV_COLUMN lvcol;
LV_ITEM item = {0};
HIMAGELIST hImg;

hList = CreateWindowEx(WS_EX_CLIENTEDGE , WC_LISTVIEW, "",
WS_CHILD | WS_VISIBLE | LVS_REPORT, 400, 50, 140, 300,
hWnd, (HMENU)IDC_EDIT3, hInst, NULL);
//コモンコントロールの初期化
InitCommonControls();
//イメージリストを作成
hImg = ImageList_Create(16 , 16 , ILC_COLOR8, 1 , 1);
//イメージリストにアイコンを追加
ImageList_AddIcon(hImg , LoadIcon(hInst , MAKEINTRESOURCE(IDI_ICON1)));
ListView_SetImageList(hList , hImg , LVSIL_SMALL);
lvcol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT ;
lvcol.fmt = LVCFMT_LEFT;
lvcol.cx = 100;
lvcol.pszText = "Member";
lvcol.iSubItem = 0;
ListView_InsertColumn(hList, 0, &lvcol);
item.mask = LVIF_TEXT | LVIF_IMAGE ;
item.pszText = "dud";
item.iImage = 0;
ListView_InsertItem(hList, &item);
837デフォルトの名無しさん:2007/01/09(火) 23:06:44
>>836
ImageList_AddIconの戻り値はイケてる?
838デフォルトの名無しさん:2007/01/09(火) 23:07:14
>>836

おかしいとこ無いんでそのまんまコピペしたらちゃんと出たぞ?
アイコンの16x16にはちゃんと絵が入ってる?
839デフォルトの名無しさん:2007/01/09(火) 23:07:28
>>820
Win32/64のBSTRは、単にWCHARへのポインタと見なして扱える(ただしその逆は真でない)。
>>832の補足になるが、MessageBoxWは9xにも実装されているので、躊躇せず使える。
840836:2007/01/09(火) 23:15:26
>>837
戻り値は「-1」で失敗してることが分かりました。
でも、なぜ失敗しているんでしょうか??
841デフォルトの名無しさん:2007/01/09(火) 23:18:25
>>840
アイテムを挿入するメモリ領域を確保してないから
842837:2007/01/09(火) 23:20:33
>>840
>>838が真実。
8ビットフォーマットのアイコンがナイんじゃない?
843836:2007/01/09(火) 23:25:51
>>837
僕の今読み込んでるアイコンは16x16の256色です。
ということは、
hImg = ImageList_Create(16 , 16 , ILC_COLOR8, 1 , 1);
↑この部分に問題があるのでしょうか?
844836:2007/01/09(火) 23:28:07
読み込んでるアイコンのプロパティを見たら
ビットの深さが32になっていました。
どうしたらよいでしょうね?
845デフォルトの名無しさん:2007/01/09(火) 23:29:01
>>840
IDI_ICON1のプロパティを確認。
めんどくさかったら、 ILC_COLOR8を
ILC_COLOR16か ILC_COLOR24か ILC_COLOR32か ILC_COLORDDBに変えてみて、
IDI_ICON1が何ビットフォーマットか調べてみる・・・などなど。
846デフォルトの名無しさん:2007/01/09(火) 23:32:06
アイコンのツールは何を?
847836:2007/01/09(火) 23:33:38
>>846
アイコンのツールってなんでしょうか?
VCのリソースエディタで編集してましたが・・・
848デフォルトの名無しさん:2007/01/09(火) 23:35:28
>>847
Visual Studio 2005を使っているのなら、
リソースエディタ上部、メニューより、
[イメージ(I)]→[現在のアイコン イメージタイプ(E)]で16x16、16色を選択。

なければ[新しいイメージ タイプ(W)]で追加。
849836:2007/01/09(火) 23:35:43
ILC_COLOR16か ILC_COLOR24か ILC_COLOR32か ILC_COLORDDB
に変えてみましたが、全部ダメでした。

ImageList_AddIcon(hImg , LoadIcon(hInst , MAKEINTRESOURCE(IDI_ICON1)));
↑ここをデバッグボックスで表示されたら -1 になっています。
やはり、ここで失敗しているようです。
850デフォルトの名無しさん:2007/01/09(火) 23:36:39
VCだったら、アイコン編集でイメージメニューに
現在のアイコンメニューの表示とか
新しいアイコンイメージの追加という項目があるだろ
それいろいろいじってみ
851デフォルトの名無しさん:2007/01/09(火) 23:42:58
ないとは思うが画像ファイルの拡張子を.ico に変えるだけじゃだめだぞ?
(ウソだと思いたいがマジにいたから言っておくんだが)
852836:2007/01/09(火) 23:43:45
やはりダメです(>_<)
どうやっても表示されません・・・。
853836:2007/01/09(火) 23:46:14
>>851
それは大丈夫です!
それから、16x16、16 色 にしっかりしてもダメみたいです・・・
854デフォルトの名無しさん:2007/01/09(火) 23:49:02
おいおい、16色は ILC_COLOR4 だぜ?
855デフォルトの名無しさん:2007/01/09(火) 23:50:05
IDI_ICON1 の宣言ミスとか?
856デフォルトの名無しさん:2007/01/09(火) 23:51:04
ワロスw
857デフォルトの名無しさん:2007/01/09(火) 23:52:33
>>854
おまえあたまいいな
858836:2007/01/09(火) 23:52:44
>>855
それもないようです!
IDI_ICON1 はもうすでにウィンドウのタイトルの方で使っていて
そちらの方ではアイコンが表示されています。

リストビューにだけ表示されません・・
859デフォルトの名無しさん:2007/01/09(火) 23:55:33
HIMAGELIST型のhImgのスコープなどなど
860836:2007/01/09(火) 23:56:25
スコープってなんですか(@_@。
すいません・・・初心者で・・
861デフォルトの名無しさん:2007/01/09(火) 23:56:50
リストビューに表示されないのが問題なんじゃなくて
ImageList_AddIconが失敗するのが問題なんだろう?
GetLastError() の値はどうよ。

アイコン全種類追加してしまえ
862デフォルトの名無しさん:2007/01/10(水) 00:00:00
>>860
これをhInstが宣言されている近くに。
>>836の関数から外に出すの)

static HIMAGELIST hImg = NULL;
863836:2007/01/10(水) 00:06:02
>>862
それでもだめです・・・
ちなみにGetLastError()とは・・・
864デフォルトの名無しさん:2007/01/10(水) 00:06:46
googleを知らないんだろうか
865デフォルトの名無しさん:2007/01/10(水) 00:07:02
866デフォルトの名無しさん:2007/01/10(水) 00:08:01
GetLastError()
簡単に理解したいなら最後に出したエラーコード吐き出しみたいなものと認識してればいい
因みにFormatMessage使えばエラーコードのメッセージ吐き出してくれるよ
867836:2007/01/10(水) 00:09:24
アイコン全種類追加したらできました
ありがとうございました
868デフォルトの名無しさん:2007/01/10(水) 00:10:00
ウィンドウに貼り付けたエディットコントロールが
左右キーのイベントを拾ってくれないバグに悩んでます。
上下を押すと左右に移動するのですが・・・
869デフォルトの名無しさん:2007/01/10(水) 00:11:34
スコープ
変数の寿命みたいなもの
staticで宣言した変数なんかはまさに不死身
static=癌変数と思えばいい
そのほかローカル変数、グローバル変数とかあるけどそれくらい自分で調べよう
870836:2007/01/10(水) 00:11:48
>>ALL
すいませんね。
ご迷惑かけました。
出直してきます。
(できてませんけどw
871デフォルトの名無しさん:2007/01/10(水) 00:13:01
COLOR4 = 4ビット = 16色 なのはわかってるのかなあ
COLOR8 は256色な
872デフォルトの名無しさん:2007/01/10(水) 00:13:01
というか変数スコープもしらないでwindowsプログラムに手を出してるのがすごい
873デフォルトの名無しさん:2007/01/10(水) 00:13:03
>>867
ちゃんと、原因究明しろよw
874デフォルトの名無しさん:2007/01/10(水) 00:14:36
>>854が見事にスルーされてて藁った
875デフォルトの名無しさん:2007/01/10(水) 00:14:47
>>872
いや、スコープって単語が何を意味しているのかを知らないだけかも?
876デフォルトの名無しさん:2007/01/10(水) 00:15:29
僕ハッカー
877デフォルトの名無しさん:2007/01/10(水) 00:19:08
GetLastErrorのFormatMessageぐらい晒してから逝って欲しかったな
878デフォルトの名無しさん:2007/01/10(水) 00:19:48
>>836の人気に嫉妬
879868:2007/01/10(水) 00:30:06
ダイアログ自体を子コントロールとして他のウィンドウに貼り付けるのって良くないかな?
880デフォルトの名無しさん:2007/01/10(水) 01:13:37
>>878の嫉妬心に嫉妬
881デフォルトの名無しさん:2007/01/10(水) 09:49:56
>>879
メッセージの中継をするようになってればいいとおもうけど
882デフォルトの名無しさん:2007/01/10(水) 15:43:23
>>797
もう見ていないと思うけど、STARTUPINFOの予約メンバについて調べてみた。

cbReserved2はlpReserved2の長さを指定している。
なので、lpReserved2に任意のデータ構造体を指定して、
cbReserved2にそのサイズを指定すれば、任意のデータを送れる。

まぁ、将来の仕様変更で使えなくなる可能性はあるが。

>>879
SetParentでそれっぽい事ができそうな気がする。
883デフォルトの名無しさん:2007/01/10(水) 15:46:57
>>879
リソースエディタで チャイルドスタイルにして
CreateDialog(.... 親窓)
は良くやるな。

TABのフォーカス周りをちゃんとしようとすると、IsDialogMessage() 利かさなきゃいけないけど
884882:2007/01/10(水) 16:10:42
うお、URLを忘れてた。
ttp://www.catch22.net/tuts/undoc01.asp

lpReservedは別の用途にあるので、固有のIDを付けるという用途なら
lpReserved2を使った方が良いかと。
885795:2007/01/10(水) 19:51:07
>>884
レス、有難うございます。もしかしたらレスがつくかもと思ってまだ見てました
MSのCランタイムがランタイムでオープンしたファイルハンドルを子プロセスに継承させる情報を伝えるために、
プロセス初期化時にlpReserved2を使って細工をしているなので、このままでは大部分のプログラムで問題が起きそうですね。
とりあえずはcbReserved2を使えば良さそうなのと、ページの最後に説明されているように、
lpReserved2に渡すバッファの先頭をポインタサイズでnullにすることに取り決めておけば使えるようです。

cbReserved2もしくはlpReserved2のいずれを使ってもGetStartupInfoで取得できそうですが、
GetStartupInfoは自プロセスのみに使える方法なので、他のプロセスからSTARTUPINFOを覗くにはPEBをハックして引きづり出すか、
ターゲットのプロセスにDLLを注入してGetStartupInfoを実行させないと取得できないかもしれません。
やっぱりこのあたりに行き着いてしまうようです。

とはいえ、884さん、とても参考になる情報を有難うございました。
886デフォルトの名無しさん:2007/01/10(水) 20:22:12
現在、PrintDlgで選択したプリンタと設定でメタファイルを印刷する処理を作っています。

そこでDEVMODE構造体のdmPaperWidthとdmPaperLengthが
dmOrientationの設定によって入れ替えるプリンタと入れ替えないプリンタがあるのですが、
その入れ替える・入れ替えないを取得する方法はありませんか?

DeviceCapabilitiesでDC_ORIENTATIONを指定すれば
取得できるかと思ったのですがどちらのプリンタも90が帰ってきました。
またdmFieldsも両方でDM_ORIENTATIONが設定されていました。

それと、dmPaperWidth、dmPaperLengthがdmOrientationの設定によって入れ替わらない場合、
メタファイルを90度回転させてから出力する必要があるのですが
それはどのようにすればできますか?

以上2点、ぐぐるヒントでもいいので教えてください。
887886:2007/01/10(水) 20:23:36
現在使用しているソースです。(変数の宣言や初期化は行数節約のために省略しています)

//A4横方向を設定
if(PrintDlg(&printdlg))
{
  pdv = (DEVMODE)GlobalLock(printdlg.hDevMode);

  rect.Bottom = pdv.dmPaperLength; // ※2100と2970のどちらかになる
  rect.Right = pdv.dmPaperWidth;  // ※2970と2100のどちらかになる

  StartDoc(&docinfo);
  StartPage(printdlg.hDC);

  hEMF = GetEnhMetaFile((LPCTSTR)metafile);

  PlayEnhMetaFile(printdlg.hDC, hEMF, &rect);

  DeleteEnhMetaFile(hEMF);

  EndPage(printdlg.hDC);
  EndDoc(printdlg.hDC);

  GlobalUnlock(printdlg.hDevMode);
  GlobalFree(printdlg.hDevMode);
  GlobalFree(printdlg.hDevNames);
}
888デフォルトの名無しさん:2007/01/10(水) 21:25:46
>>887
して、pdv.dmOrientationは調べた?
889デフォルトの名無しさん:2007/01/10(水) 21:26:20
>>886
プリンタでやったことないけど
SetWorldTransformでできないかなー
890デフォルトの名無しさん:2007/01/10(水) 21:38:51
MIDIを再生したいのですが、どうすればいいんでしょうか?
ググってもパッとしたものが見つからなかったもので…
891デフォルトの名無しさん:2007/01/10(水) 21:42:22
ああ、MCIか。スマソ
892デフォルトの名無しさん:2007/01/10(水) 21:58:47
細かい制御がしたいなら
midiOutOpen()して
midiOutShortMsg()とかすれば
ほぼなんでも可能
893デフォルトの名無しさん:2007/01/10(水) 22:03:09
mciならこんな感じかも。
ダメソースだからちゃんと評価する処理にえんこうしてね。

MCI_OPEN_PARMS mciOpenParms;
MCI_STATUS_PARMS mciStatusParms;
MCI_PLAY_PARMS mciPlayParms;


mciOpenParms.lpstrDeviceType = "sequencer";
mciOpenParms.lpstrElementName = ファイル名;
::mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE|MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpenParms);

mciStatusParms.dwItem = MCI_SEQ_STATUS_PORT;
::mciSendCommand(mciOpenParms.wDeviceID, MCI_STATUS,MCI_STATUS_ITEM,(DWORD)(LPVOID)&mciStatusParms);

mciPlayParms.dwCallback = (DWORD)親ウィンドウ;
::mciSendCommand(wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)(LPVOID) &mciPlayParms);

894デフォルトの名無しさん:2007/01/11(木) 00:21:46
コントロールのIDってウィンドウの中でユニークであればOK?
たとえば、WindowAの中にControlB1とControlB2があって、
ControlB2の中にControlCがあるとする。
ControlB1とControlCのコントロールIDが同じだとまずいですか?
895デフォルトの名無しさん:2007/01/11(木) 00:27:28
>>894
同じIDが複数あっても、IDで識別できなくなるだけで仕様的にはかまわない。
アプリ次第。
896デフォルトの名無しさん:2007/01/11(木) 01:00:55
thx。あとコントロールIDの値の範囲って#defineされてましたっけ?
897デフォルトの名無しさん:2007/01/11(木) 01:06:39
うん
898デフォルトの名無しさん:2007/01/11(木) 01:19:24
うう、ぐぐっても出てこないっす。ヘッダ見てもどれだか・・・教えてください。
899デフォルトの名無しさん:2007/01/11(木) 02:19:32
USBハンドセット(HID)のボタン情報を取得したいんですが、情報がなくて困っています。
使っているのはP1-Kというものです。
SetupDiEnumDeviceInterfaces()で見つけてCreateFile()でハンドルを得て、
HidP_GetCaps()で得たサイズでReadFile()してますが、ブロックされて帰って来ません。
同様の方法でジョイスティックのボタン情報は取れるのですが、やり方が間違ってるんでしょうか。
900886:2007/01/11(木) 09:24:03
遅レス失礼、886です。

>>888
dmOrientationを確認しましたが、どちらの場合も正しく設定されていました。
(縦方向ならDMORIENT_PORTRAIT、横方向ならDMORIENT_LANDSCAPE)

>>889
XFORM構造体を上手く設定できれば使えそうですね。ありがとうございました。
901デフォルトの名無しさん:2007/01/11(木) 13:05:46
_____________
|_________−□×|
|L |         |
|I | EDIT     |
|S |         |
|T |         |
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
↑このようなウィンドウを作ったとして、リストボックスとエディットボックスの境界線を
ユーザが移動できるようにするにはどうすればいいのでしょうか
902デフォルトの名無しさん:2007/01/11(木) 13:09:49
境界線をドラッグで移動した分だけListとEditの位置とサイズを変更する。
903デフォルトの名無しさん:2007/01/11(木) 13:10:18
境界線をドラッグしたら、リストボックスとエディットボックスのサイズを調整するようなプログラムを組む。
904デフォルトの名無しさん:2007/01/11(木) 14:08:37
特定の操作をしたとき、
アプリケーションを終了させたいです。

WindowProcedureを自分で作って、MSGの値によって、
PostQuitMessage()を呼ぶ。
メッセージループを GetMessage(...)>0 のとき繰り返すようにする。

のようにしていますが例えば
switch(msg){
case WM_LBUTTONDOWN:
PostQuitMessage(0);
return 0;
}
としても、右ボタンクリックで終了しません。
そこで、ちゃんと実行されているのか確認しようと思って、
switch(msg){
case WM_LBUTTONDOWN:
MessageBox(hWnd, TEXT("test"), TEXT("test"), NULL);
PostQuitMessage(0);
return 0;
}
としたら、1回クリックするとメッセージボックスが表示されて
もう1度クリックすると、メッセージボックスが表示されずに終了しました。

何が起こっているのかわからないので、説明してください。
905デフォルトの名無しさん:2007/01/11(木) 14:14:33
>>901
LISTとEDITの間に幅のちんまい自作コントロールを貼り…
自作コントロール側: ドラッグ処理後、親にドラッグあったことを通達
親:通達をうけて、LIST/自作コントロール/EDIT を再配置
906デフォルトの名無しさん:2007/01/11(木) 14:32:47
>>904
LBUTTONだから左クリックでは?
907デフォルトの名無しさん:2007/01/11(木) 14:40:17
>>906
すいません、文章のミスです。左クリックの間違いです。
908デフォルトの名無しさん:2007/01/11(木) 14:43:54
>>907
だったらそのコードだけではそんな文章のようにはならない。
メッセージボックスが出た場合は、閉じたら即PostQuitなのでそのまま終了する

まああちこちにPostQuitMessage置かないほうがいいと思うけどね。
WM_CLOSE投げとけ。
909デフォルトの名無しさん:2007/01/11(木) 14:48:22
     ∧__∧
    ( ・ω・)   いやどす
    ハ∨/^ヽ
   ノ::[三ノ :.'、
   i)、_;|*く;  ノ
     |!: ::.".T~
     ハ、___|
"""~""""""~"""~"""~"
910デフォルトの名無しさん:2007/01/11(木) 15:11:19
>>909
誰w
>>908
ということは別の何かが原因ってことですか。
WM_CLOSE投げたら、思ったように終了しました。
なんでだろ。
ありがとうございます。
911デフォルトの名無しさん:2007/01/11(木) 16:02:36
>>901
MFCかVCLのソース嫁
912デフォルトの名無しさん:2007/01/11(木) 17:40:02
>>904
たぶん、その問題とは関係ないけど

MSDNそのまま読むと、
GetMessage関数って-1は失敗だけど、それ以外は成功じゃね?

その記述だと、-2以下が帰ってきたらダメな希ガス
(そんな値が帰ってくるかどうかシランがwww)
913デフォルトの名無しさん:2007/01/11(木) 17:44:08
>>912
なら
!= -1 が正解なのか。
でも、MS以外のサンプルだと>0ってのも良く見る。
914デフォルトの名無しさん:2007/01/11(木) 17:51:12
>>913
ちげーだろ、
0のときループから抜ける、-1のときエラー処理、それ以外のときループしなければならないんだから。
915デフォルトの名無しさん:2007/01/11(木) 17:53:15
>>914
さーせん・
916デフォルトの名無しさん:2007/01/11(木) 17:53:56
とりあえず、WM_QUIT を受け取ったら 0 が返るからループ終了。

これだけは外せないベ
917デフォルトの名無しさん:2007/01/11(木) 17:57:34
でも実際エラー処理なんてする?
918デフォルトの名無しさん:2007/01/11(木) 19:02:42
質問です。VC7を使っています。
外部のプロセスのウィンドウに存在する、
SysListView32コントロールの選択状態を変更したく、
以下のマクロを用いて実行してみたのですが、
どうも反応がありません。

ListView_SetItemState(対象ウィンドウ,アイテム番号,LVIS_SELECTED,LVIS_SELECTED);

なおこのマクロは、

LV_ITEM _ms_lvi;\
_ms_lvi.stateMask = mask;\
_ms_lvi.state = data;\
SNDMSG((hwndLV), LVM_SETITEMSTATE, (WPARAM)(i), (LPARAM)(LV_ITEM *)&_ms_lvi);\

のように定義されております。
この原因は、プロセス外のウィンドウに対し、ポインタを用いたメッセージを使用することにあるのでしょうか?
また、リストビューの選択状態を外部から変更できる、別の正しい方法があるのでしょうか?
ご教授下さい。
919デフォルトの名無しさん:2007/01/11(木) 19:10:49
>>918
>この原因は、プロセス外のウィンドウに対し、ポインタを用いたメッセージを
>使用することにあるのでしょうか?

その通りじゃね?
920デフォルトの名無しさん:2007/01/11(木) 19:22:38
>>919
ご返事ありがとうございます。
EditのSETTEXT等は上手くいっていたため、違うのではと思っていました。
それでは、このような場合の対処としては、どのようにすればよいか、ご存知でしょうか?
前に検索してみたときは、9x時代の情報でVirtualAllocというのを少し目にした事があるのですが、
今もこれを使うものなのでしょうか?
921デフォルトの名無しさん:2007/01/11(木) 19:32:24
>>920
共有メモリにすればいいんじゃね?
922デフォルトの名無しさん:2007/01/11(木) 19:36:22
>920
NTではVirtualAllocEx、9xではメモリマップドファイルを使う。
ttp://techtips.belution.com/ja/vc/0001/
923デフォルトの名無しさん:2007/01/11(木) 20:03:14
>>921-922
ありがとうございます。
リンク先のサンプルソースを改変して、無事希望の動作が出来るようになりました。
VirtualAllocExを使用する方法、初めは面倒くさそうに思っていたのですが、意外と簡単に出来て良かったです。

1.ウィンドウハンドルから、対象のプロセスの仮想メモリ読み書き可能なハンドルを得る
2.自プロセスと対象プロセスで共有メモリを作成
3.ローカルの共有メモリを好きなように書き換え、
 WriteProcessMemoryでグローバルな共有メモリに上書き
4.SendMessageで共有メモリを使用する
5.解放

このような動きですよね。
今回非常に助かりました。ご助言や適切な参考リンクに感謝いたします。
本当に、ありがとうございました。
924デフォルトの名無しさん:2007/01/11(木) 20:26:13
>>922
繋がらないです。
925デフォルトの名無しさん:2007/01/11(木) 20:27:39
>>924
ふーん
926デフォルトの名無しさん:2007/01/11(木) 21:05:41
http://wisdom.sakura.ne.jp/system/winapi/win32/win22.html

ここを参考に画像を描画するプログラムを作りたくて、画像ファイルを別の関数で読み込んだんですが、
どのタイミングで読み込みの関数を呼び出せばいいのかわかりません。
927デフォルトの名無しさん:2007/01/11(木) 21:22:18
>>926
メニューハンドラから呼んで読み込むんでないの?
読んだらビットマップにしておいて、WM_PAINTでBitBlt()すればいいと思うよ。
もちろん、あなたのプログラムの構造によっていろいろやりかたもあるだろうけど
928デフォルトの名無しさん:2007/01/11(木) 22:48:13
>>882
> まぁ、将来の仕様変更で使えなくなる可能性はあるが。
CRTが使ってるからそのCRTがサポートされる限りは大丈夫だと思うけど
アプリが勝手に使えないという結論に変わりはないな
>>885
> lpReserved2に渡すバッファの先頭をポインタサイズでnullにすることに取り決めておけば使えるようです。
これやるとVista x64でおかしくなる可能性があるからやめてくれ
詳しくは12月のCygwin ml参照
929デフォルトの名無しさん:2007/01/11(木) 22:48:15
コンパイラとかのコンソールアプリから、
出力をリダイレクトするにはパイプでよかったよね?
930デフォルトの名無しさん:2007/01/11(木) 23:02:29
>>917
GetMessage のエラー処理は「する」のが基本
931デフォルトの名無しさん:2007/01/11(木) 23:09:40
GetMessageのエラー処理とはreturn -1;しているだけという俺のコード。
932デフォルトの名無しさん:2007/01/12(金) 00:08:06
>>931
正直、それだけで充分。
それをしてないプログラムもあったりするのが現実なんだよ。
933795:2007/01/12(金) 00:34:48
>>928
レスどうもです。
lpReserved2のほうはVista x64で問題がおきる可能性があるのですね。
実はlpReserved2を使うほうは諦めました。
そもそもバッファを用意してその先頭をポインタサイズでnullにする方法はトリッキーすぎるかもしれません。

今のところ、下記の3通りの方法を考えています
@STARTUPINFOの読み出し方法は別途考えることにしてcdReserved2のほうはまだ諦めていません。
Aプロセス初期化時にDLLを注入してプロセスを識別できるように細工する方法も考えています。
B809さんに教えていただいたFILE_FLAG_DELETE_ON_CLOSEでCreateFileの方法も考えています。

どれも一長一短あり、まだ検討中です。もっとスマートな方法があるといいのですが。
934デフォルトの名無しさん:2007/01/12(金) 00:44:31
>802の、ジョブとプロセスの整合性を取る、
というのがよく分からん。ジョブオブジェクトが存続し続けるなら、
そのような整合性を取る必要はないのではないのか?
935795:2007/01/12(金) 00:52:28
>>934
Jobオブジェクトはその中で動作しているプロセス群を列挙する方法や識別する方法がないので、
もしJobオブジェクトを握っているアプリ(プロセス監視プログラム)が異常終了してしまうと、
再起動した際にJobオブジェクトは認識できても、その中で動いていたプロセスであるかはわかりません。
そこでプロセスのどこかにどのJobオブジェクトに属してたのかを識別する方法として何らかの情報を打ち込んでおきたいのです。

もしJobオブジェクトからその中で動いてるプロセス群を識別する方法があれば、
各プロセスに「紐付け」する必要はないのですが…
936デフォルトの名無しさん:2007/01/12(金) 00:55:44
プロセスがpidファイルに書き残すのがいいんだろうけど
死んだときにそのファイルが一緒になくなるとは限らないのが問題なんだよね
937デフォルトの名無しさん:2007/01/12(金) 00:56:57
若いの。オラが村では派遣の問題を口にしちゃなんねーだ
お前さんはまだわけぇから言いたいこともあるべぇ
だべな、派遣問題を口にすると怒る者がおるでよぉ
問題の指摘は駄目だっぺぇ
派遣のことは口にしちゃなんねぇ
この村みたいな田舎で生きていくためにはよぉ
駄目のものを駄目と言ってはなんねえだめさ
938デフォルトの名無しさん:2007/01/12(金) 00:57:47
誤爆乙
939デフォルトの名無しさん:2007/01/12(金) 00:59:16
          ヽ / /⌒\
         /ヽヽ|/⌒\ii|\
       / /ヾゞ///\\|
       |/   |;;;;;;|/ハ \|
             |;;;;//⌒ヽ
             |;/( ^ω^) >>937 おっおっおっ誤爆乙枯ー
.           |{ ∪  ∪
             |;;ヾ.,____,ノ
             |;;; |
             |;;;;;|
             |;;;;;|
940デフォルトの名無しさん:2007/01/12(金) 01:00:48
IsProcessInJob
とか
QueryInformationJobObjectのJobObjectBasicProcessIdList
は何らかの理由で使えない、という話なのかな?
941795:2007/01/12(金) 01:06:12
>>934
FILE_FLAG_DELETE_ON_CLOSEでCreateFileの方法ならプロセスの消滅とともにファイルも消えるので、
ファイル名かファイルにJobとProcessの関係を示す情報をもっておけば良さそうです。

>>940
「QueryInformationJobObjectのJobObjectBasicProcessIdList」!!!!
あれれ、QueryInformationJobObjectの情報問い合わせの系(7種)の中にPIDを列挙するものがありましたっけ!
もしかしたら、これ見落としてたかも… orz
今からよく調べてみます!
942795:2007/01/12(金) 01:16:04
おおお!これはまさに!今まで何を苦労してチェックしてきたんだ… orz

>>940
すばらしい!あなたは神!

もし知っていたらついで教えてください。(おしえてばかりですみません)
プロセスがハングアップしたことを検出する方法はありますか?
タスクマネージャなどで「応答なし」という状態になっているプロセスのことですが、
これを識別する方法はありますでしょうか?

たぶん、メッセージポンプを駆動してるスレッドがブロックされて、メッセージが一定時間ディスパッチされないアプリを見つけるのだろうと思うのです。
またCUIタイプのプロセス(Subsystem=CUI)でGUIでないプロセスがハングアップした場合はメッセージポンプの方法では判別できないと思います。
Windowsはどうやってプロセスがハングアップしたことを認識してるのだろう…
943デフォルトの名無しさん:2007/01/12(金) 01:26:09
単に時間かかってるかどうかだろ
ハングアップじゃなくてしばらく返事しないだけで応答なしになる
944デフォルトの名無しさん:2007/01/12(金) 01:27:04
IsHungAppWindow(HWND)
945デフォルトの名無しさん:2007/01/12(金) 01:29:47
というか、タスクマネージャの応答無しはトップレベルウインドウ限定だからね〜
946795:2007/01/12(金) 01:35:38
>>943
レスどうもです。確かに異常に重い処理をしてるアプリが動いていても「応答なし」となることがあります。
でもこれはメッセージをディスパッチしてないからだと思ってました。

>>944
レス有難うございます。こんな明快なAPIが存在してたなんて…

これでほぼ問題点を解決できました。
レスを下さった皆さん本当に有難うございました。
947デフォルトの名無しさん:2007/01/12(金) 01:36:36
ちゃんと動いてて
実情としてはメッセージループに処理が戻ってこないだけ
っていうときでも応答なし表示されるから

よく分かってないユーザーがそれ見て
そこでプロセスの終了したりして余計状況を悪くするんだお

948デフォルトの名無しさん:2007/01/12(金) 01:36:45
他人の(一般的な・限定しない)コンソールアプリがハングしているかどうかを
見分けるって、チューリングマシンの停止問題に帰着しかねないよな。
ハートビートを定期的に出すような作りにするとか、単にタイムアウトを付けるとか、
アプリの特性にあわせたハング検出ルーチンを用意しないとね。
949デフォルトの名無しさん:2007/01/12(金) 01:44:34
Outlookとか
OutlookExpressとか
M$のアプリにやたらとそれが多いような気がするのは
気のせいではあるまい
950デフォルトの名無しさん:2007/01/12(金) 01:46:33
あと
InternetExplorer とか
Explorer (つまり shell) とか
もうどこが安定した OS なのかと(ry
951デフォルトの名無しさん:2007/01/12(金) 01:47:32
あれ 950 踏んでる・・・
952795:2007/01/12(金) 01:50:37
>>947
レス有難うございます。
確かにメッセージをディスパッチしてるスレッドを止めると応答なしとなることからも
単にスレッドが他の処理をやってて結果として応答なしとなってしまうようです。

>>948
レス有難うございます。
IsHungAppWindowのAPIはウィンドウハンドルをとることからもCUIのプロセスは判別が難しいかなと思いました。
やっぱり、そこまでするならクラスタリング用アプリのようにハートビートでロックしていないことを定期的に示すようにしないと無理そうです。
今回のプロセス監視プログラムは任意のアプリを監視する仕様なので残念ながらクラスタリング用の細工をプログラムにすることはできません。

もしかしたら、CUIアプリのスレッドが全てブロックされた状態になったことを検出してハングアップを検出できるかもしれませんが、
単にWaitしてブロック状態であることも考えられますのでこれもダメそうです。

またループしてた場合などは、ハングアップしたのか処理を継続してるのか判別がつかないので難しいと思います。
仮にデバッガープロセスであればインストラクション実行状況やアドレスを定期的に監視することもできますが、
それでもループ処理なのか無限ループなのかわかりません。
これは八方塞がりだと諦めています。
953デフォルトの名無しさん:2007/01/12(金) 07:43:42
Jobとか使わずに、専用ユーザーつくって、runas ってのはだめなのかな?
と、適当なことを書いとく・・・

どちらにしろ、すげークリティカルな相手みたいで大変だね・・・
954デフォルトの名無しさん:2007/01/12(金) 16:06:28
ハリコの虎見てちんちんおっきおっき


こ の 書 き 込 み を 見 た 人 は 三 年 後 に イ ン ポ に な り ま す 。

イ ン ポ に な っ て オ ナ ニ ー が 出 来 な く な る の が 嫌 な 人 は
こ の 書 き 込 み と 同 じ 文 章 を 三 時 間 以 内 に
違 う ス レ に 五 回 以 上 コ ピ ペ し て く だ さ い 。

五 回 書 き 込 ま な か っ た 男 子 学 生 が
書 き 込み を 見 た 後 三 年 後 に イ ン ポに な り ま し た 。


955デフォルトの名無しさん:2007/01/12(金) 17:55:35
        ∧_∧ n^)   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
       ( ´Д`/ /  <  先生!すでにインポな漏れはどうなるんでしょうか?
      / ,    /     \_________________
        | | , 、 i
 ____| |  | | |__
 ||\   (_/         \
 ||\\            \
 ||  \|| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄||
 ||   || ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄||
     ‖               ||
956デフォルトの名無しさん:2007/01/12(金) 18:40:37
USBデバイスが接続されたときに、
1.0と2.0のどちらで接続されたかどうかを判定したいのですが
そのようなAPIはありますか?
できればSHCNE_DISKEVENTSのタイミングで取りたいのですが。
957デフォルトの名無しさん:2007/01/12(金) 18:54:18
958デフォルトの名無しさん:2007/01/12(金) 18:58:04
SetupDi を使用してハードウェア機器を列挙する方法
http://support.microsoft.com/kb/259695/ja
959デフォルトの名無しさん:2007/01/12(金) 20:21:19
>>958
なつけーソースw
その内容って、2000とXPで動作が異ならない?

確か文字数が・・・
960デフォルトの名無しさん:2007/01/13(土) 21:47:06
大丈夫だよおまえら
2chなくならないから
961デフォルトの名無しさん:2007/01/13(土) 21:51:30
てか、普通にAPI質問箱無くなると困るんだけどなー
962デフォルトの名無しさん:2007/01/14(日) 00:45:10
ム板はないと困る俺は底辺なのかな('A`)

ところで>>970あたりの方はお願いします
963デフォルトの名無しさん:2007/01/14(日) 00:53:02
だがこ、とわる!
964デフォルトの名無しさん:2007/01/14(日) 01:54:57
>>962
少なくともAPI32は情報交換って言う意味で俺には必要('A`)
965デフォルトの名無しさん:2007/01/14(日) 01:58:52
('A`)←しね
966デフォルトの名無しさん:2007/01/14(日) 02:05:50
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
967デフォルトの名無しさん:2007/01/14(日) 02:09:18
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('0`)('0`)('0`)('0`)('0`)('0`)('0`)('A`)
('A`)('A`)('0`)('A`)('A`)('0`)('A`)('A`)('A`)
('A`)('A`)('0`)('0`)('A`)('0`)('A`)('A`)('A`)
('A`)('0`)('A`)('0`)('A`)('0`)('0`)('0`)('A`)
('A`)('0`)('0`)('0`)('A`)('0`)('A`)('A`)('A`)
('0`)('A`)('A`)('0`)('A`)('0`)('A`)('A`)('A`)
('0`)('A`)('0`)('A`)('A`)('0`)('A`)('A`)('0`)
('0`)('A`)('0`)('A`)('A`)('0`)('A`)('A`)('0`)
('A`)('0`)('A`)('A`)('A`)('0`)('A`)('A`)('0`)
('0`)('A`)('A`)('A`)('A`)('A`)('0`)('0`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
968デフォルトの名無しさん:2007/01/14(日) 02:27:05

次スレ

Win32API質問箱 Build49
http://pc10.2ch.net/test/read.cgi/tech/1168708801/
969デフォルトの名無しさん:2007/01/14(日) 02:36:45


>>967は「死」って出るのか
よくやるなぁ
970デフォルトの名無しさん:2007/01/14(日) 03:45:51
>>968が新スレたててくれたから、質問させてもらいます。

CreateProcess()で起動したInternet Explorer(IE1)からjavascriptのwindow.open()で
新しく、別ウィンドウのInternet Explorer(IE2)を開いてるのですが、IE2がアイドル状態に
なるまで自作プログラムの処理を待機させるにはどのようにすればよいでしょうか?
IE2はIE1と別プロセスではなく,同一プロセスの別スレッドで動いている状態です。

呼び出しの関係は↓のようになってます。
自作プログラム(コンソールアプリ) -> CreateProcess() -> IE1 -> window.open() -> IE2
971デフォルトの名無しさん:2007/01/14(日) 10:07:51
while( IE2.Busy ){}
972デフォルトの名無しさん:2007/01/14(日) 10:22:06
_(アンダーバー)の仮想キーコードを教えてください。
何処を調べても出てきません(;´Д`)ハァハァ
973デフォルトの名無しさん:2007/01/14(日) 11:13:20
>>972
アンダーバーってSHIFT+バックスラッシュキーじゃないの?
少なくとも俺のIME+キーボードではそうなんだけど。
バックスラッシュキーならキーコード無しの0xE2
あとGetAsyncKeyStateとか使う場合はこれが何気に便利なんだぜ
ttp://www.vector.co.jp/soft/winnt/util/se074436.html
974デフォルトの名無しさん:2007/01/14(日) 11:17:18
CreateFileMapping使うときに
CreateFileでハンドル取得後
CreateFileMapping使うんですが
処理が終わった後
CloseHandleする時上記のAPIで取得したハンドル
どちらともClose処理しなければならないのでしょうか?
975デフォルトの名無しさん:2007/01/14(日) 11:43:19
>>974
YES。CreateFileは該当のファイルをオープンし、そのハンドルを返します。
つまり、このハンドルは開いたファイルに関する情報の構造体への
ポインタみたいな感じ(実際はちょっと違います)です。
CreateFileMappingはオープンしたファイルに関連付けられた
マッピングオブジェクト(メモリマッピングに必要になる色々な情報)
を作成、纏めてそのハンドルを返します。2つとも全く別物です。
片方が閉じられると連動してもう片方も閉じられるとか、そういう事はありません。

ちなみにメモリマップドファイルの蛇足として、
実際にファイルがメモリ上にロードされるのはMapViewOfFileが実行された時で、
メモリ上のファイルデータが実際のファイルに反映されるのは
UnmapViewOfFileが実行された時です。参考までに。
976970:2007/01/14(日) 11:57:03
970です。
すいません、環境を書くの忘れてました。VC6.0でMFCは使ってません。
Win32APIのみで作成しています。あと、質問内容の書き方も悪かったので、
下に改めて書き直します。

1.自作プログラムからIE1を起動(CreateProcessでHTMLファイルを
  IE1の引数として起動させてます。自作プログラムとIE1は別プロセス)
2.IE1に読み込まれたHTMLファイル内のjavascriptのwindow.openで
  新たにIEのウィンドウ(IE2)を開く(IE1とIE2は同一プロセス)

この状態で、自作プログラムからIE2の状態を監視して,IE2がアイドル状態に
なるまで,自作プログラムの処理を待機させたいのです。

>>971氏の方法はIE1内でwindow.openではなくてCreateObjectを使うってことでしょうか?

長文で申し訳ないですが、よろしくおねがいします。
977デフォルトの名無しさん:2007/01/14(日) 11:59:57
>>975
参考になりました。ありがとうございます。
978デフォルトの名無しさん:2007/01/14(日) 13:37:46
>>973
US配列だとshift+マイナスだったりしないかな
979デフォルトの名無しさん:2007/01/14(日) 13:47:34
>>973
スキャンコードは仮想キーコードからMapVirtualKeyで変換したもの使わないとキーボードドライバによっては不具合出る。(US101ドライバとか)
980デフォルトの名無しさん:2007/01/14(日) 14:45:42
>>973
>>972どえす
おおきにアンダーバー0x2Eでビンゴでした、それからVKどわすれくん、重宝します。
981デフォルトの名無しさん:2007/01/14(日) 15:33:28
埋め
982デフォルトの名無しさん:2007/01/14(日) 21:10:52
983デフォルトの名無しさん:2007/01/14(日) 21:16:51
>>974
ハンドルを2つ管理するのが面倒だったらCreateFileMappingの後で
CreateFileから返ってきたハンドルは閉じてしまってかまわない
984デフォルトの名無しさん:2007/01/14(日) 21:17:01
土里
985デフォルトの名無しさん:2007/01/14(日) 21:20:19
埋める前に次スレ立てろよ…と思ったらもう立ってたのか
http://pc10.2ch.net/test/read.cgi/tech/1168708801/l50
986デフォルトの名無しさん:2007/01/14(日) 21:27:46
十田
/土
987デフォルトの名無しさん:2007/01/14(日) 22:24:13
>>983
それって大丈夫なのか?
988デフォルトの名無しさん:2007/01/14(日) 22:47:02
>>987
大丈夫じゃない。
ttp://msdn2.microsoft.com/en-gb/library/aa366542.aspx
>In addition, the file handle should remain open until the process no longer needs the file mapping object.
989デフォルトの名無しさん:2007/01/14(日) 22:47:20
>>987
ファイルマッピングハンドルは内部的にファイルハンドルへの参照も持つから
大丈夫なことは保証されてる。確かAdvanced Windowsにも出てた
990デフォルトの名無しさん:2007/01/14(日) 22:49:28
>>988
その直前にある分を無視するなよ。排他アクセスを保証したい場合は、だろ。
> To ensure that other processes cannot write to the portion of the file that
> is mapped, you should open the file with exclusive access.
991デフォルトの名無しさん:2007/01/14(日) 23:19:14
結局どっちでもいいんでね?
992デフォルトの名無しさん:2007/01/14(日) 23:46:09
どうせATL::CHandle使うからどうでもいい。
993デフォルトの名無しさん:2007/01/14(日) 23:48:38
うま
994デフォルトの名無しさん:2007/01/14(日) 23:51:23
うま
995デフォルトの名無しさん:2007/01/14(日) 23:53:10
まう
996デフォルトの名無しさん:2007/01/14(日) 23:54:18
997デフォルトの名無しさん:2007/01/14(日) 23:55:06
998デフォルトの名無しさん:2007/01/15(月) 00:02:07
ちんちん
999デフォルトの名無しさん:2007/01/15(月) 00:03:22
かいかい
1000デフォルトの名無しさん:2007/01/15(月) 00:03:41
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。