X



Win32API質問箱 Build123©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net
垢版 |
2016/10/08(土) 12:33:02.29ID:0jaJMPXG
Win32APIについての質問はこちらへどうぞ。

■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。
 英語版( http://msdn.microsoft.com/en-us/library/ )の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで

■過去スレ
Win32API質問箱 Build122
http://echo.2ch.net/test/read.cgi/tech/1451988219/
0529デフォルトの名無しさん
垢版 |
2017/04/04(火) 22:23:58.48ID:u5Wjlvjc
一桁二桁の加減乗除なら良いが、128ビットフルに使う計算だと、紙の幅越えないかなw
0531デフォルトの名無しさん
垢版 |
2017/04/05(水) 01:26:41.60ID:XXr1MGA7
っつーかナニを128ビットにするわけよ?
0536デフォルトの名無しさん
垢版 |
2017/04/05(水) 14:24:34.32ID:+eJqUohN
ここまで漏れの自演
0537デフォルトの名無しさん
垢版 |
2017/04/06(木) 17:46:17.73ID:Wug7VRpa
質問お願いします。
QueryPerformanceFrequency
で得た値は実行ごとに変わったりするから毎回計測しないと駄目ですか?
0539デフォルトの名無しさん
垢版 |
2017/04/06(木) 18:18:16.44ID:Wug7VRpa
QueryPerformanceFrequencyの値がプログラムを終了するまで一定なら
1回しかこれを実行したくないし変わるなら一回時間を計測するごとにこれを実行したいです
0542デフォルトの名無しさん
垢版 |
2017/04/07(金) 22:21:01.99ID:9JlGmFFU
ハイバーネーションみたいなのとかVMとか組み合わさるとどうなるかわかんないけどそういうことになってるね
0544デフォルトの名無しさん
垢版 |
2017/04/08(土) 17:48:41.54ID:C7AQR+Mi
すみません、教えてください。

Borland BCC でC/Cppを勉強しているのですが、
CreateWindow( "EDIT", "あああああ", ....
にすると、あああああ の部分が文字化けして ,,,, と表示されてしまいます。
CreateWindow( "STATIC", "あああああ", ...
だと問題なく表示されます。

どうか教えてください、宜しくお願いします。
0545デフォルトの名無しさん
垢版 |
2017/04/08(土) 22:40:07.71ID:42pK0vcr
>>544
BCCはよくわかんけど、パラメーターが変とかじゃね?あと考えられるのはUNICODEとか?
このコードは RAD Studio10.1 BerlinとVS2015/2017で動くことは確認済み
HINSTANCE hInst;HWND hEdit,hStatic;
HWND hWnd= Handle; // BCBとか用
hInst=GetModuleHandle(0);
hEdit = CreateWindow(TEXT("EDIT") , TEXT("あああ") ,WS_CHILD | WS_VISIBLE | ES_LEFT,0 , 0 , 400 , 20 , hWnd , 0 ,hInst , NULL);
hStatic = CreateWindow(TEXT("STATIC") , TEXT("あああ") ,WS_CHILD | WS_VISIBLE | ES_LEFT ,0 , 20 , 400 , 20 ,hWnd , 0 ,hInst , NULL);
0547544
垢版 |
2017/04/10(月) 07:47:25.26ID:RoCnetHj
すみません、お手数をおかけします。


// あああああ が表示される
CreateWindow( "STATIC",
"あああああ", WS_CHILD | WS_VISIBLE | SS_CENTER,
x, y, w, h,
hGrp1, (HMENU)ID_TEXT1, hInst, NULL );

// あああああ が表示されず ,,,,, となる
CreateWindow( "EDIT",
"あああああ", WS_CHILD | WS_VISIBLE | SS_CENTER,
x, y+50, w, h,
hGrp1, (HMENU)ID_TEXT2, hInst, NULL );

hGrp1 はグループボックスです。
0550デフォルトの名無しさん
垢版 |
2017/04/10(月) 16:45:44.18ID:PH6zMRzh
>>547
マルチバイト文字列が上手くいかないなら"AAAA"のようにシングルバイト文字列で試してみればいいじゃないか。
0552片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2017/04/10(月) 17:25:49.47ID:73IQobxS
SS_CENTERがES_ENDELIPSISとして解釈されたんだろうな。
【今日の教訓】
EDITコントロールには、ES_で始まるスタイルを使え。SS_はEDITには使うな。
0553片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2017/04/10(月) 17:32:00.56ID:73IQobxS
ごめん、ES_ENDELIPSISというスタイルはなかった。SS_CENTERの代わりにES_CENTERを指定すればいい。
0555デフォルトの名無しさん
垢版 |
2017/04/10(月) 21:59:23.57ID:PH6zMRzh
そりゃ特定のコントロールに対するものだからさ。
あとSS_CENTERもES_CENTERも winuser.h で 0x01L と定義されている。

例えば共通の定義 XX_CENTER 0x01L としていた場合、
EDITコントロールの仕様変更でXX_CENTER 0x02L としたくても
STATICコントロールで同じ意義を使っているため変えることが出来ないだろ。
もし定義を変えた場合、STATICコントロールで0x02L というのは別の意味を持っている(かもしれない)ので動作がおかしくなる。
だから意味は同じでも“値”としては別のものとして扱う(定義する)。
0558デフォルトの名無しさん
垢版 |
2017/04/11(火) 07:55:30.63ID:pJyY6xCH
変えたらひどいことになるけどなw
本音と建前みたいなもんでCの欠点だな。後発言語はそういうとこカバーされてる(のもある)
0559デフォルトの名無しさん
垢版 |
2017/04/11(火) 17:52:35.12ID:xC3FSY5Y
モーダルダイアログをメインの親とし、その後動的にサブメニューを表示する仕組みがあります。
サブメニュー表示中も親側の操作を可能とするため、サブメニューはモードレスとしていますが、
TABなどのキー入力が効きません。
辛うじて、初期フォーカスがあるボタンのみスペースキーを受け付けます。
マウス操作は問題ありません。

原因としてはサブメニューのキー処理をする IsDialogMessage を含むメッセージループが必要
なんだろうと思いますが、こういう場合の定石というのはあるのでしょうか?

思い付く実装は以下2パターンです。

その1
親もモードレスとし、親のメッセージループ中にサブメニューのメッセージも処理する仕組みを入れる。

その2
サブメニュー表示後に別スレッドを立ち上げ、そこでサブメニューのメッセージループを回す。


普通はこうだよ。とか他の方法などありましたらお願いします。
0560デフォルトの名無しさん
垢版 |
2017/04/11(火) 17:55:40.75ID:xC3FSY5Y
ちょっと語弊がありましたので訂正です。

ここで言う「サブメニュー」とは、CreateMenu などで作られる一般的に言うメニューではなく、
単なるポップアップスタイルのタイトルなしダイアログのことです。
CreateDialog で画面を作っています。
勝手に言葉を作ってすみません。
0561デフォルトの名無しさん
垢版 |
2017/04/11(火) 18:23:36.29ID:9HH9Hffg
2つウインドウがあって、1つはメインウインドウ、もう1つはメニューウインドウ
メインウインドウにキーフォーカスがあるとメニューウインドウでキー操作できず、メニューウインドウにフォーカスがあるとメインウインドウでキー操作できない
メッセージを適宜流せばいいんじゃないか?
0562デフォルトの名無しさん
垢版 |
2017/04/11(火) 22:23:16.04ID:xC3FSY5Y
フォーカスはそれがあるウィンドウで処理できるようなUIを考えています。
ユーザーがメインウィンドウにフォーカスを(マウスなどで)移せば、
以降はそのウィンドウでキーボード操作ができればいいです。その逆も然り。

適宜メッセージを流すにしても、結局どこでメッセージループを回すかという
話になるのではと思うのですが、違うのでしょうか?
0565デフォルトの名無しさん
垢版 |
2017/04/13(木) 02:45:23.01ID:8XBnDqPS
最近よく足がつる
0566デフォルトの名無しさん
垢版 |
2017/04/13(木) 11:42:08.71ID:9jlRESvt
>>562
フォーカスを移してキーボード操作なんて危険なことを平気でやろうとする人はWin32APIなんて使わない方が良いんじゃね?

普通はフォーカスを移そうとしているオブジェクトにフォーカスを移す移さない関係なく文字列送信するもんじゃないの?

キーボード操作中にユーザーが別のウィンドウをクリックした場合とか考えないの?
0567デフォルトの名無しさん
垢版 |
2017/04/13(木) 13:32:39.75ID:OCOdT3+H
>>562
難しく考えるよりも、例えば、MVCベースで考えて設計したらいいんじゃねーの?
オブジェクト指向で設計するのもいいし、データ処理ありきで設計するのもあり、やりやすいように作ればいいよ。
0571デフォルトの名無しさん
垢版 |
2017/04/14(金) 00:39:04.52ID:6ECgJlCU
Windows 10 Creators Update入れたら
DrawTextで大きめのフォントの描画が異常に遅くなった。
高DPI未対応のアプリは見捨ててGDIはシンプルに動いてほしい。
0573デフォルトの名無しさん
垢版 |
2017/04/14(金) 10:41:54.49ID:7fCdXhh/
>>561
>メッセージを適宜
それが質問内容でしょうよ。

>>566
タブコンに子ウィンドウ貼り付けて画面切り替えやキー入力受付なんて
日常茶飯事なのになにとち狂ったこと言ってるんだよ。

>>572
ほんとそう。
自分の知ってる単語を並べただけだわな。
0575デフォルトの名無しさん
垢版 |
2017/04/14(金) 11:29:24.19ID:iAr+rl+J
win32apiはオンリーワンで現役なので後継ってもんがそもそもなし
.netはラッパーライブラリ、cliは言語仕様
>>574の求めてる物の意味が分からん
UWPでも触ってろと言えばいいのか?
0579デフォルトの名無しさん
垢版 |
2017/04/14(金) 22:27:03.58ID:Gjx6wpyy
ここでWTLがまさかの大復活を遂げるわけよ
0582デフォルトの名無しさん
垢版 |
2017/05/05(金) 00:01:23.37ID:j+7+fM28
Windows10S では Win32/.net アプリは動かないだと。
UWPに変換すれば行けるらしいが、もうおしまいか?
0586デフォルトの名無しさん
垢版 |
2017/05/05(金) 08:12:57.54ID:WdEsZnG0
今回のターゲット層はメインストリームじゃないから
既存のアプリが使えなくても不満は少ないと踏んでるんだろう
まあWindowsRTみたいに核爆死はしないんじゃないか
MSもそんなに数を出荷しないだろうから

もう一度WindowsRTをSurfaceやらに載せることを夢見ているのなら
やはりもう一度爆死するだろう
0587デフォルトの名無しさん
垢版 |
2017/05/05(金) 18:13:03.55ID:ERU+CvkU
教育用途だっけ
今時のキッズは学校支給タブレットの制限外してゲームしてるらしいからその点ではいいかもな
0588片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2017/05/06(土) 18:59:21.43ID:0OTJXmRc
あるプログラムで使用中のGDIオブジェクトの個数を数える方法はありますか?
0595雪風
垢版 |
2017/05/06(土) 21:54:04.69ID:QwsGrGdx
>>593
自演 オナヌーだろ
0598デフォルトの名無しさん
垢版 |
2017/05/07(日) 07:23:08.46ID:fOF53fEF
firefoxとかリーク笑えるよな
0599デフォルトの名無しさん
垢版 |
2017/05/09(火) 09:36:37.30ID:PBqzgUoz
特定のアプリケーションがハング状態になってるかを判断する方法ありませんか?
.netではRespondingプロパティで判断できるようですがwin32apiでやりたいので
0604デフォルトの名無しさん
垢版 |
2017/05/09(火) 21:20:50.87ID:2/UhKD8y
最近のアプリに多い、重い処理は別スレッドで実行してGUIが固まらないようにしてる場合は役に立たないかな
0605デフォルトの名無しさん
垢版 |
2017/05/09(火) 21:48:08.53ID:LCRfM0F6
>>604
それは「重い処理のときにハングアップしているように見える」というだけの話で、
そういうレベルでの意味ならマルチスレッド化によって役には立たない。
でもそういうマルチスレッド化したソフトウェアでも
画面描画の時の不具合などでハングアップすることもあるわけで役に立たないということはないよ。
0606デフォルトの名無しさん
垢版 |
2017/05/09(火) 22:06:52.23ID:2/UhKD8y
>>605
バグでずっと重い処理が終わらない場合を想定してた。ウィンドウメッセージは処理されるものの、事実上のハング。
確かに全く役に立たないわけではないね。
0608デフォルトの名無しさん
垢版 |
2017/05/10(水) 02:35:27.31ID:bnhY1qc6
>>606
動画の変換みたいに純粋に時間がかかる場合とか、ユーザーのクリック待ちとかもあるから、判断はできんだろうな
0611デフォルトの名無しさん
垢版 |
2017/05/14(日) 19:29:07.89ID:QF9yNcvN
まだ見放されてないぞ

【IT】マイクロソフト、サポート切れOS「Windows 8、Windows XP、Windows Server 2003」にも修正ソフト提供

asahi.2ch.net
test/read.cgi/newsplus/1494723803
0612デフォルトの名無しさん
垢版 |
2017/05/19(金) 19:48:39.48ID:7xgwPeWo
質問ささてください
構造体AをGlobalAllocで領域を確保して値を入れた後、構造体BをGlobalAllocで確保すると、構造体Aのメンバであるポインタのアドレスが変わってしまうのですが何が原因なのでしょうか?
0613デフォルトの名無しさん
垢版 |
2017/05/19(金) 20:35:00.88ID:bDipVMhT
あるプロセスのメモリ情報のリージョンサイズや属性を調べるにはどのAPIを使えばいいですか?
0615デフォルトの名無しさん
垢版 |
2017/05/19(金) 21:09:20.04ID:/MnRfLXT
動かしたくないならLockしてください
0617デフォルトの名無しさん
垢版 |
2017/05/19(金) 21:22:03.75ID:Q8L1LGu9
>>612
GMEM_FIXEDを指定していないGlobalAllocでロックカウントが0の場合はメモリの再配置が起きる
GlobalLockとGlobalUnlockの間なら
「構造体Aのメンバであるポインタのアドレス」は変わることがないけど
GlobalUnlockを呼び出しロックを解除した場合は再配置される可能性がある
0618デフォルトの名無しさん
垢版 |
2017/05/20(土) 18:36:33.10ID:urI3JAo7
皆様レスありがとうございます
>>612
構造体BのGlobalAllocをコメントアウトすれば問題なく動くのでこれが原因なのはたぶん間違いないです

>>617
構造体A自体のLockやFIXは試しましたがダメでした。構造体Aは領域確保後にwinAPIに渡して値を格納してもらうのですが格納後にメンバ全ての固定が必要なのでしょうか?


ともあれメモリ再配置が原因なのですね。ありがとうございました。この方向でもう少し試してみます。
0621デフォルトの名無しさん
垢版 |
2017/05/20(土) 19:06:46.68ID:opost44+
>>618
そもそもの使い方が間違っているんじゃないか?

>構造体Aは領域確保後にwinAPIに渡して
そのwinAPIは何?
というかなぜ隠す必要があるのか
0623デフォルトの名無しさん
垢版 |
2017/05/21(日) 02:26:55.08ID:8+aEBKAw
構造体A、もしくはその近くのメモリ確保量が足りていないような気がする
スタック破壊、または、メモリ内容破壊では?
0625デフォルトの名無しさん
垢版 |
2017/05/21(日) 10:40:12.71ID:8IHB32RP
すみません。自分がC++素人でメモリ周り疎いのでよくあるトラブルかなと思い、動作確認できている部分は抽象的に書きました。イージーミスの可能性はかなりあります。
ソースが手元にないのですが、具体的にはこのような処理をしています。スマホから書いたので文法ミスあるかもしれません。

メイン処理
DWOR count=0;
LPBYTE pStructA = (LPBYTE)GlobalAlloc(GHND,sizeof(0));

GetPrinterInfo(pStructA,&count);//自作関数 pStructAに構造体格納

/*ここでブレーク張ってpStructAのpNameのアドレスが正しい文字列指してるのは確認済み*/
PStructB pStructB = (PStructB)GlobalAlloc(GHND,sizeof(StructB)*count);

/*ここで改めてpNameを取得しようとするとpNameのアドレスがpStructBを確保する前と変わっている。元の文字列データは以前として前のアドレス上に存在してることは確認済み。pStructA自体のアドレスは変わっていない
*/
for(i=0 ;i<count;i++){
LPTSTR name= (((PRINTER_INFO_1*)pStructA)+count)->pName;
}
〜〜〜
自作関数 (動作確認済み)
DWORD GetPrinterInfo(LPBYTE pStructA, LPDWORD count){
DWORD result=0;
DWORD pNeeded=0;
//必要サイズ取得
EnumPrinter(PRINTER_ENUM_LOCAL,NULL,1,NULL,pdw
&pNeeded,count);
//必要サイズ再確保
Global ReAlloc(pStructA,pNeeded,GHND);
//ここでPRINTER_INFO_1構造体をpStructAに格納
EnumPrinter(PRINTER_ENUM_LOCAL,NULL,1,pStructA,pdw
pNeeded,count);
return result;
}
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況