Feeds:
文章
留言

Archive for 十一月 21st, 2005

VB6 內附的 API 檢視員,如果你用過就會發現真的很難用,不僅資料短缺而且也不會更新,如果你也有同樣的困擾,建議你可以參觀 ALLAPI.net,該網站裡面有一套 API-Guide 足以取代API檢視員,這套工具不僅API完整而且具有範例和相關API參照,而且網站亦有API的詳細描述。有興趣者去繞繞吧^_^

Read Full Post »

阿發總是給我丟難題,今天的題目是要偵測Windows上任何地方都能夠偵測目前的滑鼠是否被按下,為何有這種需求呢?因為他要做觸控螢幕,需要在每個點選位置上發出聲音,所以必須在系統的任何地方都能夠偵測出滑鼠目前是否被按下。這個問題我聽到之後就想到可以用 hook 來處理,不過實作細節並不太記得,在找了許多的資料之後,終於解開這個問題,其實也沒這麼困難,程式執行畫面如附圖,程式碼如下:
//—————————————————————————
/*
 * 偵測系統的滑鼠事件
 *
 * 設計者:Chui-Wen Chiu (Arick)
 *
 * 開發環境:
 * [1] Windows 2000 Professional + SP4
 * [2] Borland C++ Builder 6.0
 *
 * 參考資料:
 * [1] http://forum.kuanshan.com.tw/read.php?tid=13999
 * [2] LowLevelMouseProc Function, http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/lowlevelmouseproc.asp
 * [3] SetWindowsHookEx Function, http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/setwindowshookex.asp
 * [4] SetWindowsHookEx Function, http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/unhookwindowshookex.asp
 * [5] CallNextHookEx Function, http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/callnexthookex.asp
 * [6] http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/usinghooks.asp
 * [7] Jeffrey Richter, "Windows 應用程式設計開發指南"
 *
 * 開發日誌:
 * 2005.11.21  建立
 */
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "windows.h"
//—————————————————————————
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HHOOK g_hhook;
// 處理攔截的滑鼠事件
LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
   if (nCode < 0)  // do not process the message
      return CallNextHookEx(g_hhook, nCode, wParam, lParam);
      switch(wParam){
         case WM_LBUTTONDOWN:
            Form1->Label1->Caption = "按下滑鼠左鍵";
            break;
         case WM_LBUTTONUP:
            Form1->Label1->Caption = "放開滑鼠左鍵";
            break;
         case WM_MOUSEMOVE:
            Form1->Label1->Caption = "滑鼠移動中";
            break;
         case WM_MOUSEWHEEL:
            Form1->Label1->Caption = "捲動滾輪";
            break;
         case WM_RBUTTONDOWN:
            Form1->Label1->Caption = "按下滑鼠右鍵";
            break;
         case WM_RBUTTONUP:
            Form1->Label1->Caption = "放開滑鼠右鍵";
            break;
      }
   return CallNextHookEx(g_hhook, nCode, wParam, lParam);
}
//—————————————————————————
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
}
//—————————————————————————
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
   // 程式結束的時候釋放攔截
   UnhookWindowsHookEx(g_hhook);
}
//—————————————————————————
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   // 建立滑鼠攔截
   g_hhook = SetWindowsHookEx(
      WH_MOUSE_LL,
      (HOOKPROC) ::LowLevelMouseProc,
      GetModuleHandle (NULL),
      NULL
   );
   // 建立失敗
   if (g_hhook == NULL){
      Application->MessageBoxA("ERROR", "" , 0);
      Application->Terminate();
   }
}


說穿了也不過就是在系統中註冊一個函數(SetWindowsHookEx),這個函數會接收攔截到的滑鼠事件(LowLevelMouseProc)。如果要攔截其他的訊息可以參考 MSDN上關於 hook 的資料。
 

Read Full Post »

上星期技服人員丟了一個問題給我,又是一個我不熟悉的錯誤訊息,這個問題發生是出現在 INSERT 一筆資料的時候,在一堆網路資料中挖到了一篇類似的"http://bugs.mysql.com/bug.php?id=3506"的討論,我最後找出的原因是 INSERT 的資料長度超出合理範圍,超出合理範圍可能的原因是蓄意寫錯,另一個可能的原因是當初規劃沒有考量到資料數量的問題,所以,INSERT 的資料超出欄位規劃的合理範圍,因此當我擴增該資料欄位後就修復該問題。

Read Full Post »